阅读(1515) (0)

tt.pay

2020-02-12 17:05:23 更新

调起字节跳动小程序收银台支付,或者微信、支付宝 API 支付。详细接入文档见:小程序收银台(pay)接入文档

支持支付方式:微信支付、支付宝收银台支付支持版本:今日头条(iOS / Android)7.2.7+版本,抖音(Android)7.1.0+版本/(iOS)8.6.0+版本API 支付支持版本:今日头条(iOS / Android)7.4.3+版本


输入

object 类型,属性如下:

属性类型默认值必填说明最低支持版本
successfunction接口调用成功的回调函数1.19.0
completefunction接口调用结束的回调函数(调用成功、失败都会执行)1.19.0
failfunction接口调用失败的回调函数1.19.0
orderInfoobject调起小程序支付收银台的签名订单信息。
该对象由开发者服务端产生并经过 服务端签名 加上 sign 字段后返回;返回后小程序端 请不要修改 orderInfo 上的字段,否则将会导致签名验证失败
1.19.0
servicenumber固定值:1 (拉起小程序收银台)
开发者如果不希望使用头条小程序收银台,service 设置为 3/4 时,可以直接拉起微信/支付宝进行支付:
service=3: 微信 API 支付,不拉起小程序收银台;
service=4: 支付宝 API 支付,不拉起小程序收银台。==其中 service=3、4,仅在 1.35.0.1+基础库(头条 743+)支持==
1.19.0
getOrderStatusfunction商户前端实现的查询支付订单状态方法(该方法需要返回个 Promise 对象), service=3、4 时不需要传1.19.0
_debugnumber0仅限调试用,上线前去掉该参数。_debug=1 时,微信支付期间可以看到中间报错信息,方便调试1.19.0

orderInfo 属性如下:

属性类型必填是否参与签名说明
merchant_idstring头条支付分配给商户的商户号
app_idstring头条支付分配给商户 app_id,用于获取加签秘钥信息。
sign_typestring固定值:MD5。商户生成签名的算法类型
timestampstring发送请求的时间戳,精确到秒
versionstring固定值:2.0
trade_typestring固定值:H5
signstring签名,具体签名方案见 服务端签名
product_codestring固定值:pay
payment_typestring固定值:direct
out_order_nostring商户订单号
uidstring用户在商户侧唯一标志,长度:32 位
total_amountnumber金额,整型,单位:分(不能有小数)
currencystring固定值: CNY。币种
subjectstring商户订单名称;如果是测试接入,请务必填写:xxx 业务xx 活动测试,例如,懂车帝xx 活动测试
bodystring商户订单详情
trade_timestring下单时间戳,精确到秒
valid_timestring订单有效时间(单位 秒)
notify_urlstring填任意非空 URL 即可(该字段含义为:银行卡支付的回调地址,未开通银行卡支付的开发者,该字段值填非空 URL 地址)
alipay_urlstring调用支付宝 App 支付所需的支付请求参数(形如 'app_id=xxx&biz_content=xxx...'),详见支付宝 App 支付请求参数说明
service=1 时,如不传则不展示支付宝支付;
service=4 时必传。
wx_urlstring调用微信 H5 支付统一下单接口 返回的 mweb_url 字段值(请注意不要进行 urlencode)。
service=1 时,如不传则不展示微信支付;
service=3 时必传。
wx_typestringwx_url 非空时传 'MWEB'。wx_url 为空时,该字段不传
risk_infostring支付风控参数。序列化后的 JSON 结构字符串,JSON 结构如下:{ip: '用户外网IP', device_id: '用户设备唯一标识'}
说明:service=3|4 时,merchant_id, app_id, sign_type, sign, wx_url, alipay_url, wx_type 字段值必须是真实信息;其他字段传非空、符合格式要求内容即可,不强制要求是真实订单信息

getOrderStatus

由于开发者不能将微信和支付宝的密钥交付给字节跳动,无法代为发起交易,所以从小程序发起支付跳转微信之后,微信支付订单可能处于支付成功,取消等状态;此时用户回到小程序后需要商户通知微信支付的结果用于处理收银台后续交互

该函数需要开发者自己实现,该函数功能是:开发者前端通过商户订单号(out_order_no),向开发者后端查询微信订单的支付状态,将该订单支付状态返回给收银台。

该函数需要返回 Promise 对象,实现方案参考 代码示例。

  • 入参 {out_order_no: <商户订单号>},其中,out_order_no 为商户系统内部订单号,必传
  • 出参 {code},其中 code 是一个 Int 类型:0:支付成功1:支付超时2:支付失败3:支付关闭9:订单状态未知/未支付

