steam遊戲內建商店購買
文件地址:
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 玩家是如何在Steam上購買遊戲的? 玩家購買遊戲決策過程實錄遊戲
- Steam遊戲營銷:促銷期間使用者是怎樣購買遊戲的?遊戲
- steam點數有什麼用 steam購買遊戲獲得的點數能幹嘛遊戲
- SuperData:2018年PC端遊戲總收入遊戲內購買內容佔比達85%遊戲
- Psyonix 宣佈《火箭聯盟》將在Epic 遊戲商店免費推出,Steam停止新玩家購入遊戲
- 既氪又肝,買斷制遊戲做好內購真有那麼難?遊戲
- 遊戲社會學研究:為什麼普遍認為買斷制遊戲比免費+內購遊戲良心?遊戲
- Valve新規:禁止開發者使用Steam頁面宣傳其他購買遊戲的方式遊戲
- 真人恐怖解謎遊戲《Simulacra 2》1月31登陸Steam商店遊戲
- steam2022春節特惠時間什麼時候 steam2022春節特惠打折遊戲購買推薦遊戲
- 模擬經營類遊戲《島與工廠》商店頁面上線steam遊戲
- Epic商店將開放第三方兌換碼購買 只要不與獨佔遊戲衝突遊戲
- Steam下架53款國產免費遊戲 或因違反V社內購規則遊戲
- 微軟Windows商店會變得更像Steam ,Xbox可自由安裝PC遊戲微軟Windows遊戲
- Steam商店裝修指南
- 黑鯊遊戲手機送福利:購買黑鯊遊戲手機送手柄遊戲
- 我在某寶6分錢買了一款Steam遊戲遊戲
- win10系統xbox商店購買軟體或遊戲時一直卡在載入頁面怎麼辦Win10遊戲
- 傳V社可能正建設Steam雲遊戲服務遊戲
- 如何提高遊戲購買量?這7點值得一試遊戲
- 內購、廣告、買斷 誰是當前手遊市場中獨立遊戲的最佳盈利模式?遊戲模式
- 怎樣讓遊戲在Steam商店獲得更多曝光? Valve分享了一些技巧遊戲
- 接入華為應用內購買,驗證購買Token介面,返回“rights invalid”
- Valve:在Steam平臺發行遊戲的五個建議遊戲
- steam怎麼共享遊戲給好友 steam家庭共享遊戲怎麼操作遊戲
- 2023年美國休閒玩家遊戲及相關內容購買比例(附原資料表) 遊戲
- 2023年美國狂熱玩家遊戲及相關內容購買比例(附原資料表) 遊戲
- 2023年美國超級玩家遊戲及相關內容購買比例(附原資料表) 遊戲
- 我花了5塊錢在國產“Epik商店”買到了Steam鎮店之寶
- Steam上的“恐怖”遊戲遊戲
- Steam 遊戲上架指南遊戲
- 《吸血鬼倖存者》錢怎麼花?商店購買策略分享
- epic遊戲怎麼轉到steam epic遊戲怎麼用steam開啟遊戲
- steam2022春節特惠時間介紹 steam2022春節特惠哪些遊戲值得買遊戲
- Steam出臺新政策 玩家換區買低價遊戲更困難遊戲
- 買下Steam上所有遊戲要多少錢?需要人民幣367萬元遊戲
- 研究發現Steam玩家買後不玩的遊戲總價為190億美元遊戲
- YouGov:40%的父母計劃花更多錢購買遊戲禮物Go遊戲