一肪笋、公眾號支付
①開發(fā)步驟
1谈截、設(shè)置測試目錄
在微信公眾平臺設(shè)置加酵,欄目見圖1.1。支付測試狀態(tài)下,設(shè)置測試目錄,測試人的微信號添加到白名單,發(fā)起支付的頁面目錄必須與設(shè)置的精確匹配京景。并將支付鏈接發(fā)到對應(yīng)的公眾號會話窗口中才能正常發(fā)起支付測試。注意正式目錄一定不能與測試目錄設(shè)置成一樣骗奖,否則支付會出錯确徙。

2、設(shè)置正式支付目錄
根據(jù)圖中欄目順序進入修改欄目执桌,勾選JSAPI網(wǎng)頁支付開通該權(quán)限鄙皇,并配置好支付授權(quán)目錄,該目錄必須是發(fā)起支付的頁面的精確目錄仰挣,子目錄下無法正常調(diào)用支付伴逸。具體界面如圖1.2所示:

②業(yè)務(wù)流程
業(yè)務(wù)流程時序圖
商戶系統(tǒng)和微信支付系統(tǒng)主要交互:
1、商戶server調(diào)用統(tǒng)一下單接口請求訂單膘壶,api參見公共api【統(tǒng)一下單API】
2错蝴、商戶server接收支付通知,api參見公共api【支付結(jié)果通知API】
3颓芭、商戶server查詢支付結(jié)果顷锰,api參見公共api【查詢訂單API】
③獲取微信版本號
由于微信5.0版本后才加入微信支付模塊,低版本用戶調(diào)用微信支付功能將無效亡问。因此官紫,建議商戶通過user agent來確定用戶當前的版本號后再調(diào)用支付接口。以iPhone版本為例玛界,可以通過user agent可獲取如下微信版本示例信息:
"Mozilla/5.0(iphone;CPU iphone OS 5_1_1 like Mac OS X)
AppleWebKit/534.46(KHTML,like Geocko) Mobile/9B206 MicroMessenger/5.0"
其中5.0為用戶安裝的微信版本號万矾,商戶可以解析以上HTTP頭,獲取到微信版本號是否高于或者等于5.0慎框。
④網(wǎng)頁端調(diào)起支付API
1、目前微信支付jsapi支付支持兩種調(diào)用方式:
1. WeixinJSBridge調(diào)用模式:
通過WeixinJSBridge調(diào)用getBrandWCPayRequest發(fā)起支付后添,該方式支持普通商戶以及服務(wù)商子商戶
2. jssdk調(diào)用模式:
通過jssdk調(diào)用chooseWXPay發(fā)起支付笨枯,該方式支持普通商戶
注意:如果調(diào)用方為普通商戶,可任意采用上述兩種調(diào)用方式,如果調(diào)用方為服務(wù)商子商戶馅精,需要采用WeixinJSBridge的調(diào)用方式
3严嗜、WeixinJSBridge調(diào)用模式
在微信瀏覽器里面打開H5網(wǎng)頁中執(zhí)行JS調(diào)起支付。接口輸入輸出數(shù)據(jù)格式為JSON洲敢。
注意:WeixinJSBridge內(nèi)置對象在其他瀏覽器中無效漫玄。
列表中參數(shù)名區(qū)分大小,大小寫錯誤簽名驗證會失敗压彭。getBrandWCPayRequest參數(shù)以及返回值定義見圖7.1睦优,返回列表值說明見圖7.2。
表7.1 網(wǎng)頁端接口參數(shù)列表:
名稱 | 變量名 | 必填 | 類型 | 示例值 | 描述 |
---|---|---|---|---|---|
公眾號id | appId | 是 | String(16) | wx8888888 888888888 |
商戶注冊具有支付權(quán)限的公眾號成功后即可獲得 |
時間戳 | timeStamp | 是 | String(32) | 1414561699 | 當前的時間壮不,其他詳見時間戳規(guī)則 |
隨機字符串 | nonceStr | 是 | String(32) | 5K8264ILTKCH16CQ2 502SI8ZNMTM67VS |
隨機字符串汗盘,不長于32位。推薦隨機數(shù)生成算法 |
訂單詳情擴展字符串 | package | 是 | String(128) | prepay_id=123456789 | 統(tǒng)一下單接口返回的prepay_id參數(shù)值询一,提交格式如:prepay_id=*** |
簽名方式 | signType | 是 | String(32) | MD5 | 簽名算法隐孽,暫支持MD5 |
簽名 | paySign | 是 | String(64) | C380BEC2BFD727A4 B6845133519F3AD6 |
簽名,詳見簽名生成算法 |
表7.2 網(wǎng)頁內(nèi)支付接口err_msg返回結(jié)果值說明:
返回值 | 描述 |
---|---|
get_brand_wcpay_request:ok | 支付成功 |
get_brand_wcpay_request:cancel | 支付過程中用戶取消 |
get_brand_wcpay_request:fail | 支付失敗 |
注:JS API的返回結(jié)果
get_brand_wcpay_request:
ok僅在用戶成功完成支付時返回健蕊。
由于前端交互復(fù)雜菱阵,get_brand_wcpay_request:cancel
或者get_brand_wcpay_request:fail
可以統(tǒng)一處理為用戶遇到錯誤或者主動放棄,不必細化區(qū)分缩功。
示例代碼如下:
function onBridgeReady({
WeixinJSBridge.invoke(
'getBrandWCPayRequest', {
"appId" : "wx2421b1c4370ec43b", //公眾號名稱晴及,由商戶傳入
"timeStamp":" 1395712654", //時間戳,自1970年以來的秒數(shù)
"nonceStr" : "e61463f8efa94090b1f366cccfbbb444", //隨機串
"package" : "prepay_id=u802345jgfjsdfgsdg888",
"signType" : "MD5", //微信簽名方式:
"paySign" : "70EA570631E4BB79628FBCA90534C63FF7FADD89" //微信簽名
},
function(res){
// 使用以上方式判斷前端返回,微信團隊鄭重提示:res.err_msg將在用戶支付成功后返回
//ok掂之,但并不保證它絕對可靠抗俄。
if(res.err_msg == "get_brand_wcpay_request:ok" ) {
}
}
);
}
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();
}
4、jssdk調(diào)用模式
在微信瀏覽器里面打開H5網(wǎng)頁中執(zhí)行JS調(diào)起支付世舰。接口輸入輸出數(shù)據(jù)格式為JSON动雹。
列表中參數(shù)名區(qū)分大小,大小寫錯誤簽名驗證會失敗跟压。
chooseWXPay參數(shù)以及返回值定義見圖7.3胰蝠,返回列表值說明見圖7.4。


