mgtv.thirdPayment(Object option)
第三方支付。
参数
Object option
| 属性 | 类型 | 默认值 | 必填 | 说明 | 备注 |
|---|---|---|---|---|---|
| signData | string | 是 | 支付原串(该对象的 json 串),结构见下表 | ||
| sign | string | 是 | 签名,见签名算法 | ||
| timestamp | number | 是 | 时间戳 | 单位:毫秒 | |
| success | function | 否 | 成功的回调函数(宿主已经收到微信/支付宝/苹果等第三方返回订单支付成功结果) | ||
| fail | function | 否 | 失败的回调函数(返回失败时,有可能微信/支付宝/苹果等第三方尚未给宿主返回订单成功,因此需要业务方做好处理) | ||
| complete | function | 否 | 接口调用结束的回调函数(调用成功、失败都会执行) |
option.signData 结构
| 属性 | 类型 | 默认值 | 必填 | 说明 | 备注 |
|---|---|---|---|---|---|
| userId | string | 是 | 业务方用户 ID 标识 | ||
| mgOpenId | string | 是 | 芒果第三方用户唯一标识 | ||
| buyQuantity | number | 是 | 购买数量 | 暂时只支持 1 | |
| productId | string | 是 | 商品 ID | ||
| productName | string | 是 | 商品名称 | ||
| productDesc | string | 否 | 商品描述 | ||
| service | number | 是 | 支付渠道,合法值见下表 | iOS 只能选择苹果支付 | |
| price | number | 是 | 本次购买价格 | 单位分 | |
| outTradeNo | string | 是 | 业务订单号 | ||
| platform | string | 否 | 平台,ios 或 android | ||
| attach | string | 否 | 透传数据 | ||
| returnUrl | string | 否 | 透传支付成功跳转地址 | ||
| mode | string | 是 | 购买模式,合法值见下表 |
option.signData.service 合法值
| 值 | 说明 | 备注 |
|---|---|---|
| 2 | 苹果支付 | iOS 只能选择苹果支付 |
| 3 | 微信 | |
| 4 | 支付宝 |
option.signData.mode 合法值
| 值 | 说明 |
|---|---|
| buy | 单次购买 |
object.success 回调函数
成功返回值 res
无返回值。
失败返回值 res
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| errCode | number | 见SDK 错误码 | |
| errMsg | string | 错误信息 |
SDK 错误码
| 错误码 | 说明 |
|---|---|
| 0 | 支付成功 |
| -1 | 支付失败 |
| -2 | 服务端错误 |
| 1 | 用户支付取消 |
| 6 | 其他错误 |
| 7 | 支付取消 |
| 1000 | 参数错误 |
| 16000 | 支付参数解析失败 |
| 16001 | 调用支付接口失败 |
| 16004 | 支付异常关闭 |
支付流程
示例代码
// signData、sign、timestamp 均由第三方业务方服务端生成并返回
mgtv.thirdPayment({
signData: res.signData, // 支付原串(json 串)
sign: res.sign,
timestamp: res.timestamp,
success() {
console.log('success');
},
fail(res) {
console.log(res.errCode, res.errMsg);
},
complete() {
console.log('complete');
},
});
支付接口回调(后端)
接入方在小程序开放平台填写回调地址,芒果服务端在支付成功后向该地址推送通知。
请求参数
| 属性 | 类型 | 必填 | 说明 | 备注 |
|---|---|---|---|---|
| appId | string | 是 | 小程序 appId | |
| signData | string | 是 | 支付原串(该对象的 json 串),结构见下表 | |
| timestamp | number | 是 | 时间戳 | 单位:毫秒 |
| sign | string | 是 | 签名,见签名算法 |
signData 结构
| 属性 | 类型 | 说明 |
|---|---|---|
| notifyType | string | 通知类型,pay:支付成功 |
| outTradeNo | string | 业务订单号(下单时传的单号) |
| mgOrderNo | string | 芒果小程序订单号 |
| transactionId | string | 第三方支付订单流水号(微信/支付宝/苹果) |
| signId | string | 芒果 TV 的签约 ID,签约下单时会有 |
| orderPrice | number | 订单金额 |
| payPrice | number | 用户支付金额 |
| payTime | number | 支付时间戳 |
| orderStatus | number | 订单状态,合法值见下表 |
| attach | string | 透传数据 |
| returnUrl | string | 透传支付成功跳转地址 |
orderStatus 合法值
| 值 | 说明 |
|---|---|
| 10 | 待付款 |
| 21 | 支付成功 |
返回值
| 属性 | 类型 | 必填 | 说明 |
|---|---|---|---|
| status | string | 是 | 返回的状态,success:成功,fail:失败 |
| code | number | 是 | 状态码,成功:200,失败:500 |
| errMsg | string | 否 | 失败时需要返回错误信息 |
签名算法
sign 参数的签名算法,使用小游戏开发设置中的 AppSecret 对支付的请求进行签名,代表请求经过开发者服务端的支付模块发起。
算法说明
签名算法伪代码为:
sign = to_hex(hmac_sha256(app_secret, timestamp + '&' + signData))
Python 实现
import hmac
import hashlib
# sign_data 支付原串
# app_secret 开放平台小程序 AppSecret
# timestamp 时间戳
def gen_sign(sign_data, app_secret, timestamp):
need_encode_body = timestamp + '&' + sign_data
print(need_encode_body)
return hmac.new(
key=app_secret.encode('utf-8'),
msg=need_encode_body.encode('utf-8'),
digestmod=hashlib.sha256
).hexdigest()
