騰訊米大師支付服務器端接入流程

騰訊開放平臺的接入是很是麻煩的,文檔各類不清不楚的,有些東西文檔根本沒有寫,若是不跟騰訊的技術人員對接的話,你均可能作不出來。雖然他們也沒有幫到什麼

申請過程就不贅述(申請過程很蛋疼),直接開始接入。根據項目需求,我採用的是【米大師道具直購模式】,官方文檔,這了提一點,在後面騰訊客服發了個新的米大師文檔,這個文檔才比較詳細。php

1、下單


  • 下單有兩種,一種服務器下單,一種APP下單,我採用的服務器下單
  • 建議使用官方的SDK來進行簽名,本身來簽名可能會失敗(我水平太菜)SDK下載
<?php
    
    //獲取訂單信息
    ...
    
    //必填 APP傳遞
    $data['openid'] = $_POST['openid']; 
    //必填 APP傳遞
    $data['openkey'] = $_POST['openkey']; 
    //應用在米大師註冊的應用ID(對應客戶端接口中的offerid),String類型
    $data['appid'] = '123456789'; 
    $data['ts'] = time(); 
    //平臺標識信息:平臺-註冊渠道-版本-安裝渠道-業務自定義(自定義),最大150字節。(自定義部分不能包含單引號 '  < > ( ) +  |  & = * ^-等特殊字符,支持下劃線_)
    $data['pf'] = 'qq_m_qq-2001-android-2011-xxxx'; 
    $data['pfkey'] = 'ASDFGHJ123456'; 
    //遊戲服務器大區id,遊戲不分大區則默認zoneId ="1",String類型。如過應用選擇支持角色,則角色ID接在分區ID號後用"_"鏈接。
    $data['zoneid'] = '1'; 
    //使用x*p*num的格式,x表示物品ID,p表示單價(以Q點爲單位,1Q幣=10Q點,單價的制定需遵循騰訊訂價規範),num表示默認的購買數量。
    $data['payitem'] = '1*10*1'; 
    //商品描述
    $data['goodsmeta'] = '充值*金幣充值'; 
    //商品圖片
    $data['goodsurl'] = 'http://www.xxx.com/img.jpg'; 
    //(可選)道具總價格。(amt必須等於全部物品:單價*建議數量的總和 單位爲1Q點)
    $data['amt'] = '10';
    //可選  用戶可購買的道具數量的最大值
    //$data['max_num'] = ''; 
    //(可選)1表示用戶不能夠修改物品數量,2 表示用戶能夠選擇購買物品的數量。默  認2(注:批量購買的時候,必須等於1)
    $data['appmode'] = '1';
    //若是你不傳的話回調裏面也會沒有,傳了回調會加上此參數,並更名爲【appmeta】,且格式爲【商戶本身定義的參數*支付方式*平臺渠道】
    $data['app_metadata'] = '訂單類型*訂單編號'; 
    $data['userip'] = '127.0.0.1'; 
    $data['format'] = 'json';
    
    //簽名,這裏直接調用SDK的方法,不要本身去寫,會有不少坑,我以前就是不想用SDK想本身寫結果按照文檔流程簽名死活不對,這裏注意 祕鑰後面跟了一個【&】
    $data['sig'] = SnsSigCheck::makeSig('GET','/v3/r/mpay/buy_goods_m',$data,"你的祕鑰&");
    
    //設置cookie,微信與QQ的不同,我也不知道爲何要設置cookie
     if ($login_type == 'qq') {
        $cookie_data = [
            'session_id'   => 'openid',
            'session_type' => 'kp_actoken',
            'org_loc'      => rawurlencode('/v3/r/mpay/buy_goods_m'),
        ];
    } elseif ($login_type == 'wx') {
        $cookie_data = [
            'session_id'   => 'hy_gameid',
            'session_type' => 'wc_actoken',
            'org_loc'      => rawurlencode('/v3/r/mpay/buy_goods_m'),
        ];
    }
    
    //下單
    $result = SnsNetwork::makeRequest('https://ysdktest.qq.com/mpay/buy_goods_m', $data, $cookie_data, 'get');

$result 格式爲(我轉成了JSON,本來是數組)linux

{
      "result": true,
      "msg": "{\"ret\":0,\"token\":\"842C2C19D11B7780D0E9B4D8E73ED80531721\",\"url_params\":\"\/v1\/sx8\/1106694898\/mobile_goods_info?token_id=842C2C19D11B7780D0E9B4D8E73ED80531721\",\"attach\":\"\"}"
    }

返回參數說明
ret
返回碼 0 :成功,
>=1000:失敗
msg ret不爲 0 的時候,錯誤信息(utf-8編碼)
token ret爲0的時候,開發者須要保留。後續扣費成功後調用第三方發貨時,會再傳給開發者,做爲本次交易的標識,有效期5分鐘
url_params
ret爲0的時候,返回真正購買物品的url的參數,開發者須要把該參數
傳給sdk跳轉到相關頁面使用戶完成真正的購買動做。android

將msg裏面的url_params與token返回給APP便可調用支付nginx

2、應用發貨回調


