如何集成android微信支付及各种问题(-1,签名错误,无法获得预支付id)的解决办法。

转自:https://blog.csdn.net/gaoqingliang521/article/details/72821188

开始

怎么吐槽微信支付咱们就不多说了,真是各种坑,我一共弄了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";
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    正常来说 我们拿着这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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    这些代码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起来了,说明代码没问题。如果没运行起来,又不是你环境的问题,你距这个博客的时间超过两年,那很有可能是微信变了。最后祝大家好运啦!!!!!!!


猜你喜欢

转载自blog.csdn.net/juan0728juan/article/details/79815655
今日推荐