Android集成微信支付,实战,跳坑。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/wb_001/article/details/52524646

之前开发的项目都有微信支付,所以对微信支付比较熟悉,现在对微信支付的集成进行详解:
首先,去微信开发平台下载相关文档,SDK,微信开发者平台地址:https://open.weixin.qq.com/
第一步,当然是把SDK里面的jar包放到你自己的项目中,
这里写图片描述
然后,将demo中的wxapi文件夹原封不动的复制到你的项目中,注意,原封不动,绝对不能改他的包名和类名!不然掉不起支付:
这里写图片描述
好,到这里,我们基本完成了集成所需要的东西,基础东西,然后,我们看代码:
1、刚刚我们讲的wxapi包下WXPayEntryActivity类,他是个activity,所以在manifest.xml中必须对他进行注册,注册的时候,也需要注意的是,找到你demo中manifest的这个activity的注册,同时,也是原封不动的复制到你的项目中去。注意原封不动绝对不能自作聪明的改成自己的配置方式,否则启动不了这个activity。
2、在你的启动微信支付的activity中的onCreate方法中注册微信api:
这里写图片描述
第一行是初始化IWXAPI这个类,然后注册,注册的时候你需要转入一个appId,就是我这里的Constants.APP_ID。这个appId是通过在开发中平台中的一个工具(具体叫什么我忘了),用你的项目包名通过这个工具生成一串什么码,然后用这个码到开发者平台上去申请微信支付(要钱的)这时会给你生成一个appId,这样,你的这个项目就可以支持微信支付,要注意的是,这个appId绑定的是你的项目包名,所以只能在你这个项目中使用,用其他的appId,或者个其他的app用都是不能调起支付的。
3、访问你的后台接口,获取微信支付所需要的参数,然后将这些参数传入微信支付后台,看代码:

  asyncHttpHelper = AndroidAsyncHttpHelper.getInstance();
                            Map<String, Object> params = new HashMap<>();
                            params.put("access_token", sharePreferenceUtil.getToken());
                            params.put("price", payMoney);
                            params.put("pay", pay);
                            APPLogger.i(Constants.TAG, pay);
                            asyncHttpHelper.get(ChargeActivity.this, Constants.HTTP_URL + "Account/rechargePlatform", params, new JsonHttpResponseHandler() {
                                @Override
                                public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
                                    super.onSuccess(statusCode, headers, response);
                                    APPLogger.i(Constants.TAG, "微信支付:" + response.toString());
                                    try {
                                        if (response.optBoolean("success")) {
                                            JSONObject object = response.optJSONObject("data");
                                            PayReq req = new PayReq();
                                            req.appId = object.getString("appid");
                                            req.partnerId = object.getString("partnerid");
                                            req.prepayId = object.getString("prepayid");
                                            req.nonceStr = object.getString("noncestr");
                                            req.timeStamp = object.getString("timestamp");
                                            req.packageValue = object.getString("package");
                                            req.sign = object.getString("sign");
                                            AppManager.getAppManager().showMessage(ChargeActivity.this, "成功调起支付...");
                                            iwxapi.sendReq(req);
                                        } else {
                                            AppManager.getAppManager().showMessage(ChargeActivity.this, "支付调起失败...");
                                        }
                                    } catch (Exception e) {
                                        e.printStackTrace();
                                        AppManager.getAppManager().showMessage(ChargeActivity.this, "异常:" + e.getMessage());
                                    }
                                }

                                @Override
                                public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {
                                    super.onFailure(statusCode, headers, responseString, throwable);
                                }
                            });
                        }

忽略其他,直接看接口返回的参数:
这里写图片描述
首先new一个PayReq对象,然后将后台返回给你的值对应的给req中属性赋值,注意,必须一一对应,不能写错,然后,通过iwxapi.sendReq(req);方法将你这边的参数传入微信后台来发起支付。到这里,你成功了一半。

4、支付结果回调:回调的地址就是在这里写图片描述
在这里面处理支付结果,第一步同样是要通过appId初始化IWXAPI
这里写图片描述
这里面的那些重写的方法不要去动他,我们要关注的是onResp这个方法,这个就是支付结果的回调的方法,这里面会传入一个BaseResp对象,通过这个对象来获取支付结果对应的code,看我的代码:

 @Override
    public void onResp(BaseResp resp) {
        if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
            APPLogger.i(Constants.TAG, "支付返回码:" + resp.errCode);
            if (resp.errCode == 0) {
                AppManager.getAppManager().showMessage(WXPayEntryActivity.this, "支付成功");
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        if (tv_ChargeFlag != null) {
                            tv_ChargeFlag.setText("支付成功");
                        }
                        if (iv_ChargeFlag != null) {
                            iv_ChargeFlag.setImageResource(R.drawable.charge_success);
                        }
                    }
                }, 100);
            } else {
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        if (tv_ChargeFlag != null) {
                            tv_ChargeFlag.setText("支付失败");
                        }
                        if (iv_ChargeFlag != null) {
                            iv_ChargeFlag.setImageResource(R.drawable.charge_failed);
                        }
                    }
                }, 100);
            }
        }
    }

这里通过获取resp.errCode来判断支付是否成功:
这里写图片描述
当他返回的值为0的时候,那么支付成功,成功的时候可以换成你自己的提示方式,我这个代码就是换成了我自己的提示方式,所以跟demo中的不一样。
好,接下来,又有一个要注意的,当你在这里名更新UI的时候,这时候你支付成功了但是app崩溃,为什么呢?因为你在这个线程里面不能用来更新UI,所以,你必须开一个线程来更新UI,同时给他一个延迟,就想我这里用的 new Handler().postDelayed(new Runnnable(){ ,100});给个100毫秒的延迟即可,看上面的代码。

如果,到这里你不觉得我是个渣渣写的是辣鸡代码的话,恭喜你,你会集成微信支付了!

如果有我有错误的地方,请你一切以你在开发者平台中下载SDK文档demo为准,谢谢!

猜你喜欢

转载自blog.csdn.net/wb_001/article/details/52524646
今日推荐