steam遊戲內建商店購買

dav2100發表於2021-09-09

文件地址:

1.伺服器需要訂單資訊:
①使用者資訊

'steamid' => '','language' => '客戶端遊戲語言程式碼 – ISO 639-1 語言程式碼,客戶端遊戲正在使用的語言','currency' => 'SO 4217 貨幣程式碼,對客戶端扣款所使用的幣種'

②訂單資訊

'itemcount' => '購買總數(int)','orderid' => '由您為此次購買指定的唯一的 64 位數字。 此數字也是此次交易的關鍵, 在 Steam 系統中引用該交易時使用(int)','itemid[0]' => '商品id(int)','qty[0]' =>'商品數量(int)','amount[0]' => '商品總價值(單位:分)(int)','description[0]' => '商品描述',

③遊戲資訊

'key' => '網頁 API 金鑰','appid' => '您的 Steam 遊戲的唯一識別符號'

注意事項:
currency欄位由伺服器獲取,orderid由伺服器生成外,其他資訊均由遊戲伺服器提供。
language雖由客戶端提供,但客戶端介面返回的language並不是iso 639-1標準的,轉換如下:(鍵為客戶端使用語言,值為web伺服器使用語言)

private function languages($language)
    {
        $languages = [            'arabic' => 'ar',            'bulgarian' => 'bg',            'schinese' => 'zh-CN',            'tchinese' => 'zh-TW',            'czech' => 'cs',            'danish' => 'da',            'dutch' => 'nl',            'english' => 'en',            'finnish' => 'fi',            'french' => 'fr',            'german' => 'de',            'greek' => 'el',            'hungarian' => 'hu',            'italian' => 'it',            'japanese' => 'ja',            'koreana' => 'ko',            'norwegian' => 'no',            'polish' => 'pl',            'portuguese' => 'pt',            'brazilian' => 'pt-BR',            'romanian' => 'ro',            'russian' => 'ru',            'spanish' => 'es',            'swedish' => 'sv',            'thai' => 'th',            'turkish' => 'tr',            'ukrainian' => 'uk',
        ];        return $languages[$language];
    }

正式地址:$baseUri = '';
測試地址:$basrUriSandBox = '';

curl https

function curl_get_https($url){
    $curl = curl_init(); // 啟動一個CURL會話
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_HEADER, 0);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // 跳過證書檢查
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, true);  // 從證書中檢查SSL加密演算法是否存在
    $tmpInfo = curl_exec($curl);     //返回api的json物件
    //關閉URL請求
    curl_close($curl);    return $tmpInfo;    //返回json物件}function curl_post_https($url,$data){ // 模擬提交資料函式
    $curl = curl_init(); // 啟動一個CURL會話
    curl_setopt($curl, CURLOPT_URL, $url); // 要訪問的地址
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 對認證證書來源的檢查
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1); // 從證書中檢查SSL加密演算法是否存在
    curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); // 模擬使用者使用的瀏覽器
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); // 使用自動跳轉
    curl_setopt($curl, CURLOPT_AUTOREFERER, 1); // 自動設定Referer
    curl_setopt($curl, CURLOPT_POST, 1); // 傳送一個常規的Post請求
    curl_setopt($curl, CURLOPT_POSTFIELDS, $data); // Post提交的資料包
    curl_setopt($curl, CURLOPT_TIMEOUT, 30); // 設定超時限制防止死迴圈
    curl_setopt($curl, CURLOPT_HEADER, 0); // 顯示返回的Header區域內容
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 獲取的資訊以檔案流的形式返回
    $tmpInfo = curl_exec($curl); // 執行操作
    if (curl_errno($curl)) {        echo 'Errno'.curl_error($curl);//捕抓異常
    }
    curl_close($curl); // 關閉CURL會話
    return $tmpInfo; // 返回資料,json格式}

①獲取使用者currency:

