转自: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).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";
- 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问题就解决了。
自己生成预支付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起来了,说明代码没问题。如果没运行起来,又不是你环境的问题,你距这个博客的时间超过两年,那很有可能是微信变了。最后祝大家好运啦!!!!!!!