# 虚拟支付2.0道具直购

# 接口列表

  • [前端]支付接口:wx.requestMidasPaymentGameItem
    1. 支付接口与之前一致,参数需要以虚拟支付2.0的为准
    2. offerId:传入2.0的支付应用ID(MP-虚拟支付2.0-基础配置-支付应用ID)
    3. zoneId:传入2.0的分区ID(MP-虚拟支付2.0-基础配置-游戏币/道具配置-分区配置-分区ID) 小程序的非正式版(开发版、体验版)可以使用支付的沙箱环境、正式环境发起支付,小程序的正式版只能使用支付的正式环境发起支付
  • [服务端]获取游戏币余额:pay_v2.queryOrder
  • [服务端]开发者主动通知平台发货:pay_v2.goodsNotifyConfirm

# 道具直购时序图

  1. 道具直购时序图
  2. 道具直购状态图

# 发起米大师支付

详见wx.requestMidasPaymentGameItem

# 道具发货消息协议

  1. 接入消息推送能力,在虚拟支付2.0-基础配置-基础配置-发货推送配置中配置推送url 参考文档小游戏消息推送
  2. 在虚拟支付2.0-基础配置-直购配置,点击开启道具发货推送,这一步会模拟推送数据。

# 注意事项(重要!!!)

  1. 同样的发货请求(outTradeNo),可能因为网络原因,会请求多次。我们在有限时间内尽量保证触达一次,直到明确返回发货成功为止
  2. 针对重复的请求,开发者需要自行保证只发货一次,并且回包需要和第一次一样返回发货成功
  3. 通知周期:15s/15s/30s/3m/10m/20m/30m/30m/30m/60m/3h/3h/3h/6h/6h
  4. 必须要开启道具发货推送才能收到回调请求

# 请求参数

字段 类型 说明
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"}