之前开发的项目都有微信支付,所以对微信支付比较熟悉,现在对微信支付的集成进行详解:
首先,去微信开发平台下载相关文档,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为准,谢谢!