微信支付接入的分工合作


微信支付 不僅支付

一著拭、背景介紹

作為一名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ā)


微信支付APP接入流程

2.1.2 ?APP設(shè)置

微信支付申請(qǐng)審核通過(guò)后纹安,商戶(hù)在申請(qǐng)資料填寫(xiě)的郵箱中將收取到由微信支付小助手發(fā)送的郵件尤辱,此郵件包含了開(kāi)發(fā)時(shí)需要使用的支付賬戶(hù)信息內(nèi)容。

微信支付申請(qǐng)審核通過(guò)郵件

收到郵件后厢岂,需要登錄微信商戶(hù)平臺(tái)設(shè)置API支付密鑰光督。


設(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密鑰盾剩。


微信公眾平臺(tái)接口調(diào)試工具


POST請(qǐng)求獲取預(yù)支付id信息

至此雷激,微信支付賬號(hào)的準(zhǔn)備工作完成,可以開(kāi)始進(jìn)行下一步的代碼開(kāi)發(fā)工作了告私。

2.2 代碼開(kāi)發(fā)流程

微信支付業(yè)務(wù)流程圖


準(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ù)如圖把介。

APP支付統(tǒng)一下單接口必填參數(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ù)如下:

Android APP微信支付所需字段

填入appid息尺、mch_id、prepayid疾掰、packageValue搂誉,重新生成noncestrtimestamp,然后將這些參數(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ù)

在回調(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è)處理完成信息堰汉,其返回格式如圖:

返回給微信服務(wù)器的參數(shù)

如果回調(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)之處或遺漏部分,歡迎留言指正悦穿,謝謝攻礼。

四、附錄

微信支付開(kāi)放文檔地址

微信支付開(kāi)放平臺(tái)登錄地址

微信支付商戶(hù)平臺(tái)登錄地址

微信公眾平臺(tái)接口調(diào)試工具地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末咧党,一起剝皮案震驚了整個(gè)濱河市秘蛔,隨后出現(xiàn)的幾起案子陨亡,更是在濱河造成了極大的恐慌傍衡,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件负蠕,死亡現(xiàn)場(chǎng)離奇詭異蛙埂,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)遮糖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)绣的,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人欲账,你說(shuō)我怎么就攤上這事屡江。” “怎么了赛不?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵惩嘉,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我踢故,道長(zhǎng)文黎,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任殿较,我火速辦了婚禮耸峭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘淋纲。我一直安慰自己劳闹,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布洽瞬。 她就那樣靜靜地躺著玷或,像睡著了一般。 火紅的嫁衣襯著肌膚如雪片任。 梳的紋絲不亂的頭發(fā)上偏友,一...
    開(kāi)封第一講書(shū)人閱讀 51,125評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音对供,去河邊找鬼位他。 笑死氛濒,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的鹅髓。 我是一名探鬼主播舞竿,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼窿冯!你這毒婦竟也來(lái)了骗奖?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤醒串,失蹤者是張志新(化名)和其女友劉穎执桌,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體芜赌,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡仰挣,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了缠沈。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片膘壶。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖洲愤,靈堂內(nèi)的尸體忽然破棺而出颓芭,到底是詐尸還是另有隱情,我是刑警寧澤柬赐,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布亡问,位于F島的核電站,受9級(jí)特大地震影響躺率,放射性物質(zhì)發(fā)生泄漏玛界。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一悼吱、第九天 我趴在偏房一處隱蔽的房頂上張望慎框。 院中可真熱鬧,春花似錦后添、人聲如沸笨枯。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)馅精。三九已至,卻和暖如春粱檀,著一層夾襖步出監(jiān)牢的瞬間洲敢,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工茄蚯, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留压彭,地道東北人睦优。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像壮不,于是被迫代替她去往敵國(guó)和親汗盘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 引言 秋高氣爽,天氣轉(zhuǎn)涼健蕊,正是學(xué)習(xí)工作做的好時(shí)候菱阵。(~ ̄▽?zhuān)?~~(~ ̄▽?zhuān)?~ 我是個(gè)phper最近在寫(xiě)微信支付...
    恩就是這個(gè)名閱讀 7,959評(píng)論 2 15
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,071評(píng)論 25 707
  • 準(zhǔn)備工作: 需要公司的營(yíng)業(yè)執(zhí)照,稅務(wù)信息绊诲,等老板的身份證信息等送粱,我記得褪贵,用這些材料掂之,去支付寶注冊(cè)一個(gè)商家賬戶(hù)(審核...
    Hevin_Chen閱讀 6,806評(píng)論 0 9
  • 自己總結(jié)的微信支付寶支付流程和注意點(diǎn): 準(zhǔn)備工作: 需要公司的營(yíng)業(yè)執(zhí)照,稅務(wù)信息脆丁,等老板的身份證信息等世舰,我記得苞笨,用...
    Www劉閱讀 18,565評(píng)論 2 50
  • 那時(shí)候我還很高興符糊,在剛進(jìn)集團(tuán)公司的時(shí)候,得知公司有一個(gè)刊物塞茅,稿子全部得從公司內(nèi)部選歼培,而在一次培訓(xùn)會(huì)上震蒋,稿費(fèi)的算計(jì)用...
    楊戲水閱讀 270評(píng)論 0 1