# 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 为支付签名,用于验证支付请求的合法性。签名算法如下:

  1. 将方法名与 signData 拼接:method + '&' + signData
  2. 使用 AppKey 对拼接字符串进行 HMAC-SHA256 签名
  3. 签名结果转换为十六进制字符串

注意: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('支付流程结束')
  }
})

# 注意事项

  1. 签名安全paySigsignature 应由服务端生成,不要在客户端暴露密钥。
  2. 订单号唯一outTradeNo 每个订单只能使用一次,建议使用时间戳或 UUID 生成唯一订单号。
  3. 价格校验goodsPrice 会与后台配置的道具价格进行校验,确保一致。
  4. 环境配置:测试时可使用沙箱环境(env=1),正式上线需切换到正式环境(env=0)。