可能是最簡單的Android接入支付寶登錄的筆記

目錄

  • 吐槽
  • 接入步驟
  • 伸手黨福利

最近在接支付寶的第三方登錄,支付寶的官方文檔
https://docs.open.alipay.com/218/105326/

看完之后,我真的懷疑自己的語文水平,也許是支付寶不care這些吧,用戶量大,無所謂你接不接,反正有人用。

以下伴隨輕微吐槽,完成無吐槽筆記再最后

先集成SDK

這一步?jīng)]問題,和支付接入一樣的步驟,導(dǎo)包,加入清單,添加混淆規(guī)則。

官方步驟

集成之后開始調(diào)用,好的,沒問題,1.1步驟:商戶app調(diào)用sdk組裝授權(quán)登錄請求。

支付寶很貼心的告訴開發(fā)者


溫馨提示,app必須用sdk來獲取授權(quán)碼

非常感動(dòng)的進(jìn)去看,使用authV2方法


image.png

蛤?黑人問號.jpg
別人家的文檔不都是很清楚的寫在文檔里
xxxSDK.xxMethod()
支付寶這個(gè)authV2是哪個(gè)包的方法?。?/p>

本著猜一猜的想法,試了一試


image.png

這個(gè)不是authV2啊
參數(shù)不是要傳String的infoStr么?

沒辦法,最后只能去查官方demo

以下是無吐槽完整接入Android支付寶登錄步驟

1.先按照官方步驟導(dǎo)入jar包,注冊清單,添加混淆規(guī)則

2.拿到infoStr
https://docs.open.alipay.com/218/105327
看官方文檔?沒用的。
我這里是向自己的后臺(tái)請求,后臺(tái)拼接完返回給app。

3.拿到infoStr后調(diào)用
com.alipay.sdk.app.AuthTask包的authV2方法,拿到支付寶的授權(quán)結(jié)果


image.png

4.handler里接收msg,對result進(jìn)行處理


image.png

5.如果status和code都正確,則認(rèn)為授權(quán)成功。
此時(shí)把AuthResult的里的auth_code傳給后臺(tái)兄弟,他們需要這個(gè)auth_code去向支付寶換取access_token,然后才能去拿支付寶的用戶公開信息返回給app


AuthResult模型

AuthResult模型直接復(fù)制demo里的吧。

至此,Android接入支付寶登錄sdk完成。

伸手黨福利

需要導(dǎo)入的包
import com.alipay.sdk.app.AuthTask;

/**
     * alipay登錄要經(jīng)過三步
     * <p>1.通過拿App初始化配置接口緩存里面拼接好的alipay_sdk_auth_info</p>
     * <p>2.通過authInfo去調(diào)alipaySDK的authV2獲取authResult</p>
     * <p>3.通過authResult的auth_code去服務(wù)器拿用戶信息</p>
     */
    private void loginByAli() {
        AppConfigModel model = ApplicationCache.getAppConfigModel();
        if (model == null) {
            ToastUtil.warn(UserLoginActivity.this, "支付寶sdk未初始化完成,請稍后再試");
            return;
        }
        getAuthResultFromAuthInfo(model.getAlipay_sdk_auth_info());
    }

    private void getAuthResultFromAuthInfo(String alipay_sdk_auth_info) {
        Runnable authRunnable = new Runnable() {
            @Override
            public void run() {
                // 構(gòu)造AuthTask 對象
                AuthTask authTask = new AuthTask(UserLoginActivity.this);
                // 調(diào)用授權(quán)接口,獲取授權(quán)結(jié)果
                Map<String, String> result = authTask.authV2(alipay_sdk_auth_info, true);
                Message msg = new Message();
                msg.what = FLAG_ALIPAY_LOGIN;
                msg.obj = result;
                getHandler().sendMessage(msg);
            }
        };

        // 必須異步調(diào)用
        Thread authThread = new Thread(authRunnable);
        authThread.start();
    }


 @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        switch (msg.what) {
            case FLAG_ALIPAY_LOGIN:
                @SuppressWarnings("unchecked")
                AuthResult authResult = new AuthResult((Map<String, String>) msg.obj, true);
                String resultStatus = authResult.getResultStatus();
                // 判斷resultStatus 為“9000”且result_code為“200”則代表授權(quán)成功,
                if (TextUtils.equals(resultStatus, "9000") && TextUtils.equals(authResult.getResultCode(), "200")) {
                    // 獲取alipay_open_id,調(diào)支付時(shí)作為參數(shù)extern_token 的value傳入,則支付賬戶為該授權(quán)賬戶,這個(gè)支付先不做
                    thirdLogin(authResult.getAuthCode());//開發(fā)者自己的方法,把code傳給后臺(tái)同事,他們拿code換token
                } else {
                    if (TextUtils.isEmpty(authResult.getAuthCode())) {
                        ToastUtil.warn(this, "授權(quán)取消");
                    } else
                        ToastUtil.error(this, String.format("授權(quán)失敗_authCode:%s", authResult.getAuthCode()));
                }
                break;
            default:
                break;
        }
    }




支付寶的授權(quán)模型



public class AuthResult {

    private String resultStatus;
    private String result;
    private String memo;
    private String resultCode;
    private String authCode;
    private String alipayOpenId;

    public AuthResult(Map<String, String> rawResult, boolean removeBrackets) {
        if (rawResult == null) {
            return;
        }

        for (String key : rawResult.keySet()) {
            if (TextUtils.equals(key, "resultStatus")) {
                resultStatus = rawResult.get(key);
            } else if (TextUtils.equals(key, "result")) {
                result = rawResult.get(key);
            } else if (TextUtils.equals(key, "memo")) {
                memo = rawResult.get(key);
            }
        }

        String[] resultValue = result.split("&");
        for (String value : resultValue) {
            if (value.startsWith("alipay_open_id")) {
                alipayOpenId = removeBrackets(getValue("alipay_open_id=", value), removeBrackets);
                continue;
            }
            if (value.startsWith("auth_code")) {
                authCode = removeBrackets(getValue("auth_code=", value), removeBrackets);
                continue;
            }
            if (value.startsWith("result_code")) {
                resultCode = removeBrackets(getValue("result_code=", value), removeBrackets);
                continue;
            }
        }

    }

    private String removeBrackets(String str, boolean remove) {
        if (remove) {
            if (!TextUtils.isEmpty(str)) {
                if (str.startsWith("\"")) {
                    str = str.replaceFirst("\"", "");
                }
                if (str.endsWith("\"")) {
                    str = str.substring(0, str.length() - 1);
                }
            }
        }
        return str;
    }

    @Override
    public String toString() {
        return "resultStatus={" + resultStatus + "};memo={" + memo + "};result={" + result + "}";
    }

    private String getValue(String header, String data) {
        return data.substring(header.length(), data.length());
    }

    /**
     * @return the resultStatus
     */
    public String getResultStatus() {
        return resultStatus;
    }

    /**
     * @return the memo
     */
    public String getMemo() {
        return memo;
    }

    /**
     * @return the result
     */
    public String getResult() {
        return result;
    }

    /**
     * @return the resultCode
     */
    public String getResultCode() {
        return resultCode;
    }

    /**
     * @return the authCode
     */
    public String getAuthCode() {
        return authCode;
    }

    /**
     * @return the alipayOpenId
     */
    public String getAlipayOpenId() {
        return alipayOpenId;
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容