項(xiàng)目集成微信支付孕锄,折騰了三天左右欢伏,坑太多,做個(gè)簡(jiǎn)單記錄
開通和主要原理不再講了移宅,參考微信支付官網(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類(包名或類名不一致會(huì)造成無(wú)法回調(diào))漏峰,在WXPayEntryActivity類中實(shí)現(xiàn)onResp函數(shù),支付完成后届榄,微信APP會(huì)返回到商戶APP并回調(diào)onResp函數(shù)浅乔,開發(fā)者需要在該函數(shù)中接收通知,判斷返回錯(cuò)誤碼铝条,如果支付成功則去后臺(tái)查詢支付結(jié)果再展示用戶實(shí)際支付結(jié)果靖苇。注意一定不能以客戶端返回作為用戶支付的結(jié)果,應(yīng)以服務(wù)器端的接收的支付通知或查詢API返回的結(jié)果為準(zhǔn)班缰。
(1) 其實(shí)正確地寫法是appPackageName.wxapi. WXPayEntryActivity(如:com.example.app.wxapi. WXPayEntryActivity)贤壁,而且類名必須是這個(gè)名字,要不不能回調(diào)(這個(gè)問(wèn)題好網(wǎng)上遇到的人很多)埠忘。
(2) 還有一個(gè)問(wèn)題脾拆,, AndroidManifest.xml配置文件中配置WXPayEntryActivity類時(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ū)分大小寫拘哨;
◆ 驗(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)換為大寫,得到sign值signValue癣亚。
通俗的說(shuō)丑掺,請(qǐng)求的參數(shù)做簽名, appid述雾,noncestr 街州,package,partnerid玻孟,prepayid唆缴,timestamp 按這個(gè)順序(注意必須是小寫),鍵值對(duì)的格式(即key1=value1&key2=value2…)做簽名黍翎。
3 支付結(jié)果返回-1(圖中的17步)
微信官網(wǎng)的說(shuō)明是:
開放平臺(tái)配置的包名和應(yīng)用簽名是否一致:(android)面徽;確認(rèn)是否使用正式的keystore打包apk并安裝調(diào)試;(android)玩敏;提交訂單部分需要在服務(wù)器端完成斗忌。
(1)應(yīng)用簽名問(wèn)題:
微信開發(fā)平臺(tái)申請(qǐng)開發(fā)應(yīng)用時(shí):
填寫Android平臺(tái)的應(yīng)用簽名時(shí),需要注意旺聚,填寫的是keystore的MD5值织阳,不是SHA1值。注意開發(fā)時(shí)的debug.keystore和最終發(fā)布的簽名keystore的MD5砰粹,SHA1都是不一樣的唧躲。正式發(fā)布產(chǎn)品需要使用正式的簽名。
另外特別注意:md5值得填寫全是小寫碱璃,并且不能包含冒號(hào)弄痹。
(2)注冊(cè)app到微信
除過(guò)微信開發(fā)Demo里面的注冊(cè),在每次向微信服務(wù)器請(qǐng)求數(shù)據(jù)之前再注冊(cè)一次
wxApi.registerApp(Constants.APP_ID); //發(fā)送請(qǐng)求數(shù)據(jù)之前再注冊(cè)一次
wxApi.sendReq(req);