1. 程式人生 > >微信支付接入完全解析之Android客戶端(2)

微信支付接入完全解析之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);
            }
        }
    };

注意:一定要注意簽名要和騰訊後臺配置一致,不然會調起失敗。

很簡單,沒有騙你吧,本文原始碼下載

預知伺服器端如何,且看下篇博文