微信小程序打夯之旅(六):支付流程

支付流程示意圖

  1. 預(yù)支付(請(qǐng)求后臺(tái),后臺(tái)請(qǐng)求微信服務(wù)獲取支付信息)
  2. 調(diào)用 API 發(fā)起支付:wx.requestPayment({})
image

jsAPI、jsSDK、小程序支付的對(duì)比(開(kāi)發(fā)步驟)

對(duì)比欄目 JSAPI JSSDK 小程序
統(tǒng)一下單 都需要先獲取到Openid,調(diào)用相同的API
調(diào)起數(shù)據(jù)簽名 五個(gè)字段參與簽名(區(qū)分大小寫(xiě)):appId,nonceStr,package,signType,timeStamp
調(diào)起支付頁(yè)面協(xié)議 HTTP或HTTPS HTTP或HTTPS HTTPS
支付目錄 無(wú)
授權(quán)域名 無(wú)
回調(diào)函數(shù) success回調(diào) complete、fail、success回調(diào)函數(shù)

小程序調(diào)起支付 API 說(shuō)明

wx.requestPayment(
{
  'timeStamp': '',
  'nonceStr': '',
  'package': '',
  'signType': 'MD5',
  'paySign': '',
  'success':function(res){},
  'fail':function(res){},
  'complete':function(res){}
})
  • paySign 字段包含信息說(shuō)明:
paySign = MD5(appId=wxd678efh567hg6787&nonceStr=5K8264ILTKCH16CQ2502SI8ZNMTM67VS&package=prepay_id=wx2017033010242291fcfe0db70013231072&signType=MD5&timeStamp=1490840662&key=qazwsxedcrfvtgbyhnujmikolp111111) = 22D9B4E54AB1950F51E0649E8810ACD6
字段名 變量名 必填 類(lèi)型 示例值 描述
小程序ID appId String wx***6787 微信分配的小程序ID
時(shí)間戳 timeStamp String 14***662 時(shí)間戳從1970年1月1日00:00:00至今的秒數(shù),即當(dāng)前的時(shí)間
隨機(jī)串 nonceStr String 5K***67VS 隨機(jī)字符串,不長(zhǎng)于32位。推薦隨機(jī)數(shù)生成算法
數(shù)據(jù)包 package String prepay_id=wx***1072 統(tǒng)一下單接口返回的 prepay_id 參數(shù)值,提交格式如:prepay_id=wx**1072
簽名方式 signType String MD5 簽名類(lèi)型,默認(rèn)為MD5,支持HMAC-SHA256和MD5。注意此處需與統(tǒng)一下單的簽名類(lèi)型一致
  • 參數(shù)說(shuō)明:
參數(shù) 類(lèi)型 必填 說(shuō)明
timeStamp String 時(shí)間戳從1970年1月1日00:00:00至今的秒數(shù),即當(dāng)前的時(shí)間
nonceStr String 隨機(jī)字符串,長(zhǎng)度為32個(gè)字符以下。
package String 統(tǒng)一下單接口返回的 prepay_id 參數(shù)值,提交格式如:prepay_id=*
signType String 簽名類(lèi)型,默認(rèn)為MD5,支持HMAC-SHA256和MD5。注意此處需與統(tǒng)一下單的簽名類(lèi)型一致
paySign String 簽名,具體簽名方案參見(jiàn)微信公眾號(hào)支付幫助文檔;
success Function 接口調(diào)用成功的回調(diào)函數(shù)
fail Function 接口調(diào)用失敗的回調(diào)函數(shù)
complete Function 接口調(diào)用結(jié)束的回調(diào)函數(shù)(調(diào)用成功、失敗都會(huì)執(zhí)行)
  • 回調(diào)說(shuō)明:
回調(diào)類(lèi)型 errMsg 說(shuō)明
success requestPayment:ok 調(diào)用支付成功
fail requestPayment:fail cancel 用戶(hù)取消支付
fail requestPayment:fail (detail message) 調(diào)用支付失敗,其中 detail message 為后臺(tái)返回的詳細(xì)失敗原因

預(yù)支付流程

前端提交需支付的信息到開(kāi)發(fā)者服務(wù)器,開(kāi)發(fā)者服務(wù)器再提交到微信,而后返回需要的信息

{
    "sign":"A2****************A6",

    "timestamp":"14****************68",

    "package":"Sign=WXPay",

    "partnerId":"14****************02",

    "appid":"wx****************ab",

    "nonceStr":"9f****************37",

    "prepayId":"wx****************54"

}

發(fā)起支付

md5下載鏈接:https://code.csdn.net/snippets/2019875/master/download

var MD5Util = require('../../../utils/md5.js');
var sign = '';
var signA = "appId="+app.appId+"&nonceStr="+res.data.nonceStr+"&package=prepay_id="+res.data.prepayId+"&signType=MD5&timeStamp="+res.data.timestamp;
var signB = signA+"&key="+app.key;
sign = MD5Util.MD5(signB).toUpperCase();

wx.requestPayment({
    nonceStr: res.data.nonceStr,
    package: "prepay_id="+res.data.prepayId,
    signType: 'MD5',
    timeStamp: res.data.timestamp,
    paySign: sign,
    success: function(res){
      console.log("支付成功");
    },
    fail: function() {
    },
    complete: function() {
    }
})

代碼Demo

wx.request({
  url: 'https://調(diào)用服務(wù)器獲取微信統(tǒng)一下單數(shù)據(jù)',
  method: 'GET',
  data: { uid: uid, id: id },
  success: function (res) {
    var nowTime = new Date()
    var appId = res.data.appid
    var timeStamp1 = Math.round((nowTime.getTime()) / 1000)
    var timeStamp = timeStamp1.toString()
    var nonceStr = res.data.nonce_str
    var package = "prepay_id=" + res.data.prepay_id
    var signType = "MD5"
    var key = "Niskh5234234WYk4323HyE78m2sE"http://商戶(hù)平臺(tái)的key
    var sign = res.data.sign
    var paySign = md5.hexMD5("appId=" + appId + "&nonceStr=" + nonceStr + "&package=" + package + "&signType=MD5&timeStamp=" + timeStamp + "&key=" + key)
    wx.requestPayment({
      timeStamp: timeStamp,
      //隨機(jī)字符串,長(zhǎng)度為32個(gè)字符以下。
      nonceStr: nonceStr,
      //統(tǒng)一下單接口返回的 prepay_id 參數(shù)值,提交格式如:prepay_id=*
      package: package,
      //簽名算法,暫支持 MD5
      signType: 'MD5',
      paySign: paySign,
      success: function (res) {
      },
      fail: function (res) {
      },
      complete: function (res) {
      }
    })
  }
})
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容