Android 接入微信支付寶支付

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

微信支付

前期準備

微信開放平臺

註冊帳號,建立應用,開通微信支付,這些你們都會的。java

微信商戶平臺

APP支付文檔
pay.weixin.qq.com/wiki/doc/ap… ,若是僅按照文檔來,保證每次支付結果都是-1,對,只有-1,沒有任何其餘信息,不得不說,坑比。android

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

接入SDK

引入libs

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

配置debug簽名

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

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

WXPayEntryActivity


這個 文檔沒有半點介紹,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,改了我這邊就能正常調起了。
app

支付寶接入

前期準備

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

接入文檔

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

支付交互流程

接入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了,相比於微信支付,簡單的不能再簡單。

聯繫我

個人微信公衆號:吳小龍同窗,歡迎關注交流~

相關文章
相關標籤/搜索