1. 程式人生 > >Android 第三方登入之支付寶登入

Android 第三方登入之支付寶登入

首先,貼上支付寶官方開放平臺地址和部分開發文件:

螞蟻金服開放平臺

開發者中心-第三方應用

APP支付寶登入快速接入

Android整合流程詳解

主要流程如下:

  1. 申請開發者,身份選擇系統服務商ISV,建立應用並獲取APPID。祕鑰生成連結:生成金鑰:快速生成RSA私鑰公鑰
  2. 配置應用,整合並配置SDK。參考APP支付寶登入快速接入
  3. 呼叫介面

注意:

(1)這裡是APP支付寶第三方登入,不是第三方應用授權,開發文件不要參考錯了

(2)不要在沙箱環境下做除錯,直接在第一步將建立的應用上線然後再除錯即可(APPID用建立的應用ID,不要用沙箱的

(3)關於PID引數,不太好找,貼出來位置合作伙伴身份(PID)

下面是程式碼

/**
 *  APP支付寶登入
 *
 *  這裡只是為了方便,直接向加簽過程直接放在客戶端完成;
 *  真實App裡,privateKey等資料嚴禁放在客戶端,加簽過程務必要放在服務端完成;
 *  防止商戶私密資料洩露,造成不必要的資金損失,及面臨各種安全風險;
 */
public class ALiLoginUtils {

    public Activity activity;

    /** 支付寶支付業務:入參app_id */
    public static final String APPID = "你建立的應用APPID";
    /** 支付寶賬戶登入授權業務:入參pid值 */
    public static final String PID = "合作伙伴身份PID";
    /** 支付寶賬戶登入授權業務:入參target_id值 可自定義,保證唯一性即可*/
    public static final String TARGET_ID = "保證唯一性即可";

    /** 商戶私鑰,pkcs8格式 */
    /** 如下私鑰,RSA2_PRIVATE 或者 RSA_PRIVATE 只需要填入一個 */
    /** 如果商戶兩個都設定了,優先使用 RSA2_PRIVATE */
    /** RSA2_PRIVATE 可以保證商戶交易在更加安全的環境下進行,建議使用 RSA2_PRIVATE */
    /** 獲取 RSA2_PRIVATE,建議使用支付寶提供的公私鑰生成工具生成, */
    /** 工具地址:https://doc.open.alipay.com/docs/doc.htm?treeId=291&articleId=106097&docType=1 */
    public static final String RSA2_PRIVATE = "填你自己的應用私鑰,要和配置應用時的應用公鑰對應";

    public static final String RSA_PRIVATE = "";

    private static final int SDK_AUTH_FLAG = 2;

    public ALiLoginUtils(Activity activity){
        this.activity = activity;
    }

    @SuppressLint("HandlerLeak")
    private Handler mHandler = new Handler() {
        @SuppressWarnings("unused")
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case SDK_AUTH_FLAG: {
                    @SuppressWarnings("unchecked")
                    AuthResult authResult = new AuthResult((Map<String, String>) msg.obj, true);
                    String resultStatus = authResult.getResultStatus();
                    String resultCode = authResult.getResultCode();
                    Log.e("ALiLoginActivity", "=====resultStatus=====" + resultStatus);
                    Log.e("ALiLoginActivity", "=====resultCode=====" + resultCode);

                    // 判斷resultStatus 為“9000”且result_code
                    // 為“200”則代表授權成功,具體狀態碼代表含義可參考授權介面文件
                    if (TextUtils.equals(resultStatus, "9000") && TextUtils.equals(authResult.getResultCode(), "200")) {
                        // 獲取alipay_open_id,調支付時作為引數extern_token 的value
                        // 傳入,則支付賬戶為該授權賬戶
                        Log.e("ALiLoginActivity", "授權成功\n" + String.format("authCode:%s", authResult.getAuthCode()));
//                        Toast.makeText(activity,"授權成功\n" + String.format("authCode:%s", authResult.getAuthCode()), Toast.LENGTH_SHORT).show();
                    } else {
                        // 其他狀態值則為授權失敗
                        Log.e("ALiLoginActivity", "授權失敗\n" + String.format("authCode:%s", authResult.getAuthCode()));
//                        Toast.makeText(activity,"授權失敗" + String.format("authCode:%s", authResult.getAuthCode()), Toast.LENGTH_SHORT).show();
                    }
                    break;
                }
                default:
                    break;
            }
        };
    };


    /**
     * 支付寶賬戶授權業務
     */
    public void authV2() {
        if (TextUtils.isEmpty(PID) || TextUtils.isEmpty(APPID)
                || (TextUtils.isEmpty(RSA2_PRIVATE) && TextUtils.isEmpty(RSA_PRIVATE))
                || TextUtils.isEmpty(TARGET_ID)) {
            new AlertDialog.Builder(activity).setTitle("警告").setMessage("需要配置PARTNER |APP_ID| RSA_PRIVATE| TARGET_ID")
                    .setPositiveButton("確定", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialoginterface, int i) {
                        }
                    }).show();
            return;
        }

        /**
         * 這裡只是為了方便直接向商戶展示支付寶的整個支付流程;所以Demo中加簽過程直接放在客戶端完成;
         * 真實App裡,privateKey等資料嚴禁放在客戶端,加簽過程務必要放在服務端完成;
         * 防止商戶私密資料洩露,造成不必要的資金損失,及面臨各種安全風險;
         *
         * authInfo的獲取必須來自服務端;
         */
        boolean rsa2 = (RSA2_PRIVATE.length() > 0);
        Map<String, String> authInfoMap = OrderInfoUtil2_0.buildAuthInfoMap(PID, APPID, TARGET_ID, rsa2);
        String info = OrderInfoUtil2_0.buildOrderParam(authInfoMap);

        String privateKey = rsa2 ? RSA2_PRIVATE : RSA_PRIVATE;
        String sign = OrderInfoUtil2_0.getSign(authInfoMap, privateKey, rsa2);
        final String authInfo = info + "&" + sign;
        Log.e("ALiLoginActivity", "=====authInfo=====" + authInfo);
        Runnable authRunnable = new Runnable() {

            @Override
            public void run() {
                // 構造AuthTask 物件
                AuthTask authTask = new AuthTask(activity);
                // 呼叫授權介面,獲取授權結果
                Map<String, String> result = authTask.authV2(authInfo, true);

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

        // 必須非同步呼叫
        Thread authThread = new Thread(authRunnable);
        authThread.start();
    }

}

然後在Activity中直接呼叫工具類,如下:

/** 支付寶授權登入 */
case R.id.iv_alipay:
    ALiLoginUtils aLiLogin = new ALiLoginUtils(LoginActivity.this);
    aLiLogin.authV2();
    break;

這裡,直接把privateKey等資料放在客戶端,實際加簽過程務必要放在服務端完成;防止商戶私密資料洩露,造成不必要的資金損失,及面臨各種安全風險;authInfo(這裡拼接了要向支付寶傳送的所有資料資訊,尤為重要)的獲取必須來自服務端;

最後,程式碼只貼出了主要的流程,並不完整,其餘的可以參考 

App支付客戶端DEMO&SDK 

有興趣或者需要的朋友,這裡還有 Android 第三方登入之新浪微博授權登入