阅读(4075)
赞(10)
接入流程
2020-02-12 17:07:31 更新
商户后端接入
- 用户在商户侧完成商品下单;
- 商户后端调用微信 H5 支付 统一下单接口,获取调起微信 H5 支付的 URL。即统一下单接口返回的 mweb_url 字段值(商户如果不使用微信支付方式,则可忽略该步骤);
- 商户后端生成调用支付宝 app 支付的签名订单信息,即为调起支付宝 app 支付的参数,详见 支付宝 App 支付请求参数说明(商户如果不使用支付宝支付方式,则可忽略该步骤);
- 商户后端对调起小程序收银台的参数进行签名(参考 服务端签名),返回给商户前端;
商户前端(小程序)接入
- 商户前端(小程序)调用 tt.pay 接口,调起小程序收银台,发起支付流程;
- 商户前端(小程序)接收支付结果回调,进行后续业务处理
接入 DEMO
服务端接入
该服务端 DEMO 帮助开发者生成调用 tt.pay 接口的参数,通过参数 AppletVersion 来控制生成的结果,AppletVersion 为固定值 '3.0'
服务端 DEMO 生成订单信息 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¬ify_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×tamp=2019-08-25+16%3A11%3A22&version=1.0",
sign: "15aa99cd80878661a4d442b7540bdf96",
risk_info: '{"ip":"127.0.0.1","device_id":"485737374363263"}'
}
服务端 DEMO 提供 Go、Java、Node 语言版本:
前端(小程序)接入
参考 tt.pay
(1)下单
在使用前,请先在商户后端完成业务订单创建,然后调用 Server SDK (参考服务端接入)方法,生成调起小程序收银台的订单信息参数 orderInfo:
{
app_id: "800000040005",
sign_type: "MD5",
out_order_no: "xxxx",
merchant_id: "1300000004",
...
}
商户前端拿到 orderInfo参数后,使用 tt.pay 发起支付流程
tt.pay({
orderInfo: orderInfo,
...
})
(2)查询微信支付结果
由于开发者未将微信和支付宝的密钥交付给字节跳动,无法代为发起交易,所以从小程序发起支付跳转微信之后,微信支付订单可能处于支付成功,取消等状态;此时需要商户前端实现 getOrderStatus 方法,用于在商户侧查询订单的支付状态,getOrderStatus 需开发者自行实现:
tt.pay({
...
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);
}
});
});
},
...
})
resolve 的参数为一个对象,其中 code 是一个 number:
- 0:支付成功
- 1:支付超时
- 2:支付失败
- 3:支付关闭
- 9:订单状态未知
(3)支付结果
参考 tt.pay
支付结果返回后有以下两个注意点:
- 由于字节跳动无法代为发起交易,因而准确的订单状态(成功,失败...etc)信息以商户在微信支付/支付宝的订单状态为准;在触发 tt.pay success 回调后,保险起见(例如支付宝已成功支付,但用户杀掉 app 导致回跳失败)商户前端可轮询商户服务端获取准确的微信支付/支付宝的订单状态
// 这只是一个轮询查单的示例,请根据实际情况实现轮询查单 tt.pay({ ... success(res) { if (res.code == 0) { // 支付成功处理逻辑,只有res.code=0时,才表示支付成功 // 但是最终状态要以商户后端结果为准 let count = 0 let timer = setTimeout(() => { // 自行选择轮询次数 if (count > 3) { clearTimeout(timer) // 商户根据自身需求处理轮询完未成功的状态 return } // 商户前端根据 out_order_no 请求商户后端查询微信/支付宝支付订单状态 tt.request({ url: "<your-backend-url>", success(res) { // 商户后端查询到的微信/支付宝订单状态 }, fail(err) { // 处理请求失败 } }); count++ }, 500) } } ... })
- 商户维护订单信息:商户服务端需使用自己的数据库维护支付订单信息,便于用户后续查询订单进度,联系商户退款等操作
← 申请开通支付