微信支付整理 (微信公众号支付)
由于本人愚鈍,在最初接觸微信支付時遇到很多坑。在第一次將微信支付調試成功之后在網上炫耀般的留了一個qq(24xxxx)號,以便幫助到更多的人。由此便接觸到了大概100多號人的qq詢問,期間也拒絕了很多人的好友請求。
屆時不入把微信支付仔細整理下(本人的第一篇博文):
要了解微信得要有一個大概的脈絡。你得知道微信公眾號支付涉及2個東西? 微信公眾平臺 和 微信商戶平臺(微信支付的賬號)。
當時在開發微信支付時在網上有看到過很好的解釋。這就有點像一個餐廳里面有收銀臺(微信支付)以及不同的餐桌(公眾平臺)。當我們需要涉及金錢交易時才和微信支付打交道。其余的操作都是和微信公眾平臺打交道(如:喚起微信的語音、卡券功能等)。
在理解了上述概念后,就得詳細查閱微信支付文檔里,我就不按照官方文檔的步驟進行了。
第一步:要搞定就是【統一下單】在調用接口時我們內部系統已經生成了對應客戶的訂單號 以及內部財務系統的流水號以便對賬。一般很多網友咨詢都是調用這個微信返回 ”簽名錯誤“,而且很多網友是和官方簽名調試工具返回的結果是一樣的也返回 簽名錯誤。所以這里就很納悶了一度陷入苦苦掙扎。
第一步需要注意的地方有以下幾點:
1.發起請求的參數名要和文檔一致,包括字母大小寫
2.規定必須要傳的參數一定要傳,特別注意參數的定義與規則。例如:通知地址【notify_url】,官方規定:通知url必須為外網可訪問的url,不能攜帶參數。有很多網友是直接拷貝的示例值或者localhost的url地址發起請求。由此一定要看清文檔的規定
3.生成簽名sign。
官方舉例:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_3
有好幾個網友在進行到這一步時由于比較暴力,在看到官方示例中只有【appid? mch_id? device_info? body? nonce_str?】這幾個參數后就強行忽視文檔中規定的必須傳遞的參數只保留這幾個參數進行接口訪問 這也是比較粗心的問題造成;
當然還有需要注意的是在參與簽名時需要附加一個key(支付密鑰:是在微信支付平臺里面進行設置的)進行md5加密以保證數據是安全,因為我當初開發的時候也在這里迷惑了很久。在開發微信商城時一開始記得的密鑰是appsecret(這個緊跟的一般是appid),所以很多網友一直將這個appsecret作為key進行簽名;
如若以上問題你都確定無誤恭喜你,你還是有可能得到”簽名錯誤“,一般這種時候整個人都不好了。沒事我來給你舉例子,到這個地步了朋友再堅持堅持 你就勝利。往往這個時候我們不能總是怪文檔寫的不過清晰明白,我們得體會了。你懂了吧。因為我們已經嚴格按照文檔進行的每一步操作,所以我們有必要在進行一次上述問題的查漏。看是否有粗心造成的或者是復制粘貼的是在字符串中多留了一個空字符。如果你能1000%的確定上述提到過的地方我都檢查過了。那么你只剩下最后一步了,檢查你的MD5加密方法,在與網友交流的過程中他們最后發現 由內部同時提供的工具類Md5加密中居然悄悄的將utf-8格式給換了。修復這個bug你就成功了。
說道這里可算是解決了關鍵的一步:向微信下單【統一下單】
接下來就到了第二步:前臺js喚起微信支付
官方文檔地址為:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115
模塊為:微信網頁開發->微信JS-SDK說明文檔->發起一個微信支付請求
wx.chooseWXPay({ timestamp: 0, // 支付簽名時間戳,注意微信jssdk中的所有使用timestamp字段均為小寫。但最新版的支付后臺生成簽名使用的timeStamp字段名需大寫其中的S字符 nonceStr: '', // 支付簽名隨機串,不長于 32 位 package: '', // 統一支付接口返回的prepay_id參數值,提交格式如:prepay_id=\*\*\*) signType: '', // 簽名方式,默認為'SHA1',使用新版支付需傳入'MD5' paySign: '', // 支付簽名 success: function (res) { // 支付成功后的回調函數 } });備注:prepay_id 通過微信支付統一下單接口拿到,paySign 采用統一的微信支付 Sign 簽名生成方法,注意這里 appId 也要參與簽名,appId 與 config 中傳入的 appId 一致,即最后參與簽名的參數有appId, timeStamp, nonceStr, package, signType。
但是在微信支付平臺的文檔中也有一個示例:
模塊為:公眾號支付->微信內H5調起支付
示例代碼如下:
function?onBridgeReady(){
???WeixinJSBridge.invoke(
???????'getBrandWCPayRequest',?{
???????????"appId":"wx2421b1c4370ec43b",?????//公眾號名稱,由商戶傳入?????
???????????"timeStamp":"1395712654",?????????//時間戳,自1970年以來的秒數?????
???????????"nonceStr":"e61463f8efa94090b1f366cccfbbb444",?//隨機串?????
???????????"package":"prepay_id=u802345jgfjsdfgsdg888",?????
???????????"signType":"MD5",?????????//微信簽名方式:?????
???????????"paySign":"70EA570631E4BB79628FBCA90534C63FF7FADD89"?//微信簽名?
???????},
???????function(res){?????
???????????if(res.err_msg?==?"get_brand_wcpay_request:ok"?)?{}?????//?使用以上方式判斷前端返回,微信團隊鄭重提示:res.err_msg將在用戶支付成功后返回????ok,但并不保證它絕對可靠。?
???????}
???);?
}
這里很多人就有點懵了,我們先不管。分析其中的共同點,在js調起中涉及的appId, timeStamp, nonceStr, package, signType生成
在文檔中沒有明確的說明生成這個js調起支付的sign 是和 發起【統一下單】的生成規則是一樣的。因為在開發微信時很多時候要使用到像獲取用戶相機、錄音等功能。里面也涉及到sign。
我這里就不ao述這其中的曲折故事。只是要明白的就是這個sign 生成方法和【統一下單】生成規則一樣。具體請看第一步中的注意事項
順利到達這里,我相信你已經不會再犯參數字母錯別字等等錯誤了
第二步需要注意的有以下幾點:
1.其中"package":"prepay_id=u802345jgfjsdfgsdg888",? ? ?在這個字段的值要按照這種格式組裝
2.生成簽名時也是需要【支付密鑰】進行信息加密處理的
接下來就到了html頁面了。將剛剛生成的?appId, timeStamp, nonceStr, package, signType 以及 sign 通過接口的方式返回給前端進行script 組裝
這里 一般會報調起支付失敗,一般原因有以下幾種可能(wx.chooseWXPay({})的調起方式):
a.js接口沒有驗證通過(這個就自己參考文檔了https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115? ? ? ? 按照文檔一步一步就可以了)
b.js權限沒有注冊,將接口添加到權限列表中即可
c.支付目錄沒有設置正確 ,支付目錄的設置目前已經搬遷到 微信商戶平臺進行設置了(最開始的時候是在公眾平臺進行設置)。設置支付目錄需要注意設置的url必須要和你發起請求的url完全一致,例如:發起請求的url為:http://a.xxx.com/abc/def;但是設置的支付目錄url為:http://a.xxx.com/Abc/Def;這其實是錯誤的設置方式。在設置支付目錄時官方的提示是最好是能到具體的action(http://xxxx/controller/action)稱為三級支付目錄,在我開發中 只設置了 二級支付目錄(http://xxxx/controller/),這樣設置有一個好處就是,當你需要在這個controller下面涉及多個支付頁面時不需要再新增支付目錄了。當然我沒有試過最暴力的設置只填寫域名(http://xxx/),(在官網介紹中提及測試支付目錄,我沒有使用過也就不說了)。
到這里 基本就能調起微信支付了
其實這個過程忽略了很多其他例如:獲取用戶openid,以及微信的access_token的獲取等,這些信息的獲取的話嚴格按照文檔進行是ok的。
微信公眾號支付? 總結:
其實遇到這么多錯誤,很多時候我們就是一味的吐槽和抱怨 官方文檔的 不清晰明了。轉而讓自身陷入一個負面情緒中去,其實程序員也是需要 匠心獨運 的一個藝術活。不過微信支付涉及的東西比較雜但是官方文檔卻沒有一個比較清晰的說明。只是純粹的說明api接口以及js調用的規則,而并沒有一個比較概括性的東西 著眼于全局的思想進行考慮這個文檔該如何布局和呈現。
總結
以上是生活随笔為你收集整理的微信支付整理 (微信公众号支付)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信JSAPI支付调不起收银台问题
- 下一篇: mongodb添加多条数据_mongod