微信支付接入完全解析之Android客户端(2)

前段时间在一个App中接入了微信支付功能,想来也稳定运行快一个月了,回头想想自己接入微信支付时候踩过的坑,决定写一篇自己当初想要搜寻的文章,文章准备分3篇完成。
第一篇:微信支付前期准备
第二篇:微信支付接入客户端部分(以Android为例)
第三篇:微信支付接入服务端部分

客户端接入流程介绍

只要清楚了接入流程,微信支付客户端的接入是很简单的。

  1. 点击你APP的一个按钮,调用你向APP后台发起生成订单的请求接口函数。
  2. 后台接口生成自己平台的订单,然后调用腾讯后台生成微信预支付订单后将数据返回给前端。
  3. 前端拿到需要的数据后,调起微信支付
  4. 输入密码,确认支付
  5. 向后台确认支付状态后展示结果。(此步很重要,虽然微信支付前端也会产生回调,但是微信官方说那个不准确,需要主动向后端验证)

    完成上面5步即可轻松完成支付,是不是巨简单。

具体接入步骤

先阅读开发文档,了解概况,并下载示例代码。

第一步: 在AndroidStudio 里面打开 app模块下的build.gradle 文件,在依赖里面配置
implementation 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'

第二步: 在包名下面建立wxapi文件夹,然后将WXPayEntryActivity文件放入其中,注意路径一定要正确,java/你的包名/wxapi/WXPayEntryActivity.java

public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler
{
    private static final String TAG = "WXPayEntryActivity";

    private IWXAPI api;
    private Activity mAct;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //setContentView(R.layout.pay_result);
        mAct=this;
        api = WXAPIFactory.createWXAPI(this, KeyStore.WE_CHAT_APP_ID);
        api.handleIntent(getIntent(), this);
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        setIntent(intent);
        api.handleIntent(intent, this);
    }

    @Override
    public void onReq(BaseReq req) {
        if (req instanceof PayReq)
        {
            Logger.t(TAG).d("是子类");
        }
    }

    @Override
    public void onResp(BaseResp resp) {
        //Logger.t(TAG).d("onPayFinish, errCode = " + resp.errCode);
        if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX)
        {
            switch (resp.errCode) {
                case 0:
                    mAct.sendBroadcast(new Intent(AppConstant.BROAD_ANCTION_PAY_SUCCESS));
                    break;
                case -1:
                    ToastUtils.showShort("支付失败");
                    break;
                case -2:
                    ToastUtils.showShort("支付取消");
                    break;
                default:
                    ToastUtils.showShort("支付失败");
                    break;
            }
            finish();
        }
    }
}

支付完成后会回调onResp()方法

第三步: 调用你自己的生成订单的后台接口,这个接口生成自己的订单,然后调用微信支付后台,获得需要的参数。 所需参数参考下面的javabean

    public class WeChatBean
    {
        private String appId;
        private String partnerId;
        private String prepayId;
        private String nonceStr;
        private String timeStamp;
        private String sign;
        private String extData;
        private String signType;
        ****
    }

第四步: 使用后台返回来的数据调起微信支付

    public void weChatPay(WeChatBean weChatBean)
    {
        IWXAPI payApi = WXAPIFactory.createWXAPI(mAct, weChatBean.getAppId());
        if (payApi != null)
            payApi.registerApp(weChatBean.getAppId());

        PayReq payReq = new PayReq();
        payReq.appId = weChatBean.getAppId();
        payReq.partnerId = weChatBean.getPartnerId();
        payReq.prepayId = weChatBean.getPrepayId();
        payReq.packageValue = "Sign=WXPay";
        payReq.nonceStr = weChatBean.getNonceStr();
        payReq.timeStamp = weChatBean.getTimeStamp();
        payReq.sign = weChatBean.getSign();
        payReq.extData = weChatBean.getExtData();
        myRechargeOrderId = weChatBean.getExtData();
        payApi.sendReq(payReq);
    }

第五步:输入密码支付后,会回调WXPayEntryActivity里面的onResp()方法。

    public void onResp(BaseResp resp) {
        //Logger.t(TAG).d("onPayFinish, errCode = " + resp.errCode);
        if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX)
        {
            switch (resp.errCode) {
                case 0:
                    //mAct.sendBroadcast(new Intent(AppConstant.BROAD_ANCTION_PAY_SUCCESS));
                    break;
                case -1:
                    ToastUtils.showShort("支付失败");
                    break;
                case -2:
                    ToastUtils.showShort("支付取消");
                    break;
                default:
                    ToastUtils.showShort("支付失败");
                    break;
            }
            finish();
        }
    }

第六步: 当支付成功时,调用自己的后台接口,查询支付结果。向后台查询支付结果需要等待一定时间,例如1秒,因为微信回调支付结果给我们后台是需要时间的,如果立刻查询有可能查询不到结果。我是发了个广播,然后在我发起支付的页面接收广播,处理了支付结果。

    private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver()
    {
        @Override
        public void onReceive(Context context, Intent intent)
        {
            String action = intent.getAction();
            Logger.t(TAG).d("接收到了广播》action:" + action);
            //支付成功状态确认
            if (action.equals(AppConstant.BROAD_ANCTION_PAY_SUCCESS))
            {
                new Handler().postDelayed(new Runnable()
                {
                    @Override
                    public void run()
                    {
                        if (mPresenter != null)
                            mPresenter.queryOrderPayState(myRechargeOrderId);
                    }
                }, 1000);
            }
        }
    };

注意:一定要注意签名要和腾讯后台配置一致,不然会调起失败。

很简单,没有骗你吧,本文源码下载

预知服务器端如何,且看下篇博文

猜你喜欢

转载自blog.csdn.net/shusheng0007/article/details/79542886