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

开始

怎么吐槽微信支付咱们就不多说了,真是各种坑,我一共弄了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问题就解决了。

  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里面有具体实现。

  2. 升级新的接口后还是报 “签名错误”?
    答:升级新的接口后,请求预支付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和我写死的是一模一样的,但是用后台传的就不行。

在这真是不得不说 微信支付集成真的很坑,跟支付宝没法比。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Granger_g

大爷,赏小女子口饭吃如何?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值