前段時間公司項目要添加微信支付的功能,然后就簡單看了下微信支付的官方文檔 :https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_1? APP端的開發(fā)步驟并不難材失,就簡單的4步和泌。但是真正做起來的時候贸营,卻是小問題一堆骆捧,下面詳細(xì)說一下自己在這個過程中遇到的問題和難點:
下載微信官方給的Android SDK demo?https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_4? 在自己的項目中導(dǎo)入相應(yīng)的jar包岖常,然后按照官方文檔給出的開發(fā)步驟侍筛,再加上官方demo里面的例子萤皂,把微信支付集成到自己的項目中很快很方便。這個過程中自己也看了幾篇別人寫的不錯的博客:Android快速實現(xiàn)微信支付(真的匣椰!很快q晌酢);Android微信支付徹底掃坑?禽笑,里面的一些重點和坑都講得很清楚了入录,以及一些容易出現(xiàn)的失誤都基本上列舉出來了。
公司項目是做電影售票的佳镜,旗下有好多影城僚稿,由于客戶端的子appid 和 我們總的appid,還有商戶id和旗下影城的子商戶id的關(guān)聯(lián)設(shè)置還沒有申請好蟀伸,但是自助取票機(jī)的關(guān)聯(lián)設(shè)置已經(jīng)弄好蚀同,而且都已經(jīng)上線使用了微信支付功能,所以我們客戶端和homgpage在做微信支付的時候啊掏,用的appid是自助取票機(jī)的appid蠢络。一開始我都按照文檔和demo在自己的項目中都設(shè)置好了,然后開始測試迟蜜,由于調(diào)用微信支付的幾個關(guān)鍵參數(shù)現(xiàn)在都是后臺返回給我們的(處于安全考慮嘛刹孔,做后臺的同志工作量有點大),所以我們客戶端需要做的事情就很簡單小泉,調(diào)用接口獲取參數(shù)芦疏,然后拿這些參數(shù)去調(diào)用微信客戶端發(fā)起支付。由于我們自己的影城較多微姊,子商戶id較多酸茴,一開始都寫好了但是調(diào)不起來微信,然后我們就分析問題兢交,也問了微信支付的技術(shù)人員薪捍,然后換appid,設(shè)置關(guān)聯(lián)appid等都不行配喳,后臺傳參數(shù)那邊也考慮過是不是簽名的問題酪穿,晚上加班折騰了幾個小時,發(fā)現(xiàn)后臺兩次簽名用的nonceStr隨機(jī)字符串不一致晴裹。這個需要特別注意的就是后臺兩次簽名驗證的時候的參數(shù)要保持一致被济。這點要特別注意。
然后就是IOS的同事成功拉起了微信支付涧团,但是我android的怎么都掉不起來微信只磷,中間查了各種資料,也試過了各種方法泌绣,網(wǎng)上有說的清除微信客戶端的緩存就可以了钮追,但是這個操作并不能解決問題,清除微信客戶端的緩存只是在app第一次調(diào)用的時候還沒來得及驗證相關(guān)參數(shù)阿迈,所以app就能調(diào)起微信了元媚。而且這種操作成功率也很低,也不能真正解決問題苗沧。后來給微信的官方技術(shù)人員發(fā)了兩次郵件刊棕,也清楚的描述了自己的問題:當(dāng)發(fā)起支付時調(diào)不出微信支付界面,直接響應(yīng)WXPayEntryActivity中的onResp回調(diào)崎页,并且errCode始終返回-1鞠绰。如果微信未登錄,則會調(diào)起登陸界面飒焦,登陸完成后還是調(diào)不起來蜈膨,errCode依然返回-1。他們給出的答案一直就是五條:
1牺荠,你簽名中的key翁巍,也就是你的API密鑰key,這個參數(shù)要你們自己到商戶平臺設(shè)置的休雌,設(shè)置的規(guī)則是32位數(shù)字與字母大小寫的組合的隨機(jī)數(shù)灶壶,不能設(shè)置成簽名串和參數(shù)appsecret,你們有正確設(shè)置嗎杈曲?驰凛?胸懈?
2,需要用簽名發(fā)布程序恰响,直接調(diào)試就返回那個錯誤
3趣钱,注意你后臺簽名的時候傳的參數(shù)順序不對的話,也會報這個錯誤胚宦,要按照文檔要求的順序
4首有, 從預(yù)支付訂單返回的數(shù)據(jù) ,沒有重新簽名枢劝,也會引起這個問題井联。
5,清微信緩存后試試您旁。
我檢查了自己的項目這些都不是問題烙常,困惑了我很久,眼看IOS的同事已經(jīng)把相關(guān)功能做的差不多被冒,然后實在是著急的不行了就直接給微信的技術(shù)人員電話聯(lián)系了军掂,后來才發(fā)現(xiàn)問題的所在:因為現(xiàn)在的項目用的appid不是在公眾平臺注冊應(yīng)用的appid,而是我們這邊的自助取票機(jī)應(yīng)用的appid昨悼,從而導(dǎo)致的安卓客戶端拉不起來微信支付蝗锥。微信官方技術(shù)人員給出的解釋是這樣的:IOS本身有安全處理機(jī)制 ,所以他們那邊沒有限制IOS的應(yīng)用調(diào)用微信率触,但是安卓的由于開源的原因 终议,安卓應(yīng)用每次調(diào)用微信支付的時候都會校驗 appid 、包名? 和 應(yīng)用簽名的葱蝗。? 這三個必須保持一致才能夠成功調(diào)起微信穴张。
還有其他的一些小問題的話查查資料都會解決的,上面給出的兩個文章的鏈接也可以參考看看两曼,還是很有價值的皂甘。問題不大,但是細(xì)心才行悼凑。