1. 程式人生 > >Android支付之接入支付寶

Android支付之接入支付寶

11.11  今天是光棍兒節,也是“剁手”節,所以咱們就來說說這個支付,就說說AS調支付寶吧。

 

接入支付功能的話個人感覺接入支付寶比接入微信要簡單得多。

 接入支付寶的話首先我們要去    螞蟻金服開放平臺   

 

支付寶進入app支付文件有兩種方式,一種是直接在下面的開放業務裡

還有一種方法是通過上面的導航欄文件中心,然後滾動到業務接入那一欄,可以看到移動支付 

 其實也可以直接開啟         

移動支付      可以看一看框框裡的東西

 在這裡要說明的是個人是不能申請的,只能是企業,所以我demo裡面的用的一些資料也是demo裡面的

這裡是互動流程的連結,想要詳細瞭解的話可以點進去看看。 

執行Demo

我們先來看看官方的demo,連結

選擇我們需要的下載解壓完直接匯入AS並配置一些引數執行就可以檢視效果了 

匯入jar

將demo裡面的alipaySdk-20160223.jar拷貝到我們工程的libs下,並新增到依賴中。

配置

清單檔案:

<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" />

activity

<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>

 

訂單資料生成

這一步,可以在服務端完成,也可以在本地完成

String orderInfo = getOrderInfo("測試的商品", "該測試商品的詳細描述", "0.01");

/**
 * 特別注意,這裡的簽名邏輯需要放在服務端,切勿將私鑰洩露在程式碼中!
 */
String sign = sign(orderInfo);
try {
    /**
     * 僅需對sign 做URL編碼
     */
    sign = URLEncoder.encode(sign, "UTF-8");
} catch (UnsupportedEncodingException e) {
    e.printStackTrace();
}

/**
 * 完整的符合支付寶引數規範的訂單資訊
 */
final String payInfo = orderInfo + "&sign=\"" + sign + "\"&" + getSignType();

Runnable payRunnable = new Runnable() {

    @Override
    public void run() {
        // 構造PayTask 物件
        PayTask alipay = new PayTask(MainActivity.this);
        // 呼叫支付介面,獲取支付結果
        String result = alipay.pay(payInfo, true);

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

// 必須非同步呼叫
Thread payThread = new Thread(payRunnable);
payThread.start();

處理支付結果

@SuppressLint("HandlerLeak")
private Handler mHandler = new Handler() {
    @SuppressWarnings("unused")
    public void handleMessage(Message msg) {
        switch (msg.what) {
            case SDK_PAY_FLAG: {
                PayResult payResult = new PayResult((String) msg.obj);
                /**
                 * 同步返回的結果必須放置到服務端進行驗證(驗證的規則請看https://doc.open.alipay.com/doc2/
                 * detail.htm?spm=0.0.0.0.xdvAU6&treeId=59&articleId=103665&
                 * docType=1) 建議商戶依賴非同步通知
                 */
                String resultInfo = payResult.getResult();// 同步返回需要驗證的資訊

                String resultStatus = payResult.getResultStatus();
                // 判斷resultStatus 為“9000”則代表支付成功,具體狀態碼代表含義可參考介面文件
                if (TextUtils.equals(resultStatus, "9000")) {
                    Toast.makeText(MainActivity.this, "支付成功", Toast.LENGTH_SHORT).show();
                } else {
                    // 判斷resultStatus 為非"9000"則代表可能支付失敗
                    // "8000"代表支付結果因為支付渠道原因或者系統原因還在等待支付結果確認,最終交易是否成功以服務端非同步通知為準(小概率狀態)
                    if (TextUtils.equals(resultStatus, "8000")) {
                        Toast.makeText(MainActivity.this, "支付結果確認中", Toast.LENGTH_SHORT).show();

                    } else {
                        // 其他值就可以判斷為支付失敗,包括使用者主動取消支付,或者系統返回的錯誤
                        Toast.makeText(MainActivity.this, "支付失敗", Toast.LENGTH_SHORT).show();

                    }
                }
                break;
            }
            default:
                break;
        }
    }

};

 

這裡支付成功了,只是提示使用者,還得從伺服器確認是否正在支付了,我這裡只寫了本地,其他如果在服務端實現是一樣的,你把這程式碼直接發給後端就行了(如果後端是Java開發),可以看到我們已經成功調起支付寶服務了

 

測試程式碼的話GitHub上有好多,官方也有Demo需要的話可以自行去下載