1.首先去後臺配置回調地址,我這裏是https,默認是http,能夠用ip,若是用域名的話須要用https,可是你填寫的時候他只會提示你要切換https,可是又不告訴你在哪裏切。問了客服才知道,要他們來切換。我也是醉了
2.配置好了以後下載證書

hosting應用on CVM(即應用部署在騰訊CVM服務器上):
-發貨URL只需HTTP協議便可,不須要使用SSL安全協議。
-必須使用9001端口(內網端口,需開發者主動啓用,用apache iis或nginx作一個web監聽,端口改爲9001)。web

hosting應用on CEE_V2(即應用部署在騰訊CEE_V2服務器上):
-發貨URL只需HTTP協議便可,不須要使用SSL安全協議。
-必須使用9001端口(內網端口,需開發者主動啓用,用apache iis或nginx作一個web監聽,端口改爲9001)。
-路徑必須以ceecloudpay開頭,即支付相關代碼必須都放到應用根目錄下的「ceecloudpay」目錄下。
-對於CEE其發貨URL的IP只能填寫爲10.142.11.27或者10.142.52.17(詳見:CEE_V2訪問雲支付)。apache

non-hosting應用(即應用部署在開發者本身的服務器上)
-發貨URL必須使用HTTPS協議。
-必須使用443端口(外網端口)。json

注:我用的不是騰訊的服務器因此證書採用的是non-hosting應用
圖片描述數組

linux服務器證書配置安全

將下載的證書裏面的
ca.crt , xxxxxxxx.crt xxxxx.key 3個文件上傳到linux服務器,通常放在項目的私有目錄
nginx你項目的配置裏面加上服務器

server{
    listen 443;
    server_name 你的網站;
    index index.php;
    root  網站目錄;
    
    ssl                       on;
    ssl_certificate           服務器存放的地址/xxxxxxxx.crt;
    ssl_certificate_key       服務器存放的地址/xxxxxxxx.key;
    ssl_verify_client         off;
    ssl_session_timeout       5m;
    ssl_protocols             SSLv2 SSLv3 TLSv1;
    ssl_ciphers               ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
    ssl_prefer_server_ciphers on;
    ssl_client_certificate    服務器存放的地址/ca.crt;
    ssl_verify_depth          1;
    
    #其餘配置
    ...
}

重啓服務器

手動訪問一下看下是否可以訪問,可以訪問則配置成功

3.回調邏輯,你用get提交的請求,騰訊也用的get回調

回調參數 json_encode($_GET):

{
  "amt": "1",
  "appid": "123456789",
  "appmeta": "(參考上面下單)訂單類型*訂單編號*qqwallet*qq",
  "billno": "流水號",
  "cftid": "財付通訂單號",
  "channel_id": "00000000-android-00000000-869782022252681-ysdkwater-qq",
  "clientver": "android",
  "ebazinga": "1",
  "openid": "123123123123123",
  "payamt_coins": "0",
  "paychannelsubid": "1",
  "payitem": "3*0.1*1",
  "providetype": "5",
  "pubacct_payamt_coins": "",
  "token": "123123123123123",
  "ts": "1518081937",
  "version": "v3",
  "zoneid": "1",
  "sig": "H0jsNEOnf1mKIXgZ4mM0pnuk7BQ="
}

這裏說是要驗證簽名,可是我用他的SDK沒有驗證出來 就放棄了o(╥﹏╥)o

<?php

$checkSign = SnsSigCheck::verifySig('get','/v3/r/mpay/buy_goods_m',$_GET,'祕鑰&',$_GET['sig']);

if($checkSign){
    //訂單處理邏輯
    ...
}
/*
 ret: 返回碼。
 msg: 道具發放操做的結果,成功爲「OK」,失敗則代表錯誤緣由(必須使用utf8編碼)。      騰訊設置的調用開發者發貨超時是2秒鐘,請開發者注意超時時間設置不要超過2秒,
      不然騰訊後臺將返回「系統繁忙」的錯誤消息。
 返回建議:
 1.在發貨接口中記錄被調用的log,用於查看是否發貨回調接口可以被騰訊支付服務器回調,發起一筆
   支付請求,查看發貨回調接口是否有被調用。
 2.聯調回調發貨接口時先在接口上固定返回發貨成功的標準json字符串{"ret":0,"msg":"OK"},測試一
   次支付,查看支付服務器是否能正常接收到回調發貨接口返回的標準json內容。
   注意:返回的內容中不能有空格、tab等字符、不能有其它多餘的內容。
 3.以上兩步都能順利經過,說明回調接口能正常被支付服務器調用,而後再在回調接口中加入遊戲發貨
   的業務邏輯。
 4. 協議錯誤碼
    0: 成功
    1: 系統繁忙
    2: token已過時
    3: token不存在
    4: 請求參數錯誤:(這裏填寫錯誤的具體參數)
*/
echo json_encode([
    'ret' => 0,
    'msg' => 'ok',
]);
exit;
騰訊的文檔太坑爹了

[參考]
http://canann.iteye.com/blog/...

相關文章
相關標籤/搜索