private function getSteamUserInfo($steamId)
    {        //GET GetUserInfo/v2/
        $steamInfoUrl = $this->baseUri . 'GetUserInfo/v2/?key=%s&steamid=%s';
        $url = sprintf($steamInfoUrl, $this->apiKey, $steamId);

        $response = curl_post_https($url);
        $json = json_decode($response, true);        if ($json['response']['result'] == 'Failure') {
            Log::info('steam_user_info', $json);            throw new Exception('Steam Response Error');
        }        return $json['response']['params'];
    }

②向steam發起購買:

public function initOrder(Request $request)
    {
        $attributes = $request->only([            'steamid', 'appid', 'language', 'itemid'
        ]);
       
        $userInfo = $this->getSteamUserInfo($attributes['steamid']);
        $attributes['currency'] = $userInfo['currency'];        
         //生成唯一訂單號
        $order = SteamOrders::query()->orderByDesc('created_at')->first(['orderid']);
        $attributes['orderid'] = $order ? $order->orderid + 1 : 10000000;

        $goods = $this->goods($attributes['itemid']);         //訂單資訊
        $data = [            'key' => $this->apiKey,            'steamid' => $attributes['steamid'],            'appid' => $attributes['appid'],            'language' => $this->languages($attributes['language']),            'itemcount' => 1,            'orderid' => (int)$attributes['orderid'],            'currency' => $attributes['currency'],            'itemid[0]' => $goods['itemid'],            'qty[0]' => 1,//(int)$attributes['qty'],
            'amount[0]' => $goods['amount'],            'description[0]' => $goods['description'],
        ];        //POST InitTxn/v3/
        $initTxnUrl = $this->baseUri . 'InitTxn/v3/';
        $response = $this->curlPostHttps($initTxnUrl, $data);       
        $result = json_decode($response, true);
        $result = $result['response'];        if ($result['result'] == 'Failure') {
            Log::info('steam_init_order', $result);            return ['code' => 500, 'message' => 'Steam Response Error'];
        }

        $attributes['amount'] = $goods['amount'];
        $attributes['description'] = $goods['description'];
        SteamOrders::create($attributes);        return [            'code' => 0,            'data' => [                'orderid' => $attributes['orderid'],                'appid' => $attributes['appid']
            ]
        ];
    }

③完成訂單:

public function finishOrder(Request $request)
    {
        $userId = '';

        $attributes = $request->only(['appid', 'orderid']);
        $attributes['key'] = $this->apiKey;        //POST FinalizeTxn/v2/
        $finishTxnUrl = $this->baseUri . 'FinalizeTxn/v2/';        //$response = $this->client->post($initTxnUrl, ['form_params' => $attributes, 'verify' => false]);
        $response = $this->curlPostHttps($finishTxnUrl, $attributes);
        $result = json_decode($response, true);
        $result = $result['response'];        if ($result['result'] == 'Failure') {
            Log::info('steam_finish_order', $result);            return ['code' => 500, 'message' => 'Steam Response Error'];
        }

        $order = SteamOrders::query()->where('orderid', $attributes['orderid'])->first();
        $itemId = $order->itemid;

        $result = $this->sendUserGoods($userId, $itemId);
        $status = 2;        if ($result) {
            $status = 3;
        }

        $order->user_id = $userId;
        $order->transid = $result['params']['transid'];
        $order->pay_state = $status;
        $order->save();        return ['code' => 0];
    }

後記:資料庫設計

Schema::create('steam_orders', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('user_id')->nullable();
            $table->integer('orderid');
            $table->integer('transid')->nullable()->comment('steam交易id');
            $table->integer('steamid');
            $table->string('currency')->comment('貨幣型別');
            $table->string('appid');
            $table->string('language');
            $table->string('itemid', 50)->comment('商品id');
            $table->tinyInteger('qty')->default(1)->comment('購買數量');
            $table->bigInteger('amount')->default(0)->comment('總價:分');
            $table->string('description', 255)->comment('商品描述');
            $table->tinyInteger('pay_state')->default(1)->comment('交易狀態:1未支付,2支付完成,3已發貨');
            $table->timestamps();
        });



作者:愛餘生sb
連結:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4479/viewspace-2805327/,如需轉載,請註明出處,否則將追究法律責任。

相關文章