Android 接入微信支付寶支付

吳小龍同學發表於2019-03-03

按照慣例,首先通讀一遍官網文件。

微信支付

前期準備

微信開放平臺

註冊賬號,建立應用,開通微信支付,這些大家都會的。

微信商戶平臺

APP支付文件
pay.weixin.qq.com/wiki/doc/ap… ,如果僅按照文件來,保證每次支付結果都是-1,對,只有-1,沒有任何其他資訊,不得不說,坑比。

APP支付時序圖
大概瞭解下支付流程:

Android 接入微信支付寶支付

接入SDK

引入libs

SDK下載:pay.weixin.qq.com/wiki/doc/ap… ,將libammsdk.jar放到libs資料夾下

配置debug簽名

建立應用需要填寫應用簽名,配置在debug下直接用的正式的key,這樣就不用每次打包才能調起微信客戶端

signingConfigs {
        debug {
            storeFile file("你的keystore路徑")
            storePassword "xxx"
            keyAlias "xxx"
            keyPassword "xxx"
        }

        release {
            storeFile file("你的keystore路徑")
            storePassword "xxx"
            keyAlias "xxx"
            keyPassword "xxx"
        }
}複製程式碼

WXPayEntryActivity

Android 接入微信支付寶支付

這個文件沒有半點介紹,WXPayEntryActivity是支付結束的回撥,和微信分享WXEntryActivity類似,必須放在包名.wxapi下,頁面可以自己寫。

AndroidManifest.xml中註冊

<!-- 微信支付 -->
<activity
    android:name=".wxapi.WXPayEntryActivity"
    android:exported="true"
    android:launchMode="singleTop"/>複製程式碼

網路許可權註冊不用說了。

支付介面呼叫

/**
 * 微信支付
 * @param data介面返回
 */
private void weixinPay(String data) {
    // 通過WXAPIFactory工廠,獲取IWXAPI的例項
    IWXAPI api = WXAPIFactory.createWXAPI(this, WEIXIN_APP_ID);
    // 將該app註冊到微信
    api.registerApp(WEIXIN_APP_ID);
    LogUtil.d("data=" + data);
    try {
        JSONObject json = new JSONObject(data);
        PayReq req = new PayReq();
        req.appId = json.getString("appid");
        req.partnerId = json.getString("partnerid");
        req.prepayId = json.getString("prepayid");
        req.nonceStr = json.getString("noncestr");
        req.timeStamp = json.getString("timestamp");
        req.packageValue = json.getString("package");
        req.sign = json.getString("sign");
        req.extData = "app data"; // optional
        // 在支付之前,如果應用沒有註冊到微信,應該先呼叫IWXMsg.registerApp將應用註冊到微信
        api.sendReq(req);
    } catch (JSONException e) {
        e.printStackTrace();
    }
}複製程式碼

為了安全,APP端調起支付的引數需要商戶後臺系統提供介面返回,引數說明文件:pay.weixin.qq.com/wiki/doc/ap…

問題

以為這樣就可以調起微信客戶端支付了,沒有想到一直返回支付結果為-1,沒有多餘的資訊提示,不虧是微信,Android程式碼就是簡潔!我們看到文件返回-1的提示“可能的原因:簽名錯誤、未註冊APPID、專案設定APPID不正確、註冊的APPID與設定的不匹配、其他異常等。”,我反覆檢查簽名、APPID均沒有錯誤,後臺也確定sign資訊正確,哎,我表示很無奈,iOS也呼叫了,他們提示”支付場景非法“,原來是由於後臺之前做web支付,trade_type沒有改成APP,改了我這邊就能正常調起了。

Android 接入微信支付寶支付

支付寶接入

前期準備

註冊賬號,建立應用,開通支付功能,這些也不說了。

接入文件

doc.open.alipay.com/docs/doc.ht…

支付互動流程

Android 接入微信支付寶支付

接入SDK

SDK下載:
doc.open.alipay.com/docs/doc.ht…
將alipaySdk-xxxxxxxx.jar包放到libs資料夾下

AndroidManifest.xml

新增許可權

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />複製程式碼

新增宣告

<!-- 支付寶 alipay sdk begin -->
<activity
    android:name="com.alipay.sdk.app.H5PayActivity"
    android:configChanges="orientation|keyboardHidden|navigation"
    android:exported="false"
    android:screenOrientation="behind">
</activity>
<activity
    android:name="com.alipay.sdk.auth.AuthActivity"
    android:configChanges="orientation|keyboardHidden|navigation"
    android:exported="false"
    android:screenOrientation="behind">
</activity>複製程式碼

支付介面呼叫

支付行為需要在獨立的非ui執行緒中執行,程式碼如下:

private Handler mHandler = new Handler() {
        @SuppressWarnings("unused")
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case SDK_PAY_FLAG: {
                    @SuppressWarnings("unchecked")
                    PayResult payResult = new PayResult((Map<String, String>) msg.obj);
                    /**
                     對於支付結果,請商戶依賴服務端的非同步通知結果。同步通知結果,僅作為支付結束的通知。
                     */
                    String resultInfo = payResult.getResult();// 同步返回需要驗證的資訊
                    String resultStatus = payResult.getResultStatus();
                    // 判斷resultStatus 為9000則代表支付成功
                    if (TextUtils.equals(resultStatus, "9000")) {
                        // 該筆訂單是否真實支付成功,需要依賴服務端的非同步通知。
                        Toast.makeText(mActivity, "支付成功", Toast.LENGTH_SHORT).show();
                    } else {
                        // 該筆訂單真實的支付結果,需要依賴服務端的非同步通知。
                        Toast.makeText(mActivity, payResult.getMemo(), Toast.LENGTH_SHORT).show();
                    }
                    break;
                }

                default:
                    break;
            }
        }

        ;
    };

    /**
     * 支付寶
     */
    private void alipay(final String orderInfo) {
        Runnable payRunnable = new Runnable() {

            @Override
            public void run() {
                PayTask alipay = new PayTask(mActivity);
                Map<String, String> result = alipay.payV2(orderInfo, true);
                Log.i("msp", result.toString());

                Message msg = new Message();
                msg.what = SDK_PAY_FLAG;
                msg.obj = result;
                mHandler.sendMessage(msg);
            }
        };

        Thread payThread = new Thread(payRunnable);
        payThread.start();
    }複製程式碼

同樣為了安全,這裡orderInfo是後臺介面返回,引數說明文件:
doc.open.alipay.com/docs/doc.ht…

這樣就over了,相比於微信支付,簡單的不能再簡單。

聯絡我

我的微信公眾號:吳小龍同學,歡迎關注交流~

Android 接入微信支付寶支付

相關文章