接入流程

2020-02-12 17:15 更新

商戶后端接入

  • 用戶在商戶側(cè)完成商品下單;
  • 商戶后端調(diào)用微信 H5 支付 統(tǒng)一下單接口,獲取調(diào)起微信 H5 支付的 URL。即統(tǒng)一下單接口返回的 mweb_url 字段值(商戶如果不使用微信支付方式,則可忽略該步驟);
  • 商戶后端生成調(diào)用支付寶 app 支付的簽名訂單信息,即為調(diào)起支付寶 app 支付的參數(shù),詳見(jiàn) 支付寶 App 支付請(qǐng)求參數(shù)說(shuō)明(商戶如果不使用支付寶支付方式,則可忽略該步驟);
  • 商戶后端對(duì)調(diào)起小程序收銀臺(tái)的參數(shù)進(jìn)行簽名(參考 服務(wù)端簽名),返回給商戶前端;


商戶前端(小程序)接入

  • 商戶前端(小程序)調(diào)用 tt.pay 接口,調(diào)起小程序收銀臺(tái),發(fā)起支付流程;
  • 商戶前端(小程序)接收支付結(jié)果回調(diào),進(jìn)行后續(xù)業(yè)務(wù)處理


接入 DEMO

服務(wù)端接入

該服務(wù)端 DEMO 幫助開(kāi)發(fā)者生成調(diào)用 tt.pay 接口的參數(shù),通過(guò)參數(shù) AppletVersion 來(lái)控制生成的結(jié)果,AppletVersion 為固定值 '3.0'

服務(wù)端 DEMO 生成訂單信息 orderInfo 如下(參數(shù)值僅供參考):

{
    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"}'
}

服務(wù)端 DEMO 提供 Go、Java、Node 語(yǔ)言版本:

前端(小程序)接入

參考 tt.pay

(1)下單

在使用前,請(qǐng)先在商戶后端完成業(yè)務(wù)訂單創(chuàng)建,然后調(diào)用 Server SDK (參考服務(wù)端接入)方法,生成調(diào)起小程序收銀臺(tái)的訂單信息參數(shù) orderInfo:

{
    app_id: "800000040005",
    sign_type: "MD5",
    out_order_no: "xxxx",
    merchant_id: "1300000004",
    ...
}

商戶前端拿到 orderInfo參數(shù)后,使用 tt.pay 發(fā)起支付流程

tt.pay({
    orderInfo: orderInfo,
    ...
})

(2)查詢微信支付結(jié)果

由于開(kāi)發(fā)者未將微信和支付寶的密鑰交付給字節(jié)跳動(dòng),無(wú)法代為發(fā)起交易,所以從小程序發(fā)起支付跳轉(zhuǎn)微信之后,微信支付訂單可能處于支付成功,取消等狀態(tài);此時(shí)需要商戶前端實(shí)現(xiàn) getOrderStatus 方法,用于在商戶側(cè)查詢訂單的支付狀態(tài),getOrderStatus 需開(kāi)發(fā)者自行實(shí)現(xiàn):

tt.pay({
    ...
    getOrderStatus(res) {
        let { out_order_no } = res;
        return new Promise(function (resolve, reject) {
            // 商戶前端根據(jù) out_order_no 請(qǐng)求商戶后端,查詢當(dāng)前訂單的支付狀態(tài)
            tt.request({
                url: "<your-backend-url>",
                success(res) {
                    // 商戶后端查詢的訂單支付狀態(tài),返回小程序收銀臺(tái)支付結(jié)果
                    resolve({ code: 0 | 1 | 2 | 3 | 9 });
                },
                fail(err) {
                    reject(err);
                }
            });
        });
    },
    ...
})

resolve 的參數(shù)為一個(gè)對(duì)象,其中 code 是一個(gè) number:

  • 0:支付成功
  • 1:支付超時(shí)
  • 2:支付失敗
  • 3:支付關(guān)閉
  • 9:訂單狀態(tài)未知

(3)支付結(jié)果

參考 tt.pay

支付結(jié)果返回后有以下兩個(gè)注意點(diǎn):

  1. 由于字節(jié)跳動(dòng)無(wú)法代為發(fā)起交易,因而準(zhǔn)確的訂單狀態(tài)(成功,失敗...etc)信息以商戶在微信支付/支付寶的訂單狀態(tài)為準(zhǔn);在觸發(fā) tt.pay success 回調(diào)后,保險(xiǎn)起見(jiàn)(例如支付寶已成功支付,但用戶殺掉 app 導(dǎo)致回跳失?。┥虘羟岸丝奢喸兩虘舴?wù)端獲取準(zhǔn)確的微信支付/支付寶的訂單狀態(tài)
    // 這只是一個(gè)輪詢查單的示例,請(qǐng)根據(jù)實(shí)際情況實(shí)現(xiàn)輪詢查單
    
    tt.pay({
        ...
        success(res) {
            if (res.code == 0) {
                // 支付成功處理邏輯,只有res.code=0時(shí),才表示支付成功
                // 但是最終狀態(tài)要以商戶后端結(jié)果為準(zhǔn)
                let count = 0
    
                let timer = setTimeout(() => {
                    // 自行選擇輪詢次數(shù)
                    if (count > 3) {
                        clearTimeout(timer)
                        // 商戶根據(jù)自身需求處理輪詢完未成功的狀態(tài)
                        return
                    }
    
                    // 商戶前端根據(jù) out_order_no 請(qǐng)求商戶后端查詢微信/支付寶支付訂單狀態(tài)
                    tt.request({
                        url: "<your-backend-url>",
                        success(res) {
                            // 商戶后端查詢到的微信/支付寶訂單狀態(tài)
                        },
                        fail(err) {
                            // 處理請(qǐng)求失敗
                        }
                    });
    
                    count++
                }, 500)
            }
        }
        ...
    })
    
  2. 商戶維護(hù)訂單信息:商戶服務(wù)端需使用自己的數(shù)據(jù)庫(kù)維護(hù)支付訂單信息,便于用戶后續(xù)查詢訂單進(jìn)度,聯(lián)系商戶退款等操作
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)