開始
怎麼吐槽微信支付咱們就不多說了,真是各種坑,我一共弄了3天,才弄好。
在開始說我遇到的各種問題之前,我想先給大家提供一個特別好用的demo,我就是通過這個demo把問題都解決了。如果你把這個demo成功運行起來了,那就說明代碼是沒問題的,下面你就重點去查看,你的包名的和簽名是否跟你在微信後臺填寫的一樣等等。跟代碼無關的信息。
demo地址:http://download.csdn.net/download/gaoqingliang521/9856895
這個demo是一個eclipse工程,工程裏有一個詳細的說明文檔會告訴你,怎麼快速的運行這個demo。
怎麼集成微信?
這個就不多說了,這個鏈接是官方的開發者文檔
https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5
這個看不太懂也沒關係,上面不是還有demo嗎,demo成功運行後,直接用demo裏的代碼就ok啦!!
集成微信支付時需要注意的一些問題
- 包名和簽名 一定要跟後臺創建應用時設置的一樣,怎麼驗證你的包名和簽名沒問題呢?可以先做一個分享的功能,如果分享成功了,就說明的你的包名和簽名是沒問題的(分享功能很簡單,幾行代碼就可以搞定)。
- 有三個參數一定不要搞錯了
(1).APPID 一串這樣的字符wx04b9d24e4deb65bb,可在開放者平臺https://open.weixin.qq.com你創建的應用裏查看。
(2)商戶ID(也可以叫partnerid和mchid),登錄商戶平臺https://pay.weixin.qq.com 可在右上角查看,一串1472236803這樣的字符串,這個id可以理解爲收款的賬號。
(3)API_KEY,這個也是商戶平臺設置的
設置步驟: 登錄商戶平臺 -> 賬戶中心->Api安全 ,這個碼正常都是32位的。 - 微信官方規定 回調類有固定的包名限制 比如 你到微信開放平臺 查看你的項目包名是 com.cuiwenbao.test 那麼回調類就必須放在com.cuiwenbao.test.wxapi 這個包下面 回調類的名字是WXPayEntryActivity.java
- 記得註冊 msgApi.registerApp(Constants.APP_ID);
開發時遇到的問題和解決辦法。
-1問題?
答:-1不用說肯定是啓動支付界面失敗了,我的-1是這麼產生的後臺給我返回了下面這7個字段req.appId = "wx04b9d24e4deb65b3"; req.partnerId = "1472236803"; req.prepayId = "wx2017053114280256dcd0214d0288506633"; req.packageValue = "Sign=WXPay"; req.nonceStr = "oedbomwfar04s1up66fvuj1xrgyxz5ua"; req.timeStamp = "1496212083"; req.sign ="A707A4B6072DCC44FCBA1F36AA07934A";
正常來說 我們拿着這7個字段 調用這個方法msgApi.sendReq(req);就可以直接調起支付界面了,可我的卻是-1錯誤。
解決辦法是對req.sign 再進行一次賦值,賦值代碼如下://服務器返回給我的7個字段 req.appId = "wx04b9d24e4deb65b3"; req.partnerId = "1472236803"; req.prepayId = "wx2017053114280256dcd0214d0288506633"; req.packageValue = "Sign=WXPay"; req.nonceStr = "oedbomwfar04s1up66fvuj1xrgyxz5ua"; req.timeStamp = "1496212083"; req.sign ="A707A4B6072DCC44FCBA1F36AA07934A"; //對sign 二次賦值 List<NameValuePair> signParams = new LinkedList<NameValuePair>(); signParams.add(new BasicNameValuePair("appid",req.appId)); signParams.add(new BasicNameValuePair("noncestr",req.nonceStr)); signParams.add(new BasicNameValuePair("package",req.packageValue)); signParams.add(new BasicNameValuePair("partnerid", req.partnerId)); signParams.add(new BasicNameValuePair("prepayid", req.prepayId)); signParams.add(new BasicNameValuePair("timestamp", req.timeStamp)); req.sign = genAppSign(signParams);<-這裏就是第二次賦值了 private String genAppSign(List<NameValuePair> params) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < params.size(); i++) { sb.append(params.get(i).getName()); sb.append('='); sb.append(params.get(i).getValue()); sb.append('&'); } sb.append("key="); sb.append(Constants.API_KEY); this.sb.append("sign str\n"+sb.toString()+"\n\n"); String appSign = MD5.getMessageDigest(sb.toString().getBytes()); Log.e("Simon","----"+appSign); return appSign; }
這些代碼demo裏面都有,我加上了這個二次賦值後-1問題就解決了。
自己生成預支付id時報(“errcode”:77523001,”errmsg”:”簽名錯誤”)?
答:這個問題很有可能是你還在用以前老版本的請求地址:
“https://api.weixin.qq.com/pay/genprepay?access_token=%s”
就是配合 access_token去獲取預支付id的那個接口。現在新版請求預支付id的接口已改爲:https://api.mch.weixin.qq.com/pay/unifiedorder” 這個接口不需要access_token,demo裏面有具體實現。升級新的接口後還是報 “簽名錯誤”?
答:升級新的接口後,請求預支付id時 有個body字段,這個字段的值不能爲中文。
總結:
還是那個demo,先把demo運行起來吧,如果demo起來了,說明代碼沒問題。如果沒運行起來,又不是你環境的問題,你距這個博客的時間超過兩年,那很有可能是微信變了。最後祝大家好運啦!!!!!!!