天天看點

Android 技術:支付寶支付接入詳細指南

接入流程如下:

1 簽約成為支付寶商戶

簽約位址:https://b.alipay.com/, 

隻有成為簽約商戶的開發者才能具備內建支付寶app支付的資格。 

簽約資料:1)營業執照 2)APP說明文檔 3)商戶經營資訊、商戶聯系人等資訊 

必要時還需提供APP apk以備稽核。稽核通過後即可進行代碼內建。

稽核通過後,可得到支付寶配置設定的商戶号等資訊。

2 用戶端代碼內建準備

2.1 導入jar包資源

目前最新版支付寶開發jar包下載下傳位址:http://download.csdn.net/detail/xiong_it/9566771 

下載下傳後将之拷貝libs目錄,Eclipse會自動添加依賴,Android Studio需在app的gradle中添加一行

compile files('libs/alipaySdk-20160223.jar')           
  • 1
  • 1

點選右上角:Sync Now,稍等片刻

2.2 修改AndroidManifest.xml清單

聲明必要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>           
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

添加必要權限

<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" />           
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

2.3 添加支付寶混淆規則

-libraryjars libs/alipaySDK-jar

-keep class com.alipay.android.app.IAlixPay{*;}
-keep class com.alipay.android.app.IAlixPay$Stub{*;}
-keep class com.alipay.android.app.IRemoteServiceCallback{*;}
-keep class com.alipay.android.app.IRemoteServiceCallback$Stub{*;}
-keep class com.alipay.sdk.app.PayTask{ public *;}
-keep class com.alipay.sdk.app.AuthTask{ public *;}           
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

3 用戶端代碼內建

支付寶互動流程示意圖 

Android 技術:支付寶支付接入詳細指南

流程圖白話版解釋

  1. app攜帶支付資訊調用支付接口請求支付寶用戶端調起支付界面;
  2. 使用者操作,輸入密碼支付,支付成功;直接傳回取消支付;出現錯誤,支付失敗;進入支付界面,但輸入密碼支付,支付待确認;
  3. 支付寶用戶端将支付結果告訴app用戶端,商戶伺服器通知app伺服器支付結果;
  4. app用戶端處理支付結果;
  5. app伺服器處理支付結果。

支付寶的支付流程較之微信的支付流程圖少了一步app伺服器端訂單的生成,但是在其demo代碼中是推薦使用app伺服器進行sign簽名過程的,于是筆者索性是按照的微信支付的流程(微信支付互動流程)去內建的。

  • 用戶端代碼得到使用者購買的商品資訊,将之傳給自己公司app伺服器,參數包含但不限于以下:
params.put("money", payMoney);// 商品金額,機關:元
        params.put("goodsname", goodsName);// 商品名稱           
  • 1
  • 2
  • 1
  • 2

注意:支付寶支付的人民币機關和微信支付,銀聯支付稍有不同,需以:元 作為支付機關。其他兩者支付機關為:分 

其他參數均交給咱們app伺服器處理即可,詳細參數請點選:https://doc.open.alipay.com/doc2/detail?treeId=59&articleId=103663&docType=1

  • app伺服器參考上述詳細參數連結,得到sign(支付簽名資訊)字段并傳回sign字段給手機用戶端;
  • 手機用戶端使用sign簽名資訊在非UI線程調起支付用戶端進行支付; 

    使用者操作:輸入密碼進行支付;傳回鍵取消支付;進入支付界面,使用者未進行支付,使用者傳回,待支付;網絡無連接配接支付失敗等;

  • 用戶端得到支付結果;
  • 支付寶伺服器異步通知咱們公司app伺服器支付結果(伺服器的工作,與用戶端無關)

這樣做的好處:簽名邏輯在伺服器完成,app無需暴露公鑰和私鑰,更安全。同時也是demo中的推薦做法。

更詳細的支付寶接入互動流程解釋請點選:https://doc.open.alipay.com/doc2/detail.htm?spm=a219a.7629140.0.0.7WO30X&treeId=59&articleId=103658&docType=1

4 用戶端代碼示例

支付調起代碼(須在子線程)

new Thread() {
                    @Override
                    public void run() {
                        super.run();
                        PayTask payTask = new PayTask(mActivity);
                        String result = payTask.pay(signInfo, true);
                        Message message = mHandler.obtainMessage();
                        message.what = PAY_RESULT;
                        message.obj = result;
                        mHandler.sendMessage(message);
                    }
                }.start();           
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

支付處理代碼(UI線程)

/*支付寶支付結果碼*/
    private static final String PAY_OK = "9000";// 支付成功
    private static final String PAY_WAIT_CONFIRM = "8000";// 交易待确認
    private static final String PAY_NET_ERR = "6002";// 網絡出錯
    private static final String PAY_CANCLE = "6001";// 交易取消
    private static final String PAY_FAILED = "4000";// 交易失敗

    /*内部類,處理支付寶支付結果*/
    static class AliPayHandler extends Handler {
        private SoftReference<PayActivity> activitySoftReference;// 使用軟引用防止記憶體洩漏

        public AliPayHandler(PayActivity activity) {
            activitySoftReference = new SoftReference<PayActivity>(activity);
        }

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            PayActivity activity = activitySoftReference.get();

            AliPayResult payResult = new AliPayResult((String) msg.obj);
            String resutStatus = payResult.getResultStatus();
            Log.d(TAG, "statusCode = " + resutStatus);

            if (resutStatus.equals(PAY_OK)) {
                activity.paySuccessed();
            } else if (resutStatus.equals(PAY_CANCLE)) {
                activity.payCanceled();
            } else if (resutStatus.equals(PAY_NET_ERR)) {
                activity.payFailed(NETWORK_ERR);
            } else if (resutStatus.equals(PAY_WAIT_CONFIRM)) {
                activity.payWaitConfirm();
            } else {
                activity.payFailed(UNKNOW_ERR);
            }
        }
    }
           
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

注:AliPayResult.Java來自支付寶demo中的PayResult.java 

至此,內建支付寶SDK結束。祝各位內建支付寶支付成功!

按照慣例,附上支付寶SDK接入的官方demo下載下傳連結:https://doc.open.alipay.com/doc2/detail.htm?treeId=54&articleId=104509&docType=1