# tap.requestPaymentGameItem(Object object)
以 Promise 风格调用:支持
SDK版本要求:2.8.0
# 功能描述
发起道具直购支付请求。
# 参数
# Object object
| 属性 | 类型 | 默认值 | 必填 | 说明 |
|---|---|---|---|---|
| signData | string | 是 | 支付原串,String字符串,具体参数见下方 signData 说明 | |
| paySig | string | 是 | 支付签名,用于验证请求合法性 | |
| signature | string | 是 | 用户态签名 | |
| success | function | 否 | 接口调用成功的回调函数 | |
| fail | function | 否 | 接口调用失败的回调函数 | |
| complete | function | 否 | 接口调用结束的回调函数(调用成功、失败都会执行) |
# signData 参数说明
signData 为 String 格式字符串,包含以下字段:
| 属性 | 类型 | 默认值 | 必填 | 说明 |
|---|---|---|---|---|
| mode | string | 是 | 支付类型,固定为 "goods" 表示道具直购 | |
| offerId | string | 是 | 应用 ID | |
| buyQuantity | number | 是 | 购买数量 | |
| env | number | 0 | 否 | 环境配置:0-正式环境,1-沙箱环境 |
| currencyType | string | 是 | 币种,如 "CNY" 表示人民币 | |
| platform | string | android | 否 | 平台,如 "android" |
| zoneId | string | 1 | 否 | 分区 ID |
| productId | string | 是 | 道具 ID | |
| goodsPrice | number | 是 | 道具单价(单位:分),用于校验价格与后台配置是否一致 | |
| outTradeNo | string | 是 | 业务订单号,每个订单号只能使用一次。要求 32 个字符内,只能是数字、大小写字母、符号 _-|*@ 组成,不能以下划线开头 | |
| attach | string | 否 | 透传数据,发货通知时会透传给开发者 |
# paySig 参数说明
paySig 为支付签名,用于验证支付请求的合法性。签名算法如下:
- 将方法名与 signData 拼接:
method + '&' + signData - 使用 AppKey 对拼接字符串进行 HMAC-SHA256 签名
- 签名结果转换为十六进制字符串
注意:paySig 必须在服务端生成,不要在客户端暴露 AppKey。
代码示例(Python):
import hmac
import hashlib
# sign_data 支付原串,注意这里 sign_data 需要和前端一致,原格式传递(包括空格和回车),建议后台下发
# 支付Key ,注意区分沙箱和线上需要使用不同的Key
# method 需要签名方法 requestPaymentGameItem
def gen_pay_sig(sign_data, appkey, method):
need_encode_body = method + '&' + sign_data
print(need_encode_body)
return hmac.new(
key=appkey.encode('utf-8'),
msg=need_encode_body.encode('utf-8'),
digestmod=hashlib.sha256
).hexdigest()
# signature 参数说明
signature 为用户态签名,用于验证用户身份的合法性。详细签名算法和代码示例请参考签名验证文档。
# success 回调函数参数
| 属性 | 类型 | 说明 |
|---|---|---|
| errCode | number | 错误码,0 表示成功 |
| errMsg | string | 错误信息 |
# fail 回调函数参数
| 属性 | 类型 | 说明 |
|---|---|---|
| errCode | number | 错误码 |
| errMsg | string | 错误信息 |
# 错误码
| 错误码 | 错误信息 | 说明 | 触发条件 |
|---|---|---|---|
| -1 | 系统失败 | 系统失败 | 服务端保底的错误 |
| -15001 | 参数错误 | 虚拟支付接口错误码,缺少参数 | 已有,但无触发场景 |
| -15002 | 参数错误 | 虚拟支付接口错误码,参数不合法 | 已有,但无触发场景 |
| -15003 | 订单重复 | 虚拟支付接口错误码,订单重复 | signData 的 outTradeNo、offerId、env 都不变时创建订单 |
| -15006 | 货币类型不支持 | 虚拟支付接口错误码,货币类型不支持 | signData 的 currencyType 非 CNY |
| -15009 | 虚拟支付接口错误码,由于健康系统限制,本次支付已超过限额(这种错误情况会有默认弹窗提示) | 用户的实名认证的年龄未满 18 岁 | |
| -15010 | 账号异常,请前往开发者后台添加资格 | 虚拟支付接口错误码,正式版小游戏不允许在沙箱环境支付 | signData 的 env 是 1-沙箱环境,但是测试用户未加入到沙箱环境白名单中 |
| -15012 | 签名错误 | SIGNATURE错误 | signature 错误 |
| -15014 | 支付签名错误 | paySig错误 | paySig 错误 |
| -15016 | 商品价格错误 | 道具价格错误 | signData 的 goodsPrice 和开发者后台设置的价格不符 |
| 1000 | 参数错误 |
# 示例代码
// 构造支付参数
const signData = JSON.stringify({
mode: 'goods',
offerId: '123456',
buyQuantity: 1,
env: 0,
currencyType: 'CNY',
platform: 'android',
zoneId: '1',
productId: 'diamond_100',
goodsPrice: 600, // 6元 = 600分
outTradeNo: 'order_' + Date.now(),
attach: 'extra_data'
})
// 发起支付请求
tap.requestPaymentGameItem({
signData: signData,
paySig: 'your_pay_signature', // 由服务端生成
signature: 'your_user_signature', // 由服务端生成
success(res) {
console.log('支付成功', res)
// 支付成功后的处理逻辑
},
fail(err) {
console.error('支付失败', err.errCode, err.errMsg)
if (err.errCode === -2 || err.errCode === 1 || err.errCode === 7) {
// 用户取消支付
console.log('用户取消了支付')
}
},
complete() {
console.log('支付流程结束')
}
})
# 注意事项
- 签名安全:
paySig和signature应由服务端生成,不要在客户端暴露密钥。 - 订单号唯一:
outTradeNo每个订单只能使用一次,建议使用时间戳或 UUID 生成唯一订单号。 - 价格校验:
goodsPrice会与后台配置的道具价格进行校验,确保一致。 - 环境配置:测试时可使用沙箱环境(env=1),正式上线需切换到正式环境(env=0)。
