相信程序猿們都開(kāi)發(fā)過(guò)電商類的項(xiàng)目,那就會(huì)有支付功能。
我聽(tīng)說(shuō),微信有很多坑,我好慌......
一、設(shè)置支付目錄
請(qǐng)確保實(shí)際支付時(shí)的請(qǐng)求目錄與后臺(tái)配置的目錄一致(現(xiàn)在已經(jīng)支持配置根目錄,配置后有一定的生效時(shí)間,一般5分鐘內(nèi)生效),否則將無(wú)法成功喚起微信支付。
在微信商戶平臺(tái)(pay.weixin.qq.com)設(shè)置您的JSAPI支付支付目錄,設(shè)置路徑:商戶平臺(tái)-->產(chǎn)品中心-->開(kāi)發(fā)配置,如圖7.7所示。JSAPI支付在請(qǐng)求支付的時(shí)候會(huì)校驗(yàn)請(qǐng)求來(lái)源是否有在商戶平臺(tái)做了配置,所以必須確保支付目錄已經(jīng)正確的被配置,否則將驗(yàn)證失敗,請(qǐng)求支付不成功。`

二、設(shè)置授權(quán)域名
開(kāi)發(fā)JSAPI支付時(shí),在統(tǒng)一下單接口中要求必傳用戶openid,而獲取openid則需要您在公眾平臺(tái)設(shè)置獲取openid的域名,只有被設(shè)置過(guò)的域名才是一個(gè)有效的獲取openid的域名,否則將獲取失敗。具體界面如圖7.8所示:

三、微信內(nèi)H5調(diào)起支付
在微信瀏覽器里面打開(kāi)H5網(wǎng)頁(yè)中執(zhí)行JS調(diào)起支付。接口輸入輸出數(shù)據(jù)格式為JSON。 注意:WeixinJSBridge內(nèi)置對(duì)象在其他瀏覽器中無(wú)效。 getBrandWCPayRequest參數(shù)以及返回值定義:
- 1、網(wǎng)頁(yè)端接口請(qǐng)求參數(shù)列表(參數(shù)需要重新進(jìn)行簽名計(jì)算,參與簽名的參數(shù)為:appId、timeStamp、nonceStr、package、signType,參數(shù)區(qū)分大小寫。)
| 名稱 | 變量名 | 必填 | 類型 | 示例值 | 描述 |
|---|---|---|---|---|---|
| 公眾號(hào)id | appId | 是 | String(16) | wx8888888888888888 | 商戶注冊(cè)具有支付權(quán)限的公眾號(hào)成功后即可獲得 |
| 時(shí)間戳 | timeStamp | 是 | String(32) | 1414561699 | 當(dāng)前的時(shí)間,其他詳見(jiàn)時(shí)間戳規(guī)則 |
| 隨機(jī)字符串 | nonceStr | 是 | String(32) | 5K8264ILTKCH16CQ2502SI8ZNMTM67VS | 隨機(jī)字符串,不長(zhǎng)于32位。推薦隨機(jī)數(shù)生成算法 |
| 訂單詳情擴(kuò)展字符串 | package | 是 | String(128) | prepay_id=123456789 | 統(tǒng)一下單接口返回的prepay_id參數(shù)值,提交格式如:prepay_id=*** |
| 簽名方式 | signType | 是 | String(32) | MD5 | 簽名類型,默認(rèn)為MD5,支持HMAC-SHA256和MD5。注意此處需與統(tǒng)一下單的簽名類型一致 |
| 簽名 | paySign | 是 | String(64) | C380BEC2BFD727A4B6845133519F3AD6 | 簽名,詳見(jiàn)簽名生成算法 |
- 2、返回結(jié)果值說(shuō)明
| 返回值 | 描述 |
|---|---|
| get_brand_wcpay_request:ok | 支付成功 |
| get_brand_wcpay_request:cancel | 支付過(guò)程中用戶取消 |
| get_brand_wcpay_request:fail | 支付失敗 |
| 調(diào)用支付JSAPI 少參數(shù):total_fee | 1、請(qǐng)檢查預(yù)支付會(huì)話標(biāo)識(shí)prepay_id是否已失效 2、請(qǐng)求的appid與下單接口的appid是否一致 |
注:JS API的返回結(jié)果get_brand_wcpay_request:ok僅在用戶成功完成支付時(shí)返回。由于前端交互復(fù)雜,get_brand_wcpay_request:cancel或者get_brand_wcpay_request:fail可以統(tǒng)一處理為用戶遇到錯(cuò)誤或者主動(dòng)放棄,不必細(xì)化區(qū)分。
示例代碼如下
// 在你需要的地方復(fù)制下面代碼
// 這里需要的簽名等字段,前端開(kāi)發(fā)者只需要調(diào)用后端指定的接口返回即可。
// 如果你全干,那也是OK的。
// 你是大佬。
function onBridgeReady(){
window.WeixinJSBridge.invoke(
'getBrandWCPayRequest', {
'appId': res.data.appId, // 公眾號(hào)名稱,由商戶傳入
'timeStamp': res.data.timeStamp, // 時(shí)間戳,自1970年以來(lái)的秒數(shù)
'nonceStr': res.data.nonceStr, // 隨機(jī)串
'package': res.data.package,
'signType': res.data.signType, // 微信簽名方式:
'paySign': res.data.paySign // 微信簽名
},
function (res) {
alert(JSON.stringify(res))
if (res.err_msg === 'get_brand_wcpay_request:ok') {
// 使用以上方式判斷前端返回,微信團(tuán)隊(duì)鄭重提示:
// res.err_msg將在用戶支付成功后返回ok,但并不保證它絕對(duì)可靠。
}
})
}
if (typeof WeixinJSBridge == "undefined"){
if( document.addEventListener ){
document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);
}else if (document.attachEvent){
document.attachEvent('WeixinJSBridgeReady', onBridgeReady);
document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);
}
}else{
onBridgeReady();
}
當(dāng)你出現(xiàn)下圖這種方法,說(shuō)明你的授權(quán)域名配置有誤,記住,區(qū)分 http 和 https 的,如果配置的是 http請(qǐng)使用 http訪問(wèn),https即是一樣。

有問(wèn)題,咱一起分享討論。