由于近日項(xiàng)目中要用到微信支付,而且遇到的坑比較多,就寫了這一篇博文(PS:文采不好芽狗,勿噴勿噴)设预,希望還處在坑中的朋友有所幫助。
1瓦糕、先去微信公眾平臺(tái)申請(qǐng)應(yīng)用 ,成功之后,你還要去商戶平臺(tái)進(jìn)行驗(yàn)證腋寨,具體可以參考:http://kf.qq.com/faq/120911VrYVrA150906F3qqY3.html
成功之后,你就可以得到
appid化焕、mch_id萄窜、app_key等一系列參數(shù)
注意:這里有一個(gè)坑,那就是你的應(yīng)用簽名要用一個(gè)簽名工具來獲取撒桨,之后我會(huì)上傳上去查刻,還有微信規(guī)定調(diào)試的時(shí)候,你的簽名必須要和微信公眾平臺(tái)上面的簽名一致凤类,這點(diǎn)很重要穗泵,簽名文件路徑為:C:\Users\Huang\.Android
如果在別的電腦上要測(cè)試的話,就必須替換掉這個(gè)debug.keystore簽名文件谜疤,但是每次更換簽名文件時(shí)必須重啟一下Android Studio或者eclipse佃延。
2、先配置好權(quán)限和微信回調(diào)類WXPayEntryActivity,注意微信規(guī)定路徑必須是包名下面的wxapi文件夾的路徑茎截,不然會(huì)造成回調(diào)不成功苇侵。
(2)獲取預(yù)支付交易會(huì)話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)起支付界面,請(qǐng)檢查下有沒有WXPayEntryActivity注冊(cè)擦俐。
(2)簽名錯(cuò)誤
可以把自己的簽名與微信官網(wǎng)測(cè)試地址的簽名進(jìn)行對(duì)比脊阴,https://pay.weixin.qq.com/wiki/tools/signverify/,若為正確的話,可以檢查下自己的包名與密鑰嘿期,實(shí)在保證沒錯(cuò)的話可以試著重置一下密鑰品擎。
(3)返回-1:
1、解決方法同上备徐,再注意檢查一下lib下面的包有沒有導(dǎo)入進(jìn)來萄传,appid有沒有錯(cuò)誤,參數(shù)有沒有傳錯(cuò)之類的蜜猾,大部分都是由于簽名不對(duì)造成的秀菱;
2、建議清理一下微信緩存蹭睡。
最后衍菱,由于微信不斷更新,目前此版本基于2016.5.3的版本棠笑。
(4)
1梦碗、請(qǐng)求的時(shí)候獲取不到prepayid。
原因:setParameter("total_fee", "1"); //商品金額,以分為單位
total_fee里面的參數(shù)是否有小數(shù)點(diǎn)蓖救,或者測(cè)試的時(shí)候修改為了0.01洪规;
需檢查:total_fee傳入的參數(shù)是否為整數(shù);
2循捺、請(qǐng)求支付跳轉(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'