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

导读:本篇文章讲解 微信支付接入完全解析之Android客户端(2),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

前段时间在一个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);
            }
        }
    };

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/14796.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!