美文网首页
可能是最简单的Android接入支付宝登录的笔记

可能是最简单的Android接入支付宝登录的笔记

作者: 普通的程序员 | 来源:发表于2017-12-20 22:49 被阅读0次

    目录

    • 吐槽
    • 接入步骤
    • 伸手党福利

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

    看完之后,我真的怀疑自己的语文水平,也许是支付宝不care这些吧,用户量大,无所谓你接不接,反正有人用。

    以下伴随轻微吐槽,完成无吐槽笔记再最后

    先集成SDK

    这一步没问题,和支付接入一样的步骤,导包,加入清单,添加混淆规则。

    官方步骤

    集成之后开始调用,好的,没问题,1.1步骤:商户app调用sdk组装授权登录请求。

    支付宝很贴心的告诉开发者


    温馨提示,app必须用sdk来获取授权码

    非常感动的进去看,使用authV2方法


    image.png

    蛤?黑人问号.jpg
    别人家的文档不都是很清楚的写在文档里
    xxxSDK.xxMethod()
    支付宝这个authV2是哪个包的方法啊?

    本着猜一猜的想法,试了一试


    image.png

    这个不是authV2啊
    参数不是要传String的infoStr么?

    没办法,最后只能去查官方demo

    以下是无吐槽完整接入Android支付宝登录步骤

    1.先按照官方步骤导入jar包,注册清单,添加混淆规则

    2.拿到infoStr
    https://docs.open.alipay.com/218/105327
    看官方文档?没用的。
    我这里是向自己的后台请求,后台拼接完返回给app。

    3.拿到infoStr后调用
    com.alipay.sdk.app.AuthTask包的authV2方法,拿到支付宝的授权结果


    image.png

    4.handler里接收msg,对result进行处理


    image.png

    5.如果status和code都正确,则认为授权成功。
    此时把AuthResult的里的auth_code传给后台兄弟,他们需要这个auth_code去向支付宝换取access_token,然后才能去拿支付宝的用户公开信息返回给app


    AuthResult模型

    AuthResult模型直接复制demo里的吧。

    至此,Android接入支付宝登录sdk完成。

    伸手党福利

    需要导入的包
    import com.alipay.sdk.app.AuthTask;
    
    /**
         * alipay登录要经过三步
         * <p>1.通过拿App初始化配置接口缓存里面拼接好的alipay_sdk_auth_info</p>
         * <p>2.通过authInfo去调alipaySDK的authV2获取authResult</p>
         * <p>3.通过authResult的auth_code去服务器拿用户信息</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() {
                    // 构造AuthTask 对象
                    AuthTask authTask = new AuthTask(UserLoginActivity.this);
                    // 调用授权接口,获取授权结果
                    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);
                }
            };
    
            // 必须异步调用
            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”则代表授权成功,
                    if (TextUtils.equals(resultStatus, "9000") && TextUtils.equals(authResult.getResultCode(), "200")) {
                        // 获取alipay_open_id,调支付时作为参数extern_token 的value传入,则支付账户为该授权账户,这个支付先不做
                        thirdLogin(authResult.getAuthCode());//开发者自己的方法,把code传给后台同事,他们拿code换token
                    } else {
                        if (TextUtils.isEmpty(authResult.getAuthCode())) {
                            ToastUtil.warn(this, "授权取消");
                        } else
                            ToastUtil.error(this, String.format("授权失败_authCode:%s", authResult.getAuthCode()));
                    }
                    break;
                default:
                    break;
            }
        }
    
    
    
    
    支付宝的授权模型
    
    
    
    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;
        }
    }
    

    相关文章

      网友评论

          本文标题:可能是最简单的Android接入支付宝登录的笔记

          本文链接:https://www.haomeiwen.com/subject/uxwnwxtx.html