表7.3 網(wǎng)頁端接口參數(shù)列表:
注意:jssdk中timestamp均為小寫
名稱 | 變量名 | 必填 | 類型 | 示例值 | 描述 |
---|---|---|---|---|---|
時間戳 | timestamp | 是 | String(32) | 1414561699 | 當前的時間震蒋,其他詳見時間戳規(guī)則 |
隨機字符串 | nonceStr | 是 | String(32) | 5K8264ILTKCH16CQ 2502SI8ZNMTM67VS |
隨機字符串茸塞,不長于32位。推薦隨機數(shù)生成算法 |
訂單詳情擴展字符串 | package | 是 | String(128) | prepay_id=123456789 | 統(tǒng)一下單接口返回的prepay_id參數(shù)值查剖,提交格式如:prepay_id=*** |
簽名方式 | signType | 是 | String(32) | MD5 | 簽名算法钾虐,暫支持MD5 |
簽名 | paySign | 是 | String(64) | C380BEC2BFD727A4 B6845133519F3AD6 |
簽名,詳見簽名生成算法 |
表7.4 網(wǎng)頁內(nèi)支付接口err_msg返回結(jié)果值說明:
返回值 | 描述 |
---|---|
get_brand_wcpay_request:ok | 支付成功 |
get_brand_wcpay_request:cancel | 支付過程中用戶取消 |
get_brand_wcpay_request:fail | 支付失敗 |
注:JS API的返回結(jié)果get_brand_wcpay_request:ok僅在用戶成功完成支付時返回笋庄。由于前端交互復(fù)雜效扫,get_brand_wcpay_request:cancel或者get_brand_wcpay_request:fail可以統(tǒng)一處理為用戶遇到錯誤或者主動放棄倔监,不必細化區(qū)分。
示例代碼如下:
wx.config({
// 開啟調(diào)試模式,調(diào)用的所有api的返回值會在客戶端alert出來菌仁,若要查看傳入的參數(shù)浩习,
// 可以在pc端打開,參數(shù)信息會通過log打出济丘,僅在pc端時才會打印谱秽。
debug: true,
appId: 'wx2421b1c4370ec43b', // 必填,公眾號的唯一標識
timestamp: 1414561699, // 必填摹迷,生成簽名的時間戳
nonceStr: '5K8264ILTKCH16CQ2502SI8ZNMTM67VS', // 必填疟赊,生成簽名的隨機串
signature: 'C380BEC2BFD727A4B6845133519F3AD6',// 必填,簽名泪掀,見附錄1
jsApiList: ['chooseWXPay'] // 必填听绳,需要使用的JS接口列表,所有JS接口列表見附錄2
});
wx.ready(function(){
wx.chooseWXPay({
timestamp: 1395712654, // 支付簽名時間戳
nonceStr: 'e61463f8efa94090b1f366cccfbbb444', // 支付簽名隨機串异赫,不長于 32 位
//統(tǒng)一支付接口返回的prepay_id參數(shù)值椅挣,提交格式如:prepay_id=**\*
package: 'prepay_id=u802345jgfjsdfgsdg888',
signType: 'MD5', // 簽名方式,默認為'SHA1'塔拳,使用新版支付需傳入'MD5'
paySign: '70EA570631E4BB79628FBCA90534C63FF7FADD89', // 支付簽名
success: function (res) { // 支付成功后的回調(diào)函數(shù)
if(res.err_msg == "get_brand_wcpay_request:ok" ) {
} // 使用以上方式判斷前端返回,微信團隊鄭重提示:res.err_msg將在用戶支付成功后返回 ok鼠证,但并不保證它絕對可靠。
}
});
});