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

原创 2017年05月31日 16:12:31

开始

怎么吐槽微信支付咱们就不多说了,真是各种坑,我一共弄了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起来了,说明代码没问题。如果没运行起来,又不是你环境的问题,你距这个博客的时间超过两年,那很有可能是微信变了。最后祝大家好运啦!!!!!!!

Android微信支付签名错误解决方法

整体流程:1.拼接商品的信息List packageParams = new LinkedList(); packageParams.add(new BasicNameValu...
  • guoh_
  • guoh_
  • 2016年01月25日 12:03
  • 9068

android 微信支付 签名错误

前言 最近在做一个web app是个商城里面需要集成微信支付,在开发的过程中遇到许多坑。 本次主要介绍签名错误,其实造成签名的错误有很多。 正文  我这里只介绍 由于网络请求参数Strin...
  • hu285279904
  • hu285279904
  • 2016年08月17日 13:21
  • 797

【java】微信支付生成签名的过程

关于签名的算法,api提供的原文是: 1.签名算法 签名生成的通用步骤如下: 第一步,设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序...
  • xb12369
  • xb12369
  • 2015年05月14日 11:19
  • 51958

浅谈安卓微信支付遇到的那些坑(服务端签名)

**浅谈安卓微信支付遇到的那些坑(服务端签名)** 做微信支付首先需要到微信开放平台https://open.weixin.qq.com注册自己的APP。 1,如果是创建移动应用就...
  • qq_15122875
  • qq_15122875
  • 2016年03月22日 15:15
  • 6318

关于微信支付以及获取签名的正确方法

填写资料信息获取appid 注意事项 在微信支付开放平台上填写应用信息,获取appid时,注意获取到应用签名时,签名尽量要小写,并且不要加:,如图  否则会出现小的问题,尽量和官方文档保持一致...
  • tiankongcheng6
  • tiankongcheng6
  • 2017年11月05日 15:18
  • 249

微信支付一直签名错误

这两天无数次在做微信支付的时候出现签名错误,都快崩溃了。明明我自己生成的签名是没得问题的。自己手动生成的签名,和官方的微信支付接口测试结果是一样的。 后来无意中提到了  postMethod.se...
  • qq_25821067
  • qq_25821067
  • 2017年02月16日 11:25
  • 6170

微信支付统一下单,签名错误

微信支付统一下单,签名错误
  • ZaiYiNiDeZaiYi
  • ZaiYiNiDeZaiYi
  • 2017年04月19日 15:03
  • 7816

微信支付有汉字时出现签名错误的解决办法

微信支付有汉字时出现签名错误的解决办法 最近发现在win2003开发微信支付时,有汉字时出现签名错误,但在win7上不会出错, 最后发现是字符编码不一致造成的。 解决办法 改正...
  • yjg428
  • yjg428
  • 2015年03月06日 23:44
  • 17041

微信支付后台总是返回数据签名错误篇一

String appid = CommonsUtil.appid; // 公众账号 ID String mch_id = CommonsUtil.mchId;// 商户号 String body = ...
  • safedriver
  • safedriver
  • 2014年11月15日 15:35
  • 5456

微信小程序支付签名失败,错误的解决方法,小程序支付签名paySign开发demo

微信小程序支付开发, 其实这里的接口, 大部分跟微信公众号支付接口类似, 包括 1、 签名 2、 提交证书 3、 统一下单 4、 订单查询 5、 退...
  • towtotow
  • towtotow
  • 2018年01月13日 10:39
  • 226
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何集成android微信支付及各种问题(-1,签名错误,无法获得预支付id)的解决办法。
举报原因:
原因补充:

(最多只允许输入30个字)