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