? ? ? ?早聞微信支付一直為移動開發(fā)者所詬病,這次公司項(xiàng)目新增微信支付需求,一試果然是一把辛酸淚,從配置到與后臺調(diào)試真是一波三折,整整花了一天的時(shí)間才從坑里爬出來,效率也是低。所以有必要做下總結(jié),日后再有微信支付,三兩下便可完事。
因?yàn)楣卷?xiàng)目是RN寫的,我這邊選用了目前在RN上使用較廣泛的微信支付組件,基本上都封裝好了,github直通車:react-native-wechat
? ? ? ?我們只需要實(shí)現(xiàn)兩步就可以調(diào)起微信支付:
- 在應(yīng)用啟動的時(shí)候注冊APPID
WeChat.registerApp('appid');
- 在跳轉(zhuǎn)到微信支付的點(diǎn)擊事件中配置參數(shù):
wechat.isWXAppInstalled().then( ( isInstalled ) => {
if ( isInstalled ) { //判斷手機(jī)是否有安裝微信
wechat.pay({
partnerId: wxinfo.mch_id, // 商家向財(cái)付通申請的商家id
prepayId: wxinfo.prepay_id, // 預(yù)支付訂單
nonceStr: wxinfo.nonce_str, // 隨機(jī)串,防重發(fā)
timeStamp: result.data.time.toString() , // 時(shí)間戳,防重發(fā).
package: 'Sign=WXPay', // 商家根據(jù)財(cái)付通文檔填寫的數(shù)據(jù)和簽名
sign: result.data.sign // 商家根據(jù)微信開放平臺文檔對數(shù)據(jù)做的簽名
}).then((requestJson)=>{
//支付成功回調(diào)
console.log("----微信支付成功----",requestJson);
if (requestJson.errCode=="0"){
//回調(diào)成功處理
}
}).catch((err)=>{
toastShort('支付失敗')
})
} else {
toastShort( '沒有安裝微信軟件,請您安裝微信之后再試' );
}
} );
? ? ? ?以上就是react native調(diào)用微信支付的過程,使用的開源庫已經(jīng)幫我們封裝好了其他的一些配置,用起來也是非常的方便。
? ? ? ?接下來就是在手機(jī)上跑一遍,魯迅說過:“新鮮事物第一次嘗試就想要成功,幾率還是很小的”。當(dāng)我點(diǎn)擊微信支付,期待著跳出熟悉的微信支付界面時(shí),出現(xiàn)了令我失望的結(jié)果:屏幕閃了一下,然后,然后就沒有然后了,what the f...,好,穩(wěn)定下情緒,開始我的爬坑之旅。
首先,我先來到這個(gè)開源庫的文檔中尋找下是否有我遺漏的地方,在最后看到了一句話,仿佛看到了曙光:
在安卓機(jī)上測試的同學(xué)經(jīng)常會遇到比如調(diào)用微信支付時(shí)閃一下就沒了的問題,這個(gè)問題100%跟簽名有關(guān),請檢查你的簽名。
debug版本和release版本的簽名是不同的,請注意
? ? ? ?從這段話中,從100%這個(gè)字眼我讀出了作者堅(jiān)定的語氣,自信的情感。于是我立馬讓運(yùn)營小哥查看當(dāng)時(shí)他申請微信支付用的簽名,結(jié)果一對證,我c...,好,穩(wěn)定下情緒,果然真是簽名不對,當(dāng)時(shí)給了一個(gè)dubug的簽名,后面我讓他換成release的簽名,沒換過來。好在微信開放平臺是支持修改的,而且即時(shí)生效。這下應(yīng)該沒問題了吧。。。
不可能的,不存在的,前方路漫漫。。這時(shí)候我的心態(tài)還是很好的。
依然還是屏幕閃了一下,一只烏鴉帶著省略號飛過。。所以說凡事不要說什么100%,接下來,繼續(xù)我們的爬坑之旅。
排除了權(quán)限問題,包括appid,應(yīng)用簽名這些都確定無誤,那么問題應(yīng)該就出在調(diào)用微信支付的那些參數(shù)上,首先引起我的注意的是sign這個(gè)字段,于是來到了微信支付文檔(使用第三方,最主要的還是要回歸到文檔中來),微信支付文檔直通車:微信支付開發(fā)文檔
? ? ? ?簡單描述下調(diào)用流程:
- app端先調(diào)用自家后臺的支付接口,把金額,支付類型等一些參數(shù)傳過去
- 后臺收到這些參數(shù),去調(diào)用微信服務(wù)端統(tǒng)一下單接口,將金額,商戶訂單號等等這些傳給微信服務(wù)端,這時(shí)候微信服務(wù)端返回成功或失敗,成功會附帶sign,prepay_id等參數(shù)給我們后臺。
- 后臺再將微信返回的這些參數(shù)返給app端,也就是上文配置中傳的那些參數(shù)。app端再把這些參數(shù)傳給微信。整個(gè)過程是不是一(fei)氣(chang)呵(dan)成(teng)
? ? ? ?那么我們推測問題就出現(xiàn)在這些參數(shù)里,讓我們一個(gè)一個(gè)來分析:
- partnerId 商家ID,這個(gè)是申請微信支付的時(shí)候,微信分配的ID,直接獲取后臺返回即可,可以與運(yùn)營小哥那邊再核對下。
- prepayId 預(yù)支付訂單,微信服務(wù)端返給我們后臺的訂單,app端直接獲取后臺返回即可。
- nonceStr 隨機(jī)數(shù),沒什么好說的,直接獲取后臺返回即可。
-
timeStamp 時(shí)間戳,這是個(gè)要小心的地方,之前我們后臺沒給我返回這個(gè)字段,我自以為app端自己獲取即時(shí)時(shí)間戳即可,直接
結(jié)果錯(cuò)了,必須使用后臺給的時(shí)間戳。你說這個(gè)鍋誰背,55開吧 - package 文檔上說直接寫死即可,package: 'Sign=WXPay'
- sign 這是個(gè)大咖,當(dāng)然計(jì)算工作交給后臺來做就行,網(wǎng)上看了幾篇文章說屏幕一閃,有可能就是sign計(jì)算錯(cuò)誤,后臺小哥跟我講這個(gè)sign是微信返給他的,然后又直接返給我,emmmm,應(yīng)該有點(diǎn)問題,再去文檔看看:微信支付APP端開發(fā)步驟,里邊第三部有四個(gè)字
商戶服務(wù)器生成支付訂單,先調(diào)用【統(tǒng)一下單API】生成預(yù)付單,獲取到prepay_id后將參數(shù)再次簽名傳輸給APP發(fā)起支付。以下是調(diào)起微信支付的
是的,就是這四個(gè)字“再次簽名”,需要再次簽名!!所以我又讓后臺小哥處理完sign在發(fā)給我。
到此,我們把這些參數(shù)都給分析了一遍過去,這次要再閃一下我就...我就再找找其他原因,但是事實(shí)上,我的app已經(jīng)成功調(diào)起了微信支付,并且成功回調(diào)。
好了,這波總結(jié)進(jìn)入尾聲了,是不是覺得我寫技術(shù)文章很啰嗦,就是啰嗦咋滴。不過說回來,還是總結(jié)下主題要義:
-
檢查你的APPID,應(yīng)用簽名是否正確
-
檢查你的參數(shù)傳遞是否正確(包括字段大小寫),更多地與后臺進(jìn)行調(diào)試
-
以上都確認(rèn)OK了,重裝你的微信再試一遍