支付流程示意圖
- 預(yù)支付(請(qǐng)求后臺(tái),后臺(tái)請(qǐng)求微信服務(wù)獲取支付信息)
- 調(diào)用
API
發(fā)起支付:wx.requestPayment({})
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 = 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ù) |
類(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)類(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) {
}
})
}
})