请注意:只有商户后端查询到微信支付订单明确的终态(0,1,2,3)时才传这几个订单状态,收银台在接收到这几个状态后,会自动关闭收银台;如果订单状态未明确(例如跳转微信未支付返回)则传 9,收银台接收到这个状态后不会关闭收银台,用户可以继续发起确认支付操作。

success 返回参数说明

属性类型说明
codenumber0:支付成功 1:支付超时 2:支付失败 3:支付关闭 4:支付取消 9:订单状态开发者自行获取。只要调起收银台成功,支付状态都会回调success返回,开发者依据返回的 code 值,进行后续业务逻辑处理

fail 返回参数说明

object 类型,属性如下:

属性类型说明
errMsgstringAPI 支付错误码:10000- 支付失败,10001- 调起微信失败,10002- 微信未安装


代码示例

tt.pay({
  orderInfo: {
    app_id: "800000040005",
    sign_type: "MD5",
    out_order_no: "MicroApp7075638135",
    merchant_id: "1300000004",
    timestamp: "1566720681",
    product_code: "pay",
    payment_type: "direct",
    total_amount: 1,
    trade_type: "H5",
    uid: "2019012211",
    version: "2.0",
    currency: "CNY",
    subject: "microapp test",
    body: "microapp test",
    trade_time: "1566720681",
    valid_time: "300",
    notify_url: "https://tp-pay.snssdk.com/cashdesk/test/paycallback",
    wx_url:
      "https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?prepay_id=wx25161122572189727ea14cfd1832451500&package=2746219290",
    wx_type: "MWEB",
    alipay_url:
      "alipay_sdk=alipay-sdk-java-3.4.27.ALL&app_id=2018061460417275&biz_content=%7B%22body%22%3A%22%E6%B5%8B%E8%AF%95%E8%AE%A2%E5%8D%95%22%2C%22extend_params%22%3A%7B%7D%2C%22out_trade_no%22%3A%2211908250000028453790%22%2C%22product_code%22%3A%22QUICK_MSECURITY_PAY%22%2C%22seller_id%22%3A%222088721387102560%22%2C%22subject%22%3A%22%E6%B5%8B%E8%AF%95%E8%AE%A2%E5%8D%95%22%2C%22timeout_express%22%3A%22599m%22%2C%22total_amount%22%3A%220.01%22%7D&charset=utf-8&format=json&method=alipay.trade.app.pay&notify_url=http%3A%2F%2Fapi-test-pcs.snssdk.com%2Fgateway%2Fpayment%2Fcallback%2Falipay%2Fnotify%2Fpay&sign=D2A6ua51os2aIzIH907ppK7Bd9Q2Kk5h7AtKPdudP%2Be%2BNTtAkp0Lfojtgl4BMOIQ3Z7cWyYMx6nk4qbntSx7aZnBhWAcImLbVVr1cmaYAedmrmJG%2B3f8G5TfAZu53ESzUgk02%2FhU1XV0iXRyE8TdEJ97ufmxwsUEc7K0EvwEFDIBCJg73meQtyCRFgCqYRWvmxetQgL7pwfKXpFXjAYsvFrRBas2YGYt689XpBS321g%2BZ8SZ0JOtLPWqhROzEs3dnAtWBW15y3NzRiSNi5rPzah4cWd4SgT0LZHmNf3eDQEHEcPmofoWfnA4ao75JmP95aLUxerMumzo9OwqhiYOUw%3D%3D&sign_type=RSA2&timestamp=2019-08-25+16%3A11%3A22&version=1.0",
    sign: "15aa99cd80878661a4d442b7540bdf96",
    risk_info: '{"ip":"127.0.0.1","device_id":"485737374363263"}'
  },
  service: 1,
  getOrderStatus(res) {
    let { out_order_no } = res;
    return new Promise(function(resolve, reject) {
      // 商户前端根据 out_order_no 请求商户后端查询微信支付订单状态
      tt.request({
        url: "<your-backend-url>",
        success(res) {
          // 商户后端查询的微信支付状态,通知收银台支付结果
          resolve({ code: 0 | 1 | 2 | 3 | 9 });
        },
        fail(err) {
          reject(err);
        }
      });
    });
  },
  success(res) {
    if (res.code == 0) {
      // 支付成功处理逻辑,只有res.code=0时,才表示支付成功
      // 但是最终状态要以商户后端结果为准
    }
  },
  fail(res) {
    // 调起收银台失败处理逻辑
  }
});