开始
怎么吐槽微信支付咱们就不多说了,真是各种坑,我一共弄了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起来了,说明代码没问题。如果没运行起来,又不是你环境的问题,你距这个博客的时间超过两年,那很有可能是微信变了。最后祝大家好运啦!!!!!!!
续:
2021年5月22日
最近自己写了个项目用到了微信支付功能,后台也是自己写的,先说一下问题,后台生成的prepayid 等参数通过下面这个地址检查参数都是通过的,通过就说明后台返回的参数没问题
https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=20_1
这里说一下,你可以通过上面的连接来断定 是你的问题还是后台的问题,后台给的参数先让他用上面的连接去验证一下,如果验证通过那就说明后台的参数没问题。下面是验证通过的界面。
再说一下我这次开发主要遇到的奇葩问题,后台返回的参数通过上面的连接验证没问题,但是传到我安卓前端请求时sendReq(request)与request.checkArgs() 都返回false 同时也肯定调不起来微信支付界面 。
解决办法也很奇葩 就是把安卓端的appId和partnerId都写死就调起来了。
也不知道是什么原因,后台返回给我的appId和partnerId和我写死的是一模一样的,但是用后台传的就不行。
在这真是不得不说 微信支付集成真的很坑,跟支付宝没法比。