Android微信支付集成和踩过的坑

近公司需要微信支付,所以不得不去看看微信支付文档。但是你懂得,那文档写的真带劲,看不懂。我直接放弃,开始集成。但是调起微信支付的时候:结果码为-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;
//调用微信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文件中加入下面的:
  1. <!-- 微信支付回调页 -->  
  2.        <activity  
  3.            android:name="<span style="color:#FF0000;">.wxapi.WXPayEntryActivity</span>"  
  4.            android:exported="true"  
  5.            android:launchMode="singleTop">  
  6.        </activity>  
(2)确保WXPayEntryActivity在wxapi包下
(3)WXPayEntryActivity中拿到支付结果
  1. @Override  
  2.     public void onResp(BaseResp resp) {  
  3.         Logger.d(TAG, "onPayFinish, errCode = " + resp.errCode);  
  4.         if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {  
  5.             AlertDialog.Builder builder = new AlertDialog.Builder(this);  
  6.             builder.setTitle("提示");  
  7.             builder.setMessage("微信支付结果" +String.valueOf(resp.errCode));  
  8.             builder.show();  
  9.         }  
  10.     }  
如果你的resp.errCode结果码是1,那恭喜你支付成功了,可以大吉大利今晚吃鸡。但是如果是-1,那也恭喜你和我一样也掉进坑里,支付失败了。我们这时就需要去寻找失败的原因了。
如果支付失败并且你复制是我上面那段代码,应该是点击支付按钮以后直接出现下面的界面:(而没有调起微信,出现微信支付界面)


如果你是我上面描述的情况:一下我说的每一句话都非常的关键:
1、应用签名的问题(如果你是按照我所说的添加签名的,那就可以排除这个原因。如果你有集成微信登录或者分享,如果可以那也可以排除应用签名的问题)
2、打印一下后台签名返回的数据,看看是否每一项都有数据。
3、订单签名问题。如果是订单要自己签名,请查看官方Demo(一定仔细看看)。在生成签名时,务必注意key的拼写问题,比如必须拼appid而不是appId,必须拼prepayid而不是prepayId,如果拼接错误支付也是会失败的。如果是后台给的签名请看下一步
4、后台给的订单签名。我直接在这里被坑。这是后台的原因,应该是后台拼接订单的是否拼接错误导致的。(如果你也是后台给的签名请好好问一下后台,特别是"noncestr",是否把它拼接成了"nonce_str",注意没有下划线,没有下划线,没有下划线,重要的事情说3遍。好多的后台因为疏忽而拼接了下划线,导致签名错误而致使支付失败的)5、如果上面这几步都没有错误,应该就可以支付成功了。成功的流程:点击支付,提交订单后获得加签以后的订单信息,然后把加签后的订单信息交给微信Api发起微信支付,如果请求参数都正确,就会出现微信支付界面,输入密码即可完成支付,
然后微信这是会给后台一个异步通知是否订单支付成功,我们只需要在调用后台给的接口,来判断支付是否真的成功即可,注意之后结果是否成功应该以后台为准,而不是微信的成功结果码。(有问题可以留言)
展开阅读全文

没有更多推荐了,返回首页