如何集成android微信支付及各種問題(-1,簽名錯誤,無法獲得預支付id)的解決辦法。

開始

怎麼吐槽微信支付咱們就不多說了,真是各種坑,我一共弄了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. 包名和簽名 一定要跟後臺創建應用時設置的一樣,怎麼驗證你的包名和簽名沒問題呢?可以先做一個分享的功能,如果分享成功了,就說明的你的包名和簽名是沒問題的(分享功能很簡單,幾行代碼就可以搞定)。
  2. 有三個參數一定不要搞錯了
    (1).APPID 一串這樣的字符wx04b9d24e4deb65bb,可在開放者平臺https://open.weixin.qq.com你創建的應用裏查看。
    (2)商戶ID(也可以叫partnerid和mchid),登錄商戶平臺https://pay.weixin.qq.com 可在右上角查看,一串1472236803這樣的字符串,這個id可以理解爲收款的賬號。
    (3)API_KEY,這個也是商戶平臺設置的
    設置步驟: 登錄商戶平臺 -> 賬戶中心->Api安全 ,這個碼正常都是32位的。
  3. 微信官方規定 回調類有固定的包名限制 比如 你到微信開放平臺 查看你的項目包名是 com.cuiwenbao.test 那麼回調類就必須放在com.cuiwenbao.test.wxapi 這個包下面 回調類的名字是WXPayEntryActivity.java
  4. 記得註冊 msgApi.registerApp(Constants.APP_ID);

開發時遇到的問題和解決辦法。

  1. -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問題就解決了。

  2. 自己生成預支付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裏面有具體實現。

  3. 升級新的接口後還是報 “簽名錯誤”?
    答:升級新的接口後,請求預支付id時 有個body字段,這個字段的值不能爲中文。

總結:

還是那個demo,先把demo運行起來吧,如果demo起來了,說明代碼沒問題。如果沒運行起來,又不是你環境的問題,你距這個博客的時間超過兩年,那很有可能是微信變了。最後祝大家好運啦!!!!!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章