項(xiàng)目集成微信支付,折騰了三天左右,坑太多,做個(gè)簡(jiǎn)單記錄
開(kāi)通和主要原理不再講了,參考微信支付官網(wǎng)
截個(gè)官網(wǎng)的業(yè)務(wù)流程圖,下面好說(shuō)明

1 支付結(jié)果回調(diào)(圖中的17步)
支付結(jié)果回調(diào),微信官方的說(shuō)法是:
在net.sourceforge.simcpux.wxapi包路徑中實(shí)現(xiàn)WXPayEntryActivity類(lèi)(包名或類(lèi)名不一致會(huì)造成無(wú)法回調(diào)),在WXPayEntryActivity類(lèi)中實(shí)現(xiàn)onResp函數(shù),支付完成后,微信APP會(huì)返回到商戶APP并回調(diào)onResp函數(shù),開(kāi)發(fā)者需要在該函數(shù)中接收通知,判斷返回錯(cuò)誤碼,如果支付成功則去后臺(tái)查詢(xún)支付結(jié)果再展示用戶實(shí)際支付結(jié)果。注意一定不能以客戶端返回作為用戶支付的結(jié)果,應(yīng)以服務(wù)器端的接收的支付通知或查詢(xún)API返回的結(jié)果為準(zhǔn)。
(1) 其實(shí)正確地寫(xiě)法是appPackageName.wxapi. WXPayEntryActivity(如:com.example.app.wxapi. WXPayEntryActivity),而且類(lèi)名必須是這個(gè)名字,要不不能回調(diào)(這個(gè)問(wèn)題好網(wǎng)上遇到的人很多)。
(2) 還有一個(gè)問(wèn)題,, AndroidManifest.xml配置文件中配置WXPayEntryActivity類(lèi)時(shí),要加上android:exported="true"這個(gè)標(biāo)簽,不然也回調(diào)不到,這個(gè)坑了我一個(gè)多小時(shí);
2 android端請(qǐng)求簽名(圖中第9步)
微信官網(wǎng)的說(shuō)法是:
簽名生成的通用步驟如下:
第一步,設(shè)所有發(fā)送或者接收到的數(shù)據(jù)為集合M,將集合M內(nèi)非空參數(shù)值的參數(shù)按照參數(shù)名ASCII碼從小到大排序(字典序),使用URL鍵值對(duì)的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
特別注意以下重要規(guī)則:
◆ 參數(shù)名ASCII碼從小到大排序(字典序);
◆ 如果參數(shù)的值為空不參與簽名;
◆ 參數(shù)名區(qū)分大小寫(xiě);
◆ 驗(yàn)證調(diào)用返回或微信主動(dòng)通知簽名時(shí),傳送的sign參數(shù)不參與簽名,將生成的簽名與該sign值作校驗(yàn)。
◆ 微信接口可能增加字段,驗(yàn)證簽名時(shí)必須支持增加的擴(kuò)展字段
第二步,在stringA最后拼接上key得到stringSignTemp字符串,并對(duì)stringSignTemp進(jìn)行MD5運(yùn)算,再將得到的字符串所有字符轉(zhuǎn)換為大寫(xiě),得到sign值signValue。
通俗的說(shuō),請(qǐng)求的參數(shù)做簽名, appid,noncestr ,package,partnerid,prepayid,timestamp 按這個(gè)順序(注意必須是小寫(xiě)),鍵值對(duì)的格式(即key1=value1&key2=value2…)做簽名。
3 支付結(jié)果返回-1(圖中的17步)
微信官網(wǎng)的說(shuō)明是:
開(kāi)放平臺(tái)配置的包名和應(yīng)用簽名是否一致:(android);確認(rèn)是否使用正式的keystore打包apk并安裝調(diào)試;(android);提交訂單部分需要在服務(wù)器端完成。
(1)應(yīng)用簽名問(wèn)題:
微信開(kāi)發(fā)平臺(tái)申請(qǐng)開(kāi)發(fā)應(yīng)用時(shí):
填寫(xiě)Android平臺(tái)的應(yīng)用簽名時(shí),需要注意,填寫(xiě)的是keystore的MD5值,不是SHA1值。注意開(kāi)發(fā)時(shí)的debug.keystore和最終發(fā)布的簽名keystore的MD5,SHA1都是不一樣的。正式發(fā)布產(chǎn)品需要使用正式的簽名。
另外特別注意:md5值得填寫(xiě)全是小寫(xiě),并且不能包含冒號(hào)。
(2)注冊(cè)app到微信
除過(guò)微信開(kāi)發(fā)Demo里面的注冊(cè),在每次向微信服務(wù)器請(qǐng)求數(shù)據(jù)之前再注冊(cè)一次
wxApi.registerApp(Constants.APP_ID); //發(fā)送請(qǐng)求數(shù)據(jù)之前再注冊(cè)一次
wxApi.sendReq(req);