本篇主要讲解android端的接入流程,如需了解服务端的接入流程可以看我的另一篇《 手把手教你接入微信app支付服务端python篇》

下面我们直接从接入的代码开始讲起

1,首先在app Gradle中引入微信app支付所需库

implementation 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+'

2,在调用微信支付所在的Activity中创建IWXAPI对象并命名为api,然后调用WXAPIFactorycreateWXAPI方法进行初始化后赋值给api,然后调用apiregisterApp方法将微信支付注册到app中,下面是代码的操作步骤

private IWXAPI api;
//这里接收两个参数,第一个是context,第二个是应用的appid
api = WXAPIFactory.createWXAPI(this, "appid");
//将微信注册到app中
api.registerApp("appid");

3,创建一个wechatPay方法,我们将拉起微信支付的逻辑放在wechatPay方法中

//拉起微信支付
private void wechatPay(){

}

4,首先创建PayReq对象,该对象是用来接收拉起微信支付的参数用的

然后利用PayReq对象构造拉起微信支付所需参数

最后在调用apisendReq方法提交所构造的参数即可,不出意外的话就可以拉起微信支付了

特别注意构造拉起微信支付的有所参数必须由服务端生成!!!

假设我们从服务端获取到了拉起微信支付所需的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,不然是收不到微信的回调的

下图是目录结构

微信支付回调目录结构  手把手教你接入微信app支付android篇 android

WXPayEntryActivity需要继承IWXAPIEventHandler接口,然后重写onReqonResp方法

onResp方法中编写我们的支付结果回调

首先使用resp对象的getType方法和ConstantsAPICOMMAND_PAY_BY_WX常量进行判断,如果相等则进入实质性的支付结果流程,注意resp对象是onResp回调的参数,我们直接使用即可

然后使用resperrCode常量判断返回的结果

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端的微信支付接入流程就全部走完了

希望能够帮助到大家,我们下一篇博文再见

暂无留言,赶快评论吧

欢迎留言