本篇主要讲解android端的接入流程,如需了解服务端的接入流程可以看我的另一篇《 手把手教你接入微信app支付服务端python篇》
下面我们直接从接入的代码开始讲起
1,首先在app Gradle中引入微信app支付所需库
implementation 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+'
2,在调用微信支付所在的Activity中创建IWXAPI
对象并命名为api
,然后调用WXAPIFactory
的createWXAPI
方法进行初始化后赋值给api
,然后调用api
的registerApp
方法将微信支付注册到app中,下面是代码的操作步骤
private IWXAPI api;
//这里接收两个参数,第一个是context,第二个是应用的appid
api = WXAPIFactory.createWXAPI(this, "appid");
//将微信注册到app中
api.registerApp("appid");
3,创建一个wechatPay
方法,我们将拉起微信支付的逻辑放在wechatPay
方法中
//拉起微信支付
private void wechatPay(){
}
4,首先创建PayReq
对象,该对象是用来接收拉起微信支付的参数用的
然后利用PayReq
对象构造拉起微信支付所需参数
最后在调用api
的sendReq
方法提交所构造的参数即可,不出意外的话就可以拉起微信支付了
特别注意构造拉起微信支付的有所参数必须由服务端生成!!!
假设我们从服务端获取到了拉起微信支付所需的json参数,那么具体具体代码如下:
//拉起微信支付
private void wechatPay(){
try {
PayReq req = new PayReq();
JSONObject jsonObject = new JSONObject(json);
JSONObject data = jsonObject.getJSONObject("data");
//构造拉起微信支付所需参数
req.appId = data.getString("appid");
req.partnerId = data.getString("mch_id");
req.prepayId = data.getString("prepay_id");
req.nonceStr = data.getString("nonce_str");
req.timeStamp = data.getString("timeStamp");
req.packageValue = data.getString("packageValue");
req.sign = data.getString("sign");
//提交参数,拉起微信支付
api.sendReq(req);
Toast.makeText(bbsActivity.this, "正在打开支付页面", Toast.LENGTH_SHORT).show();
} catch (JSONException e) {
e.printStackTrace();
}
}
到这里不出意外的话就可以成功拉起微信支付的页面了
当我们付完款后我们需要知道支付结果,下面我们就来编写支付结果的监听
首先在app包的根路径(也就是包名所在的路径)下创建wxapi
文件夹,在wxapi
文件夹下创建一个Activity命名为WXPayEntryActivity
,这里需要注意的是文件夹名必须是wxapi
,Activity的名字必须是WXPayEntryActivity
,不然是收不到微信的回调的
下图是目录结构
WXPayEntryActivity
需要继承IWXAPIEventHandler
接口,然后重写onReq
和onResp
方法
在onResp
方法中编写我们的支付结果回调
首先使用resp
对象的getType
方法和ConstantsAPI
的COMMAND_PAY_BY_WX
常量进行判断,如果相等则进入实质性的支付结果流程,注意resp
对象是onResp
回调的参数,我们直接使用即可
然后使用resp
的errCode
常量判断返回的结果
resp.errCode == 0
说明支付完成,因为出于安全方面的考虑具体的支付结果必须通过服务端的异步通知为准,所以这里我们判断resp.errCode == 0
仅做为支付完成,当判断支付完成后我们再去获取服务端的支付结果作为最终用户的支付凭证
resp.errCode == -1
说明支付出错
resp.errCode == -2
说明支付取消
下面是onResp
方法的具体实现
@Override
public void onResp(BaseResp resp) {
if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
if (resp.errCode == 0){
// 支付完成
// 该笔订单是否真实支付成功,需要依赖服务端的异步通知。
// 在这里可以请求服务端的返回结果
}else if (resp.errCode == -1){
Toast.makeText(this, "支付出错", Toast.LENGTH_SHORT).show();
}else if (resp.errCode == -2){
Toast.makeText(this, "支付取消", Toast.LENGTH_SHORT).show();
}
}
}
到这里整个android端的微信支付接入流程就全部走完了
希望能够帮助到大家,我们下一篇博文再见
版权属于: 余书
原文地址: http://www.xcstudio.cn/?id=6
转载时必须以链接形式注明原始出处及本声明。