# 虚拟支付2.0道具直购
# 接口列表
- [前端]支付接口:wx.requestMidasPaymentGameItem
- 支付接口与之前一致,参数需要以虚拟支付2.0的为准
- offerId:传入2.0的支付应用ID(MP-虚拟支付2.0-基础配置-支付应用ID)
- zoneId:传入2.0的分区ID(MP-虚拟支付2.0-基础配置-游戏币/道具配置-分区配置-分区ID) 小程序的非正式版(开发版、体验版)可以使用支付的沙箱环境、正式环境发起支付,小程序的正式版只能使用支付的正式环境发起支付
- [服务端]获取游戏币余额:pay_v2.queryOrder
- [服务端]开发者主动通知平台发货:pay_v2.goodsNotifyConfirm
# 道具直购时序图
- 道具直购时序图
- 道具直购状态图
# 发起米大师支付
详见wx.requestMidasPaymentGameItem
# 道具发货消息协议
- 接入消息推送能力,在虚拟支付2.0-基础配置-基础配置-发货推送配置中配置推送url 参考文档小游戏消息推送。
- 在虚拟支付2.0-基础配置-直购配置,点击开启道具发货推送,这一步会模拟推送数据。
# 注意事项(重要!!!)
- 同样的发货请求(outTradeNo),可能因为网络原因,会请求多次。我们在有限时间内尽量保证触达一次,直到明确返回发货成功为止
- 针对重复的请求,开发者需要自行保证只发货一次,并且回包需要和第一次一样返回发货成功
- 通知周期:15s/15s/30s/3m/10m/20m/30m/30m/30m/60m/3h/3h/3h/6h/6h
- 必须要开启道具发货推送才能收到回调请求
# 请求参数
字段 | 类型 | 说明 |
---|---|---|
ToUserName | String | 小游戏原始ID |
FromUserName | String | 该事件消息的openid,道具发货场景固定为微信官方的openid |
CreateTime | Number | 消息发送时间 |
MsgType | String | 消息类型,道具发货场景固定为:event |
Event | String | 事件类型 道具直购(商城)场景固定为: minigame_h5_goods_deliver_notify 道具直购(游戏内)场景固定为: minigame_game_pay_goods_deliver_notify |
MiniGame | Object | 道具直购发货参数,见下文 |
- MiniGame
字段 | 类型 | 说明 |
---|---|---|
Payload | String | 携带的具体内容,格式为json,具体内容如下表格Payload(因为这里需要对消息内容统一签名,所以统一把消息内容设计成json格式) |
PayEventSig | String | 见支付类订阅事件签名算法说明 |
- Payload(JSON)
字段 | 类型 | 说明 |
---|---|---|
OpenId | String | 接收道具的玩家openid |
Env | Number | 环境配置 0:现网环境(也叫正式环境) 1:沙箱环境 |
OutTradeNo | String | 订单号 |
GoodsInfo | Object | 发货道具 |
WeChatPayInfo | Object | 微信支付信息(仅微信支付渠道) |
- GoodsInfo
字段 | 类型 | 说明 |
---|---|---|
ProductId | String | 游戏道具id标识 |
Quantity | Number | 购买道具数量 |
ZoneId | String | 分区ID |
OrigPrice | Number | 物品原始价格 (单位:分) |
ActualPrice | Number | 物品实际支付价格(单位:分) |
Attach | String | 透传数据 |
OrderSource | Number | 1 游戏内 2 商城下单 3 商城测试下单 |
- WeChatPayInfo
字段 | 类型 | 说明 |
---|---|---|
MchOrderNo | String | 微信支付商户单号 |
TransactionId | String | 交易单号(微信支付单号) |
- 返回参数
字段 | 类型 | 必填 | 说明 |
---|---|---|---|
ErrCode | Number | 是 | 发送状态。0:成功,其他:失败 |
ErrMsg | String | 否 | 错误原因,用于调试。在errcode 非0 的情况下可以返回 |
- JSON格式示例
{
"ToUserName": "gh_31b2a1c7e78a",
"FromUserName": "oUrsf0TSXNtiZjP7JL9UUFiGJzmQ",
"CreateTime": 1583202606,
"MsgType": "event",
"Event": "minigame_deliver_h5_pay_products",
"MiniGame": {
"Payload": "{\"OpenId\":\"to_user_openid\",\"Env\":0,\"GoodsInfo\":{\"ProductId\":\"id_100001\",\"ZoneId\":\"1\",\"OrigPrice\":10,\"ActualPrice\":10,\"Quantity\":1},\"WeChatPayInfo\":{\"MchOrderNo\":\"xxxxx\",\"TransactionId\":\"xxxx\"}}",
"PayEventSig": "f749f67b751fa80f27ddc0b7c8d2821aeda162ea22b323cd64a2c8056c2736f0"
}
}
- 成功返回
{"ErrCode":0,"ErrMsg":"Success"}
- 失败返回
{"ErrCode":99999,"ErrMsg":"internal error"}
# 服务端API
- pay_v2.queryOrder 查询订单状态
- HTTPS调用 请求地址
POST
https://api.weixin.qq.com/wxa/game/queryorderinfo?access_token=ACCESS_TOKEN&signature=SIGNATURE&sig_method=SIG_METHOD&pay_sig=PAY_SIGNATURE
# 请求参数
- Query参数
字段 | 类型 | 必填 | 说明 |
---|---|---|---|
access_token | String | 是 | 接口调用凭证https://developers.weixin.qq.com/minigame/dev/api-backend/open-api/access-token/auth.getAccessToken.html |
signature | String | 是 | 用户登录态签名,签名算法请参考https://developers.weixin.qq.com/minigame/dev/guide/open-ability/signature.html |
sig_method | String | 否 | 用户登录态签名的哈希方法,只支持hmac_sha256,请参考https://developers.weixin.qq.com/minigame/dev/guide/open-ability/signature.html 如:"hmac_sha256" |
pay_sig | String | 是 | 支付请求签名,参考文档https://docs.qq.com/doc/DVUN0QWJja0J5c2x4“支付请求签名算法说明” |
- POST Body
Object
POST的JSON数据包
字段 | 类型 | 必填 | 说明 |
---|---|---|---|
openid | String | 是 | 用户唯一标识符 |
ts | Number | 是 | 当前UNIX时间戳(请尽可能确保时间准确),单位:秒 如:1668136271 |
env | Number | 是 | 环境配置 0:现网环境(也叫正式环境) 1:沙箱环境 |
out_trade_no | String | 是 | 订单号 |
biz_id | Number | 是 | 1代币 2道具直购 |
offer_id | String | 是 | 支付应用ID(OfferId) MP-虚拟支付2.0-基础配置-支付应用ID |
- 返回值
Object
返回的JSON数据包
字段 | 类型 | 说明 |
---|---|---|
errcode | Number | 错误码 |
errmsg | String | 错误信息 |
product id | String | 道具id |
pay_state | Number | 支付状态 (用户是否已支付) 1:未支付 2:已支付 |
deliver_state | Number | 发货状态 (游戏币余额是否增加) 1:未发货 2:已发货 |
pay_finish_time | Number | 支付完成时间 |
out_trade_no | String | 用户订单号 |
mch_order_no | String | 微信支付商户单号 |
transaction_id | String | 交易单号(微信支付订单号) |
errcode 的合法值
返回参数
字段 | 说明 |
---|---|
0 | 请求成功 |
-1 | 系统繁忙,此时请开发者稍候再试 |
90000 | 订单不存在,即out_trade_no对应的订单不存在 |
90010 | signature签名错误或用户登录态(session_key)已过期 |
90011 | pay_sig签名错误 |
90018 | 参数错误,具体参数见errmsg描述 |
90019 | 订单号未找到 |
- 示例
cURL请求
curl -d '{
"openid": "oUrsfxxxxxxxxxx",
"ts": 1668512806,
"env": 0,
"out_trade_no": "test_queryorderinfo_1668512806",
"offer_id":"xxxx",
"biz_id":1
}' \
-H "Content-Type: application/json" \
-X POST \
'https://api.weixin.qq.com/wxa/game/notifydelivery?access_token=62_so84Zyl5MuPCjXGiR3eb1ysa1lr6aRpcprEnNpZ9ds8676ivjqRn5Zroi2Rxxx9-Yvh2zIl9oEt1hIzK0x2OrMCT5zk8nB_TG98obD_ad3tFPftfFmB7xXtcZv4PVPcbFATZT&signature=a5ec09b5677b5004495ac78eecc0aa78a4aa53c1bfa82850e4dcf1650c8a5d69&pay_sig=e654d5725976945f738caf3485c260b129dc586c797d7616ca15176fd31b5e8b&sig_method=hmac_sha256'
成功返回
{
"errcode": 0,
"errmsg": "ok",
"out_trade_no": "test_queryorderinfo_1668512806",
"pay_finish_time":1669364790,
"product_id":"id_100001",
"deliver_state":1,
"pay_state": 1,
"mch_order_no":"1217752501201407033233368018",
"transaction_id":"1217752501201407033233368018"
}
失败返回
{"errcode":90018,"errmsg":"[openid] openid is invalid"}