W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
小游戲支付提供玩家在小游戲中購(gòu)買(mǎi)道具的能力
主要的流程: 1、小程序內(nèi)調(diào)用登錄接口,獲取到用戶的openid 2、開(kāi)發(fā)者 server調(diào)用下單接口 4、開(kāi)發(fā)者 server接收支付通知
開(kāi)發(fā)者需要在QQ小程序開(kāi)發(fā)者管理端上架道具
本接口應(yīng)在服務(wù)器端調(diào)用,詳細(xì)說(shuō)明參見(jiàn)服務(wù)端API。
玩家購(gòu)買(mǎi)道具前,開(kāi)發(fā)者需要通過(guò)后臺(tái)接口進(jìn)行預(yù)下單
POST https://api.q.qq.com/api/json/openApiPay/GamePrePay?access\_token=ACCESS\_TOKEN
請(qǐng)求參數(shù) | 屬性 | 類(lèi)型 | 默認(rèn)值 | 必填 | 說(shuō)明 |
---|---|---|---|---|---|
openid | string | 是 | 用戶唯一標(biāo)識(shí)符 | ||
appid | string | 是 | 小程序 appId | ||
ts | number | 是 | UNIX 時(shí)間戳,單位是秒 | ||
zone_id | string | 是 | 游戲服務(wù)器大區(qū)id,zoneId ="1" | ||
pf | string | 是 | 平臺(tái) 安卓:qq_m_qq-2001-android-2011 | ||
user_ip | string | 否 | 用戶外網(wǎng) IP, 不參與計(jì)算簽名 | ||
amt | number | 是 | 扣除游戲幣數(shù)量,不能為 0 | ||
bill_no | string | 是 | 訂單號(hào),業(yè)務(wù)需要保證全局唯一;相同的訂單號(hào)不會(huì)重復(fù)扣款。長(zhǎng)度不超過(guò)63,只能是數(shù)字、大小寫(xiě)字母_- | ||
goodid | string | 是 | 在開(kāi)發(fā)者管理端上架道具的id | ||
good_num | int | 是 | 要購(gòu)買(mǎi)的道具數(shù)量 | ||
app_remark | string | 否 | 備注信息,如果不為空,通知發(fā)貨是會(huì)回傳 | ||
sig | string | 是 | 以上參數(shù)("user_ip"字段除外,含可選最多11個(gè))+uri+session_key,用 HMAC-SHA256簽名 | ||
access_token | string | 是 | 接口調(diào)用憑證 |
返回的 JSON 數(shù)據(jù)包
屬性 | 類(lèi)型 | 說(shuō)明 |
---|---|---|
errcode | number | 錯(cuò)誤碼 |
errmsg | string | 錯(cuò)誤信息 |
prepayId | string | 訂單號(hào),有效期是 48 小時(shí) |
errcode 的合法值 | 值 | 說(shuō)明 |
---|---|---|
0 | 請(qǐng)求成功 | |
-1 | 系統(tǒng)繁忙,此時(shí)請(qǐng)開(kāi)發(fā)者稍候再試 | |
-3000 | access_token 校驗(yàn)失敗,access_token需要放在url中 | |
90011 | sig簽名錯(cuò)誤 | |
90012 | 訂單已存在 | |
90017 | 沒(méi)有調(diào)用接口的權(quán)限 | |
90018 | 參數(shù)錯(cuò)誤 |
POST 數(shù)據(jù)格式:JSON
{
"openid":"55107C3B8501CD7CBD90AEE4626E6D17",
"appid":"1107981003",
"ts":1507530737,
"zone_id":"1",
"pf":"qq_m_qq-2001-android-2011",
"amt":10,
"goodid":"43",
"good_num":1,
"bill_no":"69ae13a3a87f2551109a2ed26bc704201f56d664",
"app_remark":"xxxxx",
"sig":"38181bd0acf24eda203655a3be9f2e42b62d4fcf1c1de61a98b0573d13531449"
}
1. 請(qǐng)求方法: POST 2. 下單url中的path(/api/json/openApiPay/GamePrePay)部分,做標(biāo)準(zhǔn)的url Encoding, 標(biāo)準(zhǔn)請(qǐng)參考《URL Encoding 》
3. 請(qǐng)求參數(shù)按字典排序,并用"&"拼接, 注意空字段不參與排序
amt=10&app_remark=xxxxx&appid=1107981003&bill_no=69ae13a3a87f2551109a2ed26bc704201f56d664&good_num=1&goodid=43&openid=55107C3B8501CD7CBD90AEE4626E6D17&pf=qq_m_qq-2001-android-2011&ts=1507530737&zone_id=1
4. 拼接session_key,用戶登錄時(shí)開(kāi)發(fā)者后臺(tái)可以通過(guò)code2session接口獲取到
session_key=VUNQZ0hRYURxNlZZbmNOZw==
5. 簽名前的字符串如下圖
POST&%2Fapi%2Fjson%2FopenApiPay%2FGamePrePay&amt=10&app_remark=xxxxx&appid=1107981003&bill_no=69ae13a3a87f2551109a2ed26bc704201f56d664&good_num=1&goodid=43&openid=55107C3B8501CD7CBD90AEE4626E6D17&pf=qq_m_qq-2001-android-2011&ts=1507530737&zone_id=1&session_key=VUNQZ0hRYURxNlZZbmNOZw==
6.HMAC-SHA256得到的簽名結(jié)果
$h = hash_hmac('sha256', 'POST&%2Fapi%2Fjson%2FopenApiPay%2FGamePrePay&amt=10&app_remark=xxxxx&appid=1107981003&bill_no=69ae13a3a87f2551109a2ed26bc704201f56d664&good_num=1&goodid=43&openid=55107C3B8501CD7CBD90AEE4626E6D17&pf=qq_m_qq-2001-android-2011&ts=1507530737&zone_id=1&session_key=VUNQZ0hRYURxNlZZbmNOZw==', 'VUNQZ0hRYURxNlZZbmNOZw==', true);
var_dump(bin2hex($h));
簽名:
38181bd0acf24eda203655a3be9f2e42b62d4fcf1c1de61a98b0573d13531449
屬性 | 類(lèi)型 | 默認(rèn)值 | 必填 | 說(shuō)明 |
---|---|---|---|---|
openid | string | 是 | 用戶唯一標(biāo)識(shí)符 | |
bill_no | string | 是 | 訂單號(hào),業(yè)務(wù)需要保證全局唯一;相同的訂單號(hào)不會(huì)重復(fù)扣款。長(zhǎng)度不超過(guò)63,只能是數(shù)字、大小寫(xiě)字母 | |
amt | number | 是 | 扣除游戲幣數(shù)量,不能為 0 | |
ts | number | 是 | UNIX 時(shí)間戳,單位是秒 | |
app_remark | string | 否 | 備注信息,如果為空,不參與計(jì)算簽名 | |
sig | string | 是 | 以上所有參數(shù)(含可選最多11個(gè))+appsecret HMAC-SHA256簽名 |
回調(diào)地址 這里的回調(diào)地址是示例,以開(kāi)發(fā)者在管理端 配置的為準(zhǔn) http://test.com/pay/callback 1
app_remark字段為空時(shí),回調(diào)消息如下:
{
"openid": "55107C3B8501CD7CBD90AEE4626E6D17",
"bill_no":"BillNo_123",
"amt":123,
"ts":1553322984,
"sig": "1d7d3b724601a0b55a43e03f140ce55322401fedd359b1ea1dfc96a02f6e6f36"
}
app_remark字段不空時(shí),回調(diào)消息如下:
{
"openid": "55107C3B8501CD7CBD90AEE4626E6D17",
"bill_no":"BillNo_123",
"amt":123,
"ts":1553322984,
"app_remark":"xxxxx",
"sig": "1d7d3b724601a0b55a43e03f140ce55322401fedd359b1ea1dfc96a02f6e6f36"
}
為了確保,QQ會(huì)對(duì)明文數(shù)據(jù)進(jìn)行簽名。開(kāi)發(fā)者可以根據(jù)業(yè)務(wù)需要對(duì)數(shù)據(jù)包進(jìn)行簽名校驗(yàn),確保數(shù)據(jù)的完整性。
HyVFkGl5F5OQWJZZaNzBBg==
strPath=url.QueryEscape("/pay/callback") // 這里要替換成開(kāi)發(fā)者在管理端配置的鏈接
3.計(jì)算簽名時(shí),沒(méi)有值的參數(shù)不參與簽名,所有參與簽名的參數(shù)按字典序排序,這里以app_remark為空時(shí)的回調(diào)簽名為例,app_remark不空時(shí),需要參與簽名
strData="POST&"+strPath+"&amt=123&bill_no=BillNo_123&openid=55107C3B8501CD7CBD90AEE4626E6D17&ts=1553322984&AppSecret=HyVFkGl5F5OQWJZZaNzBBg=="
// 計(jì)算簽名前的字符串:
POST&%2Fpay%2Fcallback&amt=123&bill_no=BillNo_123&openid=55107C3B8501CD7CBD90AEE4626E6D17&ts=1553322984&AppSecret=HyVFkGl5F5OQWJZZaNzBBg==
4.hmac使用sha256算法得到的結(jié)果為
計(jì)算得到的簽名:
f749f67b751fa80f27ddc0b7c8d2821aeda162ea22b323cd64a2c8056c2736f0
5.PHP示例
$h = hash_hmac('sha256', 'POST&%2Fpay%2Fcallback&amt=123&bill_no=BillNo_123&openid=55107C3B8501CD7CBD90AEE4626E6D17&ts=1553322984&AppSecret=HyVFkGl5F5OQWJZZaNzBBg==', 'HyVFkGl5F5OQWJZZaNzBBg==', true);
var_dump(bin2hex($h));
回調(diào)接口需要返回一個(gè)json
屬性 | 類(lèi)型 | 默認(rèn)值 | 必填 | 說(shuō)明 |
---|---|---|---|---|
code | number | 是 | code等于0,表示成功,其他是失敗 | |
msg | string | 是 | 錯(cuò)誤描述 |
{
"code":0,
"msg":""
}
查詢支付狀態(tài) 本接口應(yīng)在服務(wù)器端調(diào)用,詳細(xì)說(shuō)明參見(jiàn)服務(wù)端API。 玩家下單購(gòu)買(mǎi)道具后,如果開(kāi)發(fā)商沒(méi)有收到支付支付通知,可以通過(guò)這個(gè)接口查詢支付結(jié)果
POST
https://api.q.qq.com/api/json/openApiPay/CheckGamePay?access_token=ACCESS_TOKEN
查詢余額
本接口應(yīng)在服務(wù)器端調(diào)用,詳細(xì)說(shuō)明參見(jiàn)服務(wù)端API。
POST https://api.q.qq.com/api/json/openApiPay/GetBalance?access_token=ACCESS_TOK
屬性 | 類(lèi)型 | 默認(rèn)值 | 必填 | 說(shuō)明 |
---|---|---|---|---|
openid | string | 是 | 用戶唯一標(biāo)識(shí)符 | |
appid | string | 是 | 小程序 appId | |
sig | string | 是 | 以上參數(shù)("user_ip"字段除外,含可選最多11個(gè))+uri+session_key,用 HMAC-SHA256簽名 | |
access_token | string | 是 | 接口調(diào)用憑證 |
返回值
返回的 JSON 數(shù)據(jù)包
屬性 | 類(lèi)型 | 說(shuō)明 |
---|---|---|
errcode | number | 錯(cuò)誤碼 |
errmsg | string | 錯(cuò)誤信息 |
remainder | number | 金幣余額 |
errcode 的合法值
值 | 說(shuō)明 |
---|---|
0 | 請(qǐng)求成功 |
-1 | 系統(tǒng)繁忙,此時(shí)請(qǐng)開(kāi)發(fā)者稍候再試 |
-3000 | access_token 校驗(yàn)失敗,access_token需要放在url中 |
90011 | sig簽名錯(cuò)誤 |
POST 數(shù)據(jù)格式:JSON
{
"openid":"55107C3B8501CD7CBD90AEE4626E6D17",
"appid":"1107981003",
"sig":"9a721574bbf7fbfc68f15edd7e9cc355d6a95e2d946ecd4e04b708c4206665b4",
}
1.請(qǐng)求方法: POST 2.下單url中的path(/api/json/openApiPay/GetBalance)部分,做標(biāo)準(zhǔn)的url Encoding, 標(biāo)準(zhǔn)請(qǐng)參考《URL Encoding 》 3.請(qǐng)求參數(shù)按字典排序,并用"&"拼接, 注意空字段不參與排序
appid=1107981003&openid=55107C3B8501CD7CBD90AEE4626E6D17```
4.拼接session_key,用戶登錄時(shí)開(kāi)發(fā)者后臺(tái)可以通過(guò)code2session接口獲取到
session_key=VUNQZ0hRYURxNlZZbmNOZw==
5.簽名前的字符串如下圖
POST&%2Fapi%2Fjson%2FopenApiPay%2FCheckGamePay&appid=1107981003&bill_no=69ae13a3a87f2551109a2ed26bc704201f56d664&openid=55107C3B8501CD7CBD90AEE4626E6D17&prepay_id=beaf257883b098007ca821e1c59f7f7a&session_key=VUNQZ0hRYURxNlZZbmNOZw==```
6.HMAC-SHA256得到的簽名結(jié)果
$h = hash_hmac('sha256', 'POST&%2Fapi%2Fjson%2FopenApiPay%2FCheckGamePay&appid=1107981003&bill_no=69ae13a3a87f2551109a2ed26bc704201f56d664&openid=55107C3B8501CD7CBD90AEE4626E6D17&prepay_id=beaf257883b098007ca821e1c59f7f7a&session_key=VUNQZ0hRYURxNlZZbmNOZw==')
var_dump(bin2hex($h));
簽名:
9a721574bbf7fbfc68f15edd7e9cc355d6a95e2d946ecd4e04b708c4206665b4
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: