由于近日項(xiàng)目中要用到微信支付,而且遇到的坑比較多,就寫了這一篇博文(PS:文采不好,勿噴勿噴),希望還處在坑中的朋友有所幫助。
1、先去微信公眾平臺申請應(yīng)用 ,成功之后,你還要去商戶平臺進(jìn)行驗(yàn)證,具體可以參考:http://kf.qq.com/faq/120911VrYVrA150906F3qqY3.html
成功之后,你就可以得到
appid、mch_id、app_key等一系列參數(shù)
注意:這里有一個(gè)坑,那就是你的應(yīng)用簽名要用一個(gè)簽名工具來獲取,之后我會上傳上去,還有微信規(guī)定調(diào)試的時(shí)候,你的簽名必須要和微信公眾平臺上面的簽名一致,這點(diǎn)很重要,簽名文件路徑為:C:\Users\Huang\.Android
如果在別的電腦上要測試的話,就必須替換掉這個(gè)debug.keystore簽名文件,但是每次更換簽名文件時(shí)必須重啟一下Android Studio或者eclipse。
2、先配置好權(quán)限和微信回調(diào)類WXPayEntryActivity,注意微信規(guī)定路徑必須是包名下面的wxapi文件夾的路徑,不然會造成回調(diào)不成功。
(2)獲取預(yù)支付交易會話id,并且根據(jù)微信官網(wǎng)查看需要傳的值,這點(diǎn)也很重要,不然調(diào)不起微信支付界面。
在此我封裝了一個(gè)WxUtil工具類,不知道要怎么傳的可以稍后去查看我寫的一個(gè)demo
然后用post方式綁定packageParams參數(shù)并訪問https://api.mch.weixin.qq.com/pay/unifiedorder,然后把返回來的內(nèi)容轉(zhuǎn)化為xml格式并進(jìn)行二次簽名,隨后通過sendReq方法調(diào)取微信支付。
3、不成功原因分析
(1)沒有調(diào)起支付界面,請檢查下有沒有WXPayEntryActivity注冊。
(2)簽名錯(cuò)誤
可以把自己的簽名與微信官網(wǎng)測試地址的簽名進(jìn)行對比,https://pay.weixin.qq.com/wiki/tools/signverify/,若為正確的話,可以檢查下自己的包名與密鑰,實(shí)在保證沒錯(cuò)的話可以試著重置一下密鑰。
(3)返回-1:
1、解決方法同上,再注意檢查一下lib下面的包有沒有導(dǎo)入進(jìn)來,appid有沒有錯(cuò)誤,參數(shù)有沒有傳錯(cuò)之類的,大部分都是由于簽名不對造成的;
2、建議清理一下微信緩存。
最后,由于微信不斷更新,目前此版本基于2016.5.3的版本。
(4)
1、請求的時(shí)候獲取不到prepayid。
原因:setParameter("total_fee", "1"); //商品金額,以分為單位
total_fee里面的參數(shù)是否有小數(shù)點(diǎn),或者測試的時(shí)候修改為了0.01;
需檢查:total_fee傳入的參數(shù)是否為整數(shù);
2、請求支付跳轉(zhuǎn)到微信支付時(shí),商品描述為亂碼:
原因:.setParameter("input_charset", "GBK"); //字符編碼
修改編碼為UTF-8 ,
3、total_fee 錢數(shù)*100 精度丟失問題
String.valueOf((int)(moeny * 100)?
應(yīng)為
float moeny=19.79f;
BigDecimal re1=new BigDecimal(Float.toString(moeny));
BigDecimal re2=new BigDecimal(Float.toString(100.00f));
System.out.println((int)re1.multiply(re2).floatValue());
另外如果使用了微信支付的demo的方法,需將TenpayUtil中的getCharacterEncoding放回編碼修改為utf-8
4、當(dāng)描述為中文時(shí),應(yīng)該將xml轉(zhuǎn)碼下,變成
return newString(xmlstring.toString().getBytes(),"ISO8859-1");
效果如下:
源碼下載:http://download.csdn.net/detail/u013158983/9508889(內(nèi)含簽名工具)
說明:org.apache.http網(wǎng)絡(luò)訪問包已經(jīng)被android淘汰,如果想用須在gradle加上useLibrary 'org.apache.http.legacy'