一著拭、背景介紹
作為一名Android開(kāi)發(fā)国旷,從最初的跌跌撞撞到現(xiàn)在小有所悟,這其中經(jīng)歷過(guò)的辛酸苦辣也是一種痛并快樂(lè)著的過(guò)程茫死。在這一個(gè)過(guò)程中跪但,不斷的在工作中、在網(wǎng)絡(luò)上向各位前輩朋友學(xué)習(xí)峦萎,一次一次的充實(shí)了自己屡久,學(xué)到了新東西,解決了新問(wèn)題爱榔,內(nèi)心甚是感激被环。同時(shí)在這一過(guò)程中,也慢慢積累了自己的一些經(jīng)驗(yàn)详幽,趁著有了一點(diǎn)空余時(shí)間筛欢,拿出來(lái)分享一下浸锨,希望能幫助到有需要的朋友。因?yàn)楸救思夹g(shù)能力有限版姑,如文章有欠缺不妥之處柱搜,還望指正。
最近的開(kāi)發(fā)工作又重新接入了一次微信支付剥险,終于完成了從開(kāi)放平臺(tái)的賬號(hào)設(shè)置到APP端聪蘸、服務(wù)器端的代碼編寫(xiě)都有參與的一個(gè)歷程,算是理清了微信支付的一個(gè)整體流程表制,并且對(duì)如何避免入坑以及錯(cuò)誤掃雷有了比較大的認(rèn)知健爬。記得上一次的接入還是一年前,那時(shí)的主要角色只限于APP端的開(kāi)發(fā)工作么介,雖說(shuō)也是APP端的主導(dǎo)開(kāi)發(fā)娜遵,但是并不能從全局從整體去參與,所以部分流程和概念還是一個(gè)似懂非懂的一個(gè)狀態(tài)(最終APP接入微信支付是成功的壤短,但也是知其然不知所以然)设拟。故而在此寫(xiě)下一遍文章以記錄所知所感,期以做個(gè)人備忘及新人參考之用鸽扁。
這篇文章的主要目的不是介紹如何接入微信支付快速完成代碼開(kāi)發(fā),我相信這個(gè)問(wèn)題的答案在微信的官方開(kāi)發(fā)文檔以及網(wǎng)絡(luò)上都已有了先例镶骗,而且也寫(xiě)得很好桶现。如果你是剛剛接觸微信支付接入并且沒(méi)有閱讀過(guò)官方開(kāi)發(fā)文檔,那么你在看這篇文章時(shí)會(huì)有很多困惑鼎姊;但是如果你已經(jīng)在接入的過(guò)程當(dāng)中骡和,并且對(duì)官方開(kāi)發(fā)文檔比較熟悉,那么本文中的某些部分能夠給你一種豁然開(kāi)朗的感覺(jué)相寇。正如標(biāo)題所言慰于,本文的目的在于說(shuō)明微信支付的分工合作,重點(diǎn)了解從【微信支付開(kāi)放平臺(tái)的APP信息設(shè)置】到【服務(wù)器后臺(tái)獲取預(yù)支付id信息】再到【APP端拿到服務(wù)器信息后發(fā)起支付請(qǐng)求】直到最后【服務(wù)器和客戶(hù)端得到支付成功通知】的這樣一個(gè)過(guò)程唤衫,在這一過(guò)程中婆赠,將會(huì)在適當(dāng)?shù)奈恢靡?b>Tips的形式插入需要注意的地方,期望能夠作為錯(cuò)誤掃雷手冊(cè)參考佳励。因?yàn)楸疚尼槍?duì)的是開(kāi)發(fā)者休里,特別是Android開(kāi)發(fā)者,可能賬號(hào)申請(qǐng)及APP設(shè)置環(huán)節(jié)赃承、服務(wù)器后臺(tái)處理流程環(huán)節(jié)大部分人沒(méi)有去參與過(guò)妙黍,本著查漏補(bǔ)缺的原則,所以會(huì)對(duì)這兩個(gè)環(huán)節(jié)進(jìn)行更為詳細(xì)的描述瞧剖,而對(duì)APP接入代碼編寫(xiě)環(huán)節(jié)主要做一個(gè)理論上的描述拭嫁,不涉及具體的代碼實(shí)現(xiàn)可免,如有興趣可以留言進(jìn)行交流。
二做粤、分工合作流程
2.1 賬號(hào)申請(qǐng)和APP設(shè)置
2.1.1 ?賬號(hào)申請(qǐng)
打開(kāi)微信支付開(kāi)放平臺(tái)登錄地址浇借,按照微信支付申請(qǐng)接入流程,選擇一個(gè)接入場(chǎng)景進(jìn)行接入驮宴。例如APP支付的接入流程是:
1逮刨、注冊(cè)開(kāi)放平臺(tái)賬號(hào)
2、認(rèn)證開(kāi)發(fā)者資質(zhì)
3堵泽、創(chuàng)建APP并提交審核(Tips:設(shè)置好APP的keystore簽名)
4修己、提交資料申請(qǐng)微信支付
5、開(kāi)戶(hù)成功迎罗,登錄商戶(hù)平臺(tái)進(jìn)行驗(yàn)證
6睬愤、在線簽署協(xié)議
7、啟動(dòng)設(shè)計(jì)和開(kāi)發(fā)
2.1.2 ?APP設(shè)置
微信支付申請(qǐng)審核通過(guò)后纹安,商戶(hù)在申請(qǐng)資料填寫(xiě)的郵箱中將收取到由微信支付小助手發(fā)送的郵件尤辱,此郵件包含了開(kāi)發(fā)時(shí)需要使用的支付賬戶(hù)信息內(nèi)容。
收到郵件后厢岂,需要登錄微信商戶(hù)平臺(tái)設(shè)置API支付密鑰光督。
Tips:可以通過(guò)微信公眾平臺(tái)接口調(diào)試工具對(duì)微信支付的賬號(hào)以及API密鑰進(jìn)行有效性驗(yàn)證。具體方法是:
1塔粒、打開(kāi)微信公眾平臺(tái)接口調(diào)試工具頁(yè)面结借,接口選擇【自定義】選項(xiàng)
2、填入微信支付必填參數(shù)及其參數(shù)值(注意:大小寫(xiě)敏感)以及商戶(hù)Key(即API密鑰)
3卒茬、點(diǎn)擊生成簽名船老,就可以得到統(tǒng)一下單接口參數(shù)數(shù)據(jù)
4、將統(tǒng)一下單接口參數(shù)數(shù)據(jù)填入一個(gè)POST請(qǐng)求工具(例如Chrome插件Postman)圃酵,向統(tǒng)一下單接口地址提交一個(gè)POST請(qǐng)求柳畔,如果能夠正常得到預(yù)支付id,那么說(shuō)明微信支付賬號(hào)和API密鑰有效(Tips:除了appid郭赐、mch_id薪韩、trade_type、商戶(hù)Key捌锭,其他參數(shù)值都可以隨便填躬存,只要符合字段類(lèi)型定義就行,不會(huì)影響到最終獲取預(yù)支付id結(jié)果舀锨。例如notify_url參數(shù)如果還沒(méi)有自己的通知回調(diào)頁(yè)面岭洲,可以填入http://www.baidu.com之類(lèi)的都行)。否則請(qǐng)返回之前的步驟坎匿,檢查支付賬號(hào)是否開(kāi)通APP支付功能以及是否設(shè)置了API密鑰盾剩。
至此雷激,微信支付賬號(hào)的準(zhǔn)備工作完成,可以開(kāi)始進(jìn)行下一步的代碼開(kāi)發(fā)工作了告私。
2.2 代碼開(kāi)發(fā)流程
準(zhǔn)備好了微信支付賬號(hào)屎暇,并確認(rèn)賬號(hào)的支付權(quán)限和API密鑰設(shè)置無(wú)誤后,現(xiàn)在可以開(kāi)始進(jìn)行代碼開(kāi)發(fā)了驻粟。上圖是微信官方文檔中的微信支付業(yè)務(wù)流程圖根悼,從流程圖中可以看到代碼開(kāi)發(fā)分服務(wù)器端和APP端,服務(wù)器端負(fù)責(zé)支付前的訂單生成蜀撑、數(shù)據(jù)獲取和支付后的訂單狀態(tài)更新挤巡,APP端負(fù)責(zé)發(fā)起支付請(qǐng)求,簡(jiǎn)言之酷麦,服務(wù)器負(fù)責(zé)支付前期矿卑、后期,APP則負(fù)責(zé)中期沃饶。
2.2.1 ?服務(wù)器接口開(kāi)發(fā)
服務(wù)器接口的前期工作是:
1母廷、生成內(nèi)部訂單,調(diào)用統(tǒng)一下單接口糊肤,獲取到預(yù)支付id信息
服務(wù)器根據(jù)APP發(fā)送過(guò)來(lái)的商品id和用戶(hù)id信息琴昆,在數(shù)據(jù)庫(kù)中生成一條內(nèi)部訂單,然后利用訂單信息馆揉、微信支付賬號(hào)信息生成統(tǒng)一下單接口參數(shù)业舍,調(diào)用統(tǒng)一下單接口獲取得到預(yù)支付id。必填的接口參數(shù)如圖把介。
固定部分為每次調(diào)用接口都固定不變的參數(shù)(不是值全部寫(xiě)死勤讽,而是每個(gè)訂單每次調(diào)用都不變)蟋座,trade_type的值A(chǔ)PP表明接入的是APP支付(如果是JSAPI支付拗踢,則填入JSAPI),notify_url則是支付回調(diào)頁(yè)面向臀,這個(gè)頁(yè)面屬于后期工作中的支付結(jié)果監(jiān)聽(tīng)部分內(nèi)容(Tips:該回調(diào)頁(yè)面應(yīng)該能夠外網(wǎng)訪問(wèn)巢墅,否則微信無(wú)法調(diào)用進(jìn)行支付通知,這個(gè)在真正進(jìn)行支付調(diào)試的時(shí)候要特別注意)券膀,spbill_create_ip可以直接填入服務(wù)器的外網(wǎng)IP地址(Tips:它的值是服務(wù)器內(nèi)網(wǎng)或者外網(wǎng)地址君纫,又或者是其他任意有效的IP地址,都不會(huì)影響獲取預(yù)支付id的結(jié)果芹彬,但是建議還是填入服務(wù)器外網(wǎng)IP地址)蓄髓。
賬號(hào)部分為所申請(qǐng)的微信支付賬號(hào)信息部分,這部分主要提供appid和mch_id(Tips:appid和mch_id是一一對(duì)應(yīng)的關(guān)系舒帮,不可以錯(cuò)開(kāi)使用会喝,一個(gè)appid必須對(duì)應(yīng)他在賬號(hào)申請(qǐng)時(shí)簽署的商戶(hù)mch_id陡叠,否則無(wú)法成功獲取預(yù)支付id信息)。appid和mch_id可以在后臺(tái)配置表中進(jìn)行配置肢执,一般情況下同一個(gè)APP每次調(diào)用統(tǒng)一下單接口時(shí)不會(huì)改變這兩個(gè)值枉阵,但也不排除針對(duì)不同訂單,其收款對(duì)象不同的這樣一個(gè)需求预茄,所以在此處可以根據(jù)業(yè)務(wù)需求來(lái)進(jìn)行賬號(hào)信息配置兴溜。
商品部分內(nèi)容為所要支付的商品信息,out_trade_no為服務(wù)器生成的內(nèi)部訂單id(Tips:該id會(huì)在支付回調(diào)頁(yè)面中返回耻陕,用以更新該訂單狀態(tài)拙徽,所以需要保證該id在內(nèi)部訂單系統(tǒng)中的唯一性)。body字段為商品描述部分淮蜈,用于在微信支付確認(rèn)中顯示(Tips:該字段的類(lèi)型定義是String(128)斋攀,所以字段長(zhǎng)度不要超過(guò)128字符)。total_fee字段則是商品的價(jià)格梧田,其單位為分淳蔼,類(lèi)型為int,例如 total_fee = 666裁眯,則默認(rèn)表明¥6.66鹉梨。
驗(yàn)證部分內(nèi)容提供了安全性保障。nonce_str字段為一個(gè)隨機(jī)字符串穿稳,目的就是為了增加隨機(jī)性存皂,讓簽名后的sign字段無(wú)法預(yù)料,使得通過(guò)攔截進(jìn)行破解變得不可能逢艘。(Tips:nonce_str可以是16位隨機(jī)字符串旦袋,也可以是32位隨機(jī)字符串,或者其他少于等于32位的隨機(jī)字符串都可以它改,nonce_str字段在每次進(jìn)行簽名前都應(yīng)該重新生成而不是沿用原來(lái)的疤孕,否則就失去了它的意義。它的字符長(zhǎng)度央拖、字符類(lèi)型集合祭阀、是否簽名前重新生成還是沿用都不會(huì)影響到最后獲取預(yù)支付id的成功與否,但是必須保證加入簽名獲得sign字段時(shí)的nonce_str與傳給微信的nonce_str參數(shù)兩者的值是一樣的鲜戒。在獲得預(yù)支付id結(jié)果后专控,加入簽名獲得sign字段時(shí)的nonce_str與返回給前端的結(jié)果參數(shù)nonce_str也要一致,否則會(huì)出現(xiàn)簽名錯(cuò)誤問(wèn)題)遏餐。sign字段是整個(gè)參數(shù)的一個(gè)關(guān)鍵伦腐,它保證了參數(shù)傳輸和接收的安全性,保證這些參數(shù)從發(fā)送方到接收方的傳輸過(guò)程中失都,沒(méi)有被修改過(guò)柏蘑。它的生成規(guī)則在官方文檔里面的說(shuō)明中已經(jīng)約定颖系,所有傳遞過(guò)去的參數(shù),除了sign參數(shù)字段辩越,其他參數(shù)字段都要按照參數(shù)名進(jìn)行ASCII碼字典序從小到大排序拼接成一串嘁扼,然后在字符串末尾拼接API密鑰,最終得到一串拼接了API密鑰的參數(shù)鏈字符串黔攒,對(duì)該參數(shù)鏈字符串進(jìn)行MD5加密成32位大寫(xiě)字母字符串趁啸,即得到了最終的sign字段值。試想一下督惰,如果有個(gè)黑客想要通過(guò)攔截修改的方式不傅,將原本價(jià)格為100元的商品修改為0.01元,即把 total_fee = 10000 改成 total_fee = 1 赏胚,然后發(fā)送給了微信访娶,那么微信在驗(yàn)證過(guò)程把參數(shù)拼接成參數(shù)鏈進(jìn)行簽名后得到的sign字段已經(jīng)和參數(shù)中原有的sign字段不一樣了,就會(huì)提示簽名錯(cuò)誤異常觉阅,不接受該請(qǐng)求崖疤。而黑客如果想在修改了價(jià)格后再重新偽造sign字段來(lái)通過(guò)微信驗(yàn)證,那么他就必須知道API密鑰典勇,但該密鑰只有服務(wù)器端和微信端才有劫哼,并不通過(guò)網(wǎng)絡(luò)進(jìn)行傳播,所以黑客也就無(wú)計(jì)可施了(Tips:所以API密鑰一定要妥善保管在服務(wù)器端割笙,不能通過(guò)網(wǎng)絡(luò)傳播給APP客戶(hù)端权烧,更不能內(nèi)置在APP客戶(hù)端)。
2伤溉、請(qǐng)求統(tǒng)一下單接口獲得數(shù)據(jù)并處理
服務(wù)器端生成了參數(shù)后般码,調(diào)用統(tǒng)一下單接口獲得了接口返回的包含預(yù)支付id的結(jié)果,這時(shí)需要做兩個(gè)操作:
(1)對(duì)接口返回結(jié)果進(jìn)行簽名驗(yàn)證
從前面的sign字段分析中已經(jīng)提到了乱顾,該字段保證了數(shù)據(jù)傳輸接收的安全性板祝,所以在拿到接口返回?cái)?shù)據(jù)時(shí),要對(duì)該字段進(jìn)行驗(yàn)證糯耍,將所有參數(shù)剔除sign字段后按順序拼接成帶API密鑰的參數(shù)鏈字符串扔字,然后通過(guò)MD5方法進(jìn)行簽名囊嘉,得到了新的32位大寫(xiě)MD5字符串的sign簽名温技,將微信返回的sign字段與重新簽名的sign進(jìn)行對(duì)比,如果一致扭粱,則表明參數(shù)準(zhǔn)確無(wú)誤沒(méi)有被篡改過(guò)舵鳞,否則一定是在某一個(gè)環(huán)節(jié)發(fā)生了問(wèn)題(Tips:要善于利用微信公眾平臺(tái)接口調(diào)試工具來(lái)進(jìn)行問(wèn)題排查,如果簽名方法和參數(shù)字段都沒(méi)問(wèn)題琢蛤,但是調(diào)試工具得到的sign值和原有參數(shù)中的sign值不一致蜓堕,那么抛虏,哈哈哈,恭喜你套才,你被黑客盯上了迂猴,否則請(qǐng)檢查你的簽名方法和參數(shù)字段是否一一對(duì)應(yīng))。
(2)生成APP前端調(diào)用支付所需參數(shù)并簽名背伴,返回給前端
簽名驗(yàn)證無(wú)誤后沸毁,再通過(guò)統(tǒng)一下單接口返回的數(shù)據(jù)生成前端調(diào)用支付所需字段,同時(shí)對(duì)這些字段進(jìn)行簽名傻寂。例如Android APP支付所需的參數(shù)如下:
填入appid息尺、mch_id、prepayid疾掰、packageValue搂誉,重新生成noncestr和timestamp,然后將這些參數(shù)排好序同時(shí)加上API密鑰拼成參數(shù)鏈字符串静檬,對(duì)該字符串進(jìn)行MD5簽名得到sign字段炭懊,最后將這些字段全部返回給前端即可(在與微信進(jìn)行交互時(shí),其命名規(guī)則一定要按照微信官方文檔進(jìn)行定義拂檩,而在跟APP進(jìn)行交互時(shí)凛虽,其參數(shù)key命名是否帶有下劃線、是否符合駝峰命名并不影響广恢,這里的命名約定主要是服務(wù)器和APP前端兩者的約定凯旋。在此處我只能按照之前服務(wù)端接口小哥的命名來(lái)定義,所以各位不必深究)钉迷。
至此至非,服務(wù)器接口的前期工作已經(jīng)完成。下面看看服務(wù)器接口在支付后期的工作內(nèi)容糠聪。
服務(wù)器接口的后期工作是:編寫(xiě)支付回調(diào)頁(yè)面荒椭,接收支付成功回調(diào)并修改訂單狀態(tài),給微信返回訂單處理完成信息
在調(diào)用統(tǒng)一下單接口時(shí)需要填入一個(gè)notify_url回調(diào)頁(yè)面舰蟆,這個(gè)頁(yè)面就是監(jiān)聽(tīng)支付成功通知的處理頁(yè)面趣惠,其本質(zhì)就是給微信服務(wù)器在支付成功后的一個(gè)調(diào)用接口。在該頁(yè)面中身害,主要做三件事:
(1) 驗(yàn)證接口傳入?yún)?shù)的安全性
微信調(diào)用該頁(yè)面時(shí)味悄,會(huì)傳入以下信息:
在回調(diào)頁(yè)面收到這些參數(shù)數(shù)據(jù)時(shí),首先需要對(duì)result_code塌鸯、return_code進(jìn)行驗(yàn)證侍瑟,只有兩者都為SUCCESS時(shí)才表明支付順利完成,否則在支付的某個(gè)環(huán)節(jié)中出了問(wèn)題,請(qǐng)對(duì)照微信支付錯(cuò)誤碼進(jìn)行錯(cuò)誤排除涨颜。
驗(yàn)證了支付順利完成后费韭,需要對(duì)sign簽名字段進(jìn)行安全性驗(yàn)證,其驗(yàn)證規(guī)則與前期工作中的驗(yàn)證規(guī)則一致庭瑰。如果驗(yàn)證通過(guò)星持,那么可以根據(jù)out_trade_no字段修改訂單狀態(tài)為已支付了。否則給微信服務(wù)器返回驗(yàn)證錯(cuò)誤信息(跳轉(zhuǎn)到下面的第3步)弹灭。
(2) 修改訂單狀態(tài)
驗(yàn)證通過(guò)后钉汗,那么根據(jù)out_trade_no字段將訂單狀態(tài)修改為已支付狀態(tài),如果修改過(guò)程一切順利鲤屡,則可以給微信服務(wù)器返回處理成功信息损痰,否則如果訂單修改過(guò)程中出現(xiàn)了問(wèn)題(例如訂單已經(jīng)不存在了),則給微信服務(wù)器返回訂單處理失敗信息酒来。
(3)給微信服務(wù)器回復(fù)處理完成信息
在參數(shù)驗(yàn)證和訂單處理過(guò)程中卢未,無(wú)論成功與否,都需要給微信服務(wù)器返回一個(gè)處理完成信息堰汉,其返回格式如圖:
如果回調(diào)頁(yè)面處理的過(guò)程中出現(xiàn)了錯(cuò)誤辽社,那么請(qǐng)針對(duì)錯(cuò)誤進(jìn)行問(wèn)題排查。如果沒(méi)有錯(cuò)誤翘鸭,成功處理回調(diào)請(qǐng)求滴铅,則該訂單支付順利完成。(Tips:回調(diào)頁(yè)面必須是外網(wǎng)能訪問(wèn)的才能被微信服務(wù)器調(diào)用到就乓,否則在調(diào)試階段請(qǐng)模擬數(shù)據(jù)進(jìn)行調(diào)用)
至此汉匙,服務(wù)器接口的后期工作完成。并且整個(gè)微信支付開(kāi)發(fā)過(guò)程中生蚁,服務(wù)器的工作也完成了噩翠。
2.2.2 APP代碼開(kāi)發(fā)
APP在整個(gè)微信支付中主要負(fù)責(zé)中期的工作,該工作內(nèi)容包含兩個(gè)方面:
1邦投、調(diào)用服務(wù)器接口獲得預(yù)支付id等信息
當(dāng)用戶(hù)點(diǎn)擊付款按鈕時(shí)伤锚,APP調(diào)用服務(wù)器的接口,將用戶(hù)id和商品id作為參數(shù)傳遞給服務(wù)器志衣,獲取到包含sign簽名字段在內(nèi)的返回?cái)?shù)據(jù)(即服務(wù)器前期工作中最后一步的返回?cái)?shù)據(jù))屯援,用以發(fā)起微信支付請(qǐng)求。
2念脯、利用微信API調(diào)用微信客戶(hù)端進(jìn)行微信支付
獲取到預(yù)支付id等信息后狞洋,就可以調(diào)用微信支付SDK中的API,發(fā)起支付請(qǐng)求和二,彈出微信支付確認(rèn)頁(yè)面徘铝,要求用戶(hù)輸入密碼進(jìn)行支付耳胎。
至此惯吕,APP端就完成了支付的中期工作惕它。
其實(shí),APP端也有一個(gè)支付的后期工作废登。因?yàn)樵谇懊嫖⑿胖Ц读鞒虉D中也有提到了淹魄,微信支付的結(jié)果通知,除了給服務(wù)器端堡距,也會(huì)給APP端甲锡,所以APP端的這個(gè)后期工作是監(jiān)聽(tīng)微信支付結(jié)果通知。APP端監(jiān)聽(tīng)支付結(jié)果的方式是在項(xiàng)目工程的包名下羽戒,新建一個(gè)包文件夾缤沦,其必須命名為“wxapi”,在該包名下新建一個(gè)Activity易稠,其命名也規(guī)定為“WXPayEntryActivity”缸废,該Activity要實(shí)現(xiàn)IWXAPIEventHandler接口,另外別忘了在清單文件中聲明這個(gè)Activity驶社。微信會(huì)在支付結(jié)果通知中回調(diào)該Activity的onResp方法企量,告知支付結(jié)果,Activity則在該方法中分別對(duì)三種結(jié)果進(jìn)行響應(yīng)處理(三種結(jié)果是:“resp.errCode == 0” 表明支付成功 亡电,“resp.errCode == -1”表明支付發(fā)生錯(cuò)誤届巩,“resp.errCode == -2” 表明用戶(hù)取消了支付)。
Tips:如果支付結(jié)果發(fā)生了錯(cuò)誤份乒,resp.errCode == -1恕汇,那么可能的原因是:
1、keystore簽名錯(cuò)誤
在微信支付開(kāi)放平臺(tái)創(chuàng)建APP時(shí)配置的應(yīng)用簽名信息不對(duì)或辖,請(qǐng)用正式發(fā)版的簽名keystore修正應(yīng)用簽名信息拇勃;或者沒(méi)有打包簽名apk進(jìn)行測(cè)試,用正式發(fā)版的簽名keystore簽名apk后再測(cè)孝凌。
2方咆、sign字段簽名錯(cuò)誤
服務(wù)器的返回?cái)?shù)據(jù)中,sign簽名過(guò)程發(fā)生了錯(cuò)誤蟀架。sign簽名過(guò)程中瓣赂,參與簽名的參數(shù)字段命名一定要和微信規(guī)定的命名一致,簽名方法要按照官方文檔里面的說(shuō)明進(jìn)行片拍。
3煌集、未注冊(cè)appid、項(xiàng)目設(shè)置appid不正確捌省、注冊(cè)的appid與后臺(tái)設(shè)置的不匹配苫纤、該appid沒(méi)有申請(qǐng)移動(dòng)支付功能
先檢查代碼,看看在發(fā)起支付請(qǐng)求前有沒(méi)有調(diào)用API將appid注冊(cè)到微信。如果代碼有注冊(cè)了appid卷拘,那么聯(lián)系服務(wù)器開(kāi)發(fā)和賬號(hào)申請(qǐng)相關(guān)人員喊废,對(duì)appid的值進(jìn)行排查比對(duì),對(duì)appid與商戶(hù)mch_id是否一一對(duì)應(yīng)進(jìn)行確認(rèn)栗弟,對(duì)該應(yīng)用是否申請(qǐng)微信支付功能進(jìn)行確認(rèn)污筷。
4、用戶(hù)微信客戶(hù)端的登錄被擠下線
可能用戶(hù)當(dāng)前的微信客戶(hù)端登錄狀態(tài)已經(jīng)被其他設(shè)備擠下線了乍赫,但是用戶(hù)并沒(méi)有在該設(shè)備重新登錄過(guò)微信瓣蛀,這時(shí)需要提示用戶(hù)重新登錄微信解決(曾經(jīng)開(kāi)發(fā)過(guò)程中遇到的這個(gè)問(wèn)題,當(dāng)時(shí)用模擬器和手機(jī)同時(shí)進(jìn)行測(cè)試雷厂,一開(kāi)始百試百靈惋增,每次都能成功調(diào)用支付界面,但是模擬器和手機(jī)交叉進(jìn)行測(cè)試有時(shí)卻不行了改鲫,后來(lái)在問(wèn)題重現(xiàn)的過(guò)程中發(fā)現(xiàn)了這個(gè)規(guī)律器腋,原來(lái)是當(dāng)前設(shè)備微信登錄狀態(tài)被擠下線導(dǎo)致的)。
5钩杰、沒(méi)有進(jìn)行微信客戶(hù)端是否安裝以及版本是否支持微信支付檢測(cè)
在發(fā)起支付請(qǐng)求前纫塌,就應(yīng)該調(diào)用微信支付API對(duì)是否安裝微信以及安裝的微信版本是否支持微信支付進(jìn)行判斷,如果沒(méi)安裝則提示安裝讲弄,如果微信版本不支持支付則提示用戶(hù)升級(jí)微信(Tips:一些會(huì)玩的Android手機(jī)玩家措左,常常通過(guò)綠色守護(hù)等軟件將微信客戶(hù)端綠色化,導(dǎo)致微信實(shí)際是安裝在手機(jī)上的避除,但是無(wú)法通過(guò)微信API獲得其是否支持支付的結(jié)果怎披,所以這里在提示上面可以修改為“請(qǐng)先啟動(dòng)或者升級(jí)你的微信客戶(hù)端來(lái)完成微信支付”)。
6瓶摆、其他異常等凉逛。
to be continue
至此,APP端的微信支付完成了所有的工作群井。
三状飞、結(jié)束語(yǔ)
到這里,經(jīng)過(guò)分工合作书斜,你應(yīng)該已經(jīng)成功接入了微信支付诬辈。在文章中只涉及了微信支付的付款流程,關(guān)于其他訂單查詢(xún)荐吉、退款等流程可以參照微信支付開(kāi)放文檔進(jìn)行接入(也許你也發(fā)現(xiàn)了焙糟,在前面完全沒(méi)有提及AppSecret,這是因?yàn)樵诟犊畹倪^(guò)程中并不會(huì)用到這個(gè)東東)样屠。
好了穿撮,這篇文章到此結(jié)束缺脉,如果有不當(dāng)之處或遺漏部分,歡迎留言指正悦穿,謝謝攻礼。