近公司需要微信支付,所以不得不去看看微信支付文档。但是你懂得,那文档写的真带劲,看不懂。我直接放弃,开始集成。但是调起微信支付的时候:结果码为-1,心里一惊,肯定哪里错了,就开始找坑。所以把自己解决的过程分享给大家,让集成微信支付成为很容易的一件事。
1、前期的准备:把App安装到手机,然后去微信平台下载签名工具:https://open.weixin.qq.com/zh_CN/htmledition/res/dev/download/sdk/Gen_Signature_Android.apk,安转到手机上。打开签名工具:输入你App的包名。然后去微信开放平台的管理中心修改应用签名。这样就不用担心签名的问题了。
2、我们需要的资源其实有以下几样,在开始前,就这些转备好吧
1)微信支付的APPID(还是在微信开放平台查看)
2)微信支付依赖包 :libammsdk.jar(Demo中复制)
3)一个Activity类 >>> WXPayEntryActivity.java(Demo中复制,注意放的位置:必须在wxapi包下,就是这么霸道)
3、这里开始就可以写代码了:
1)提交订单信息给后台获取加签后的订单信息:这里就是调用服务器接口,看一下你需要传给服务器什么收据了。比如我的项目中需要传给服务器一下的参数:
//票务id mMap.put("TicketId",ticketId); //场次id mMap.put("SeasonId",seasonId); //主题id mMap.put("TeamId",teamId); //当前日期 mMap.put("BookingTime",date); //女士订票人数 mMap.put("FemalePlayerCount",personTotalNv); //男士订票人数 mMap.put("MalePlayerCount",personTotalNan); //支付类型:1:微信 mMap.put("PayType",1)等 这样添加请求参数发起网络访问。然后后去一般会给你还回一个是否提交订单成功的Flag,如果提交订单成功,这样就可以获取到加签后的订单信息(有可能项目根据是否提交订单成功,如果成功还要发起一次网络访问获取加签后的订单信息) 2)Gson解析获取到的加签订单。如果用的是Retrofit那就是直接获得到实体类(我的定义成WXOrderEntity),直接到第三步。 3)调用微信SDK
private IWXAPI api;5、如果上面这几步都没有错误,应该就可以支付成功了。成功的流程:点击支付,提交订单后获得加签以后的订单信息,然后把加签后的订单信息交给微信Api发起微信支付,如果请求参数都正确,就会出现微信支付界面,输入密码即可完成支付,4、后台给的订单签名。我直接在这里被坑。这是后台的原因,应该是后台拼接订单的是否拼接错误导致的。(如果你也是后台给的签名请好好问一下后台,特别是"noncestr",是否把它拼接成了"nonce_str",注意没有下划线,没有下划线,没有下划线,重要的事情说3遍。好多的后台因为疏忽而拼接了下划线,导致签名错误而致使支付失败的)//调用微信SDK,发起支付 private void doWXPay() { //实例化微信Api api= WXAPIFactory.createWXAPI(this,"wx6ba18110e2a3cbb2"); //注册 api.registerApp("wx6ba18110e2a3cbb2"); PayReq req = new PayReq(); //应用的ID req.appId = mWXOrderEntity.getData().getAppid(); //商户号 req.partnerId = mWXOrderEntity.getData().getPartnerid(); //预支付交易会话 req.prepayId = mWXOrderEntity.getData().getPrepayid(); //拓展字段 req.packageValue = mWXOrderEntity.getData().getPackageX(); //随机字符串 req.nonceStr = mWXOrderEntity.getData().getNoncestr(); //时间戳 req.timeStamp = mWXOrderEntity.getData().getTimestamp(); //签名 req.sign = mWXOrderEntity.getData().getSign(); Logger.e(req.checkArgs()+"");//这是检查你请求参数是否有误,如果打印是false,请检查你的请求参数是否是上面的几个 Logger.e(api.sendReq(req)+""); //这表示能够调起api,一般上面那个成功,这个没有问题。两个Log如果打印都是true,恭喜你离成功不远了 Toast.makeText(MyApp.getINSTANCE(), "正常调起支付", Toast.LENGTH_SHORT).show(); api.sendReq(req);//这个是微信的api,发送请求,这样就交给微信了,剩下的就是用户输入密码等,我们只要等着拿结果 }
4)注意签名,你要确认得到加签后的订单信息,后台是否已经签名。如果服务器端已经做过了签名生成,那么这里直接拿着赋值给PayReq
对象即可,而且可以非常愉快的玩耍了,直接跳过这步。如果服务器端没有做,那么还需要在本地进行签名生成之后,再赋值。
签名请参考:微信支付Demo
4、微信结果的回调:
(1)必须在Manifest文件中加入下面的:
(2)确保WXPayEntryActivity在wxapi包下
- <!-- 微信支付回调页 -->
- <activity
- android:name="<span style="color:#FF0000;">.wxapi.WXPayEntryActivity</span>"
- android:exported="true"
- android:launchMode="singleTop">
- </activity>
(3)WXPayEntryActivity中拿到支付结果
如果你的resp.errCode结果码是1,那恭喜你支付成功了,可以大吉大利今晚吃鸡。但是如果是 -1,那也恭喜你和我一样也掉进坑里,支付失败了。我们这时就需要去寻找失败的原因了。
- @Override
- public void onResp(BaseResp resp) {
- Logger.d(TAG, "onPayFinish, errCode = " + resp.errCode);
- if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
- AlertDialog.Builder builder = new AlertDialog.Builder(this);
- builder.setTitle("提示");
- builder.setMessage("微信支付结果" +String.valueOf(resp.errCode));
- builder.show();
- }
- }
如果支付失败并且你复制是我上面那段代码,应该是点击支付按钮以后直接出现下面的界面:(而没有调起微信,出现微信支付界面)
如果你是我上面描述的情况:一下我说的每一句话都非常的关键:
1、应用签名的问题(如果你是按照我所说的添加签名的,那就可以排除这个原因。如果你有集成微信登录或者分享,如果可以那也可以排除应用签名的问题)
2、打印一下后台签名返回的数据,看看是否每一项都有数据。
3、订单签名问题。如果是订单要自己签名,请查看官方Demo(一定仔细看看)。在生成签名时,务必注意key的拼写问题,比如必须拼appid而不是appId,必须拼prepayid而不是prepayId,如果拼接错误支付也是会失败的。如果是后台给的签名请看下一步
然后微信这是会给后台一个异步通知是否订单支付成功,我们只需要在调用后台给的接口,来判断支付是否真的成功即可,注意之后结果是否成功应该以后台为准,而不是微信的成功结果码。(有问题可以留言)