MobTeach平台秒验(一键登录)集成

1,406 阅读6分钟

一键登录相关介绍

详细介绍看郭霖大神的这篇推送:好奇一键登录是怎么实现的吗?进来了解一下?

简单的概括就是点击登录按钮就能自己帮你完成登录注册,不需要经过输入手机号码、获取验证码、等待、填写验证码、注册、登录等一系列繁琐的功能。当然,一键登录的前提是有相关运营商的支持,目前移动、联通、电信都有相关开放平台,这里很明显使用第三方SDK会给我们节约很多时间和精力。由于价格原因,这里选择MobTeach平台的 秒验 介绍。

先来看一下一键登录的页面:

想这样的页面并不是自己编写的xml文件,而是秒验SDK里面自带的,但是它给了开发者高度自定义的接口,还能添加自己想要的组件。

集成

这里官网都有介绍,我就不再赘述。快速集成

使用

这里有一点需要注意,一键登录SDK是通过手机SIM卡向运营商取号,所以使用该功能的时候需要打开手机移动网络,和wifi同时开启的情况下依然可以使用。

首先LoginActivityonCreate()中我们需要检测是否有权限:

    /**
     * 检查使用权限
     */
    private void checkPermissions() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            try {
                PackageManager pm = getPackageManager();
                PackageInfo pi = pm.getPackageInfo(getPackageName(), PackageManager.GET_PERMISSIONS);
                ArrayList<String> list = new ArrayList<>();
                for (String p : pi.requestedPermissions) {
                    if (checkSelfPermission(p) != PackageManager.PERMISSION_GRANTED) {
                        list.add(p);
                    }
                }
                if (list.size() > 0) {
                    String[] permissions = list.toArray(new String[list.size()]);
                    if (permissions != null) {
                        requestPermissions(permissions, 1);
                    }
                }
            } catch (Throwable t) {
                t.printStackTrace();
            }
        }
    }

onRequestPermissionsResult()中进行预登陆:

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        mPresenter.preVerify();
    }
    
    /**
     * 预登陆 向运营商取号
     */
    @Override
    public void preVerify() {
        SecVerify.preVerify(new OperationCallback<Void>() {
            @Override
            public void onComplete(Void data) {
                //TODO处理成功的结果
                Logger.d("预登陆成功");
                verify();
            }


            @Override
            public void onFailure(VerifyException e) {
                //TODO处理失败的结果
                // 登录失败
                Logger.e("preVerify failed" + e);
                // 错误码
                int errCode = e.getCode();
                // 错误信息
                String errMsg = e.getMessage();
                // 更详细的网络错误信息可以通过t查看,请注意:t有可能为null
                Throwable t = e.getCause();
                String errDetail = null;
                if (t != null) {
                    errDetail = t.getMessage();
                }

                String msg = "错误码: " + errCode + "\n错误信息: " + errMsg;
                if (!TextUtils.isEmpty(errDetail)) {
                    msg += "\n详细信息: " + errDetail;
                }
                Logger.d(msg);
            }
        });
    }

预登陆成功,也就是取号成功,进行登录:

    @Override
    public void verify() {
        // 自定义UI
        customizeUi();
        SecVerify.verify(new VerifyCallback() {
            @Override
            public void onOtherLogin() {
                // 用户点击“其他登录方式”,处理自己的逻辑
                Logger.d("用户选择其他方式登录");
            }

            @Override
            public void onUserCanceled() {
                // 用户点击“关闭按钮”或“物理返回键”取消登录,处理自己的逻辑
                Logger.d("用户选择取消登录");
            }

            @Override
            public void onComplete(VerifyResult data) {
                //成功之后不会自动关闭授权页面,需要手动关闭
                SecVerify.finishOAuthPage();
                Logger.d(data.getOperator() + "," + data.getOpToken() + "," + data.getToken());
                // 获取授权码成功,将token信息传给应用服务端,再由应用服务端进行登录验证,此功能需由开发者自行实现
                userLogin(data.getToken(), data.getOpToken(), data.getOperator());
            }

            @Override
            public void onFailure(VerifyException e) {
                Logger.d("登录失败:" + e);
            }
        });
    }

登录成功SDK会返回VerifyResult

public class VerifyResult extends BaseEntity {
    private String opToken;
    private String token;
    private String operator;

    public VerifyResult(String var1, String var2, String var3) {
        this.opToken = var1;
        this.token = var2;
        this.operator = var3;
    }

    public String getOpToken() {
        return this.opToken;
    }

    public void setOpToken(String var1) {
        this.opToken = var1;
    }

    public String getToken() {
        return this.token;
    }

    public void setToken(String var1) {
        this.token = var1;
    }

    public String getOperator() {
        return this.operator;
    }

    public void setOperator(String var1) {
        this.operator = var1;
    }
}

其中相关字段释义

变量 释义
String opToken 运营商token
String token 服务器token
String operator 运营商类型,[CMCC:中国移动,CUCC:中国联通,CTCC:中国电信]

这里需要后端根据这三个字段向Mob服务器获取你的取号信息,我就不再赘述了。

自定义UI:

    /**
     * 自定义一键登录UI
     */
    private void customizeUi() {
        UiSettings uiSettings = new UiSettings.Builder()
                /** 标题栏 */
                //标题栏是否透明
                .setNavTransparent(true)
                //标题栏是否隐藏
                .setNavHidden(true)
                //设置背景是否点击关闭页面
                .setBackgroundClickClose(false)
                /** Logo 默认水平居中*/
                // Logo图片资源ID,默认使用应用图标
                .setLogoImgId(R.mipmap.ic_launcher_round)
                //logo是否隐藏
                .setLogoHidden(false)
                //logo宽度
                .setLogoWidth(R.dimen.dp_68)
                //logo高度
                .setLogoHeight(R.dimen.dp_68)
                //logo x轴偏移量
//                .setLogoOffsetX(R.dimen.dp_150)
                //logo y轴偏移量
                .setLogoOffsetY(R.dimen.dp_129)
                //logo x轴右偏移量
//                .setLogoOffsetRightX(R.dimen.dp_0)
                //logo 是否靠屏幕右边
                .setLogoAlignParentRight(false)
                /** 手机号 默认水平居中*/
                // 脱敏手机号字体颜色资源ID
                .setNumberColorId(R.color.color333333)
                // 脱敏手机号字体大小资源ID
                .setNumberSizeId(R.dimen.sp_19)
                //脱敏手机号 x轴偏移量
//                .setNumberOffsetX(R.dimen.dp_130)
                //脱敏手机号 y轴偏移量
                .setNumberOffsetY(R.dimen.dp_230)
                //脱敏手机号 x轴右偏移量
//                .setNumberOffsetRightX(R.dimen.dp_0)
                //脱敏手机号 是否靠屏幕右边
                .setNumberAlignParentRight(false)
                /** slogan 默认水平居中 */
                //slogan文字大小
                .setSloganTextSize(R.dimen.sp_11)
                //slogan文字颜色
                .setSloganTextColor(R.color.color999999)
                //slogan y轴偏移量
                .setSloganOffsetY(R.dimen.dp_265)
                //slogan y轴偏移量
//                .setSloganOffsetX(R.dimen.dp_130)
                /** 登录按钮  默认水平居中 */
                // 登录按钮背景图资源ID,建议使用shape
                .setLoginBtnImgId(R.drawable.btn_background_fea100_round_45dp)
                // 登录按钮文字资源ID
                .setLoginBtnTextId(R.string.verify_login)
                // 登录按钮字体颜色资源ID
                .setLoginBtnTextColorId(R.color.colorWhite)
                //登录按钮字体大小
                .setLoginBtnTextSize(R.dimen.sp_18)
                //登录按钮 width
                .setLoginBtnWidth(R.dimen.dp_280)
                //登录按钮 height
                .setLoginBtnHeight(R.dimen.dp_45)
                //登录按钮 y轴偏移
                .setLoginBtnOffsetY(R.dimen.dp_295)
                //登录按钮 靠屏幕右边
                .setLoginBtnAlignParentRight(false)
                /** 切换帐号 默认水平居中 */
                // 切换账号是否显示,默认显示
                .setSwitchAccHidden(false)
                //切换账号文本内容
                .setSwitchAccText(R.string.verify_change_mobile)
                //切换账号字体大小资源ID
                .setSwitchAccTextSize(R.dimen.sp_14)
                //切换账号字体颜色资源ID
                .setSwitchAccColorId(R.color.color333333)
                //切换账号 x轴偏移量
//                .setSwitchAccOffsetX(R.dimen.dp_130)
                //切换账号 y轴偏移量
                .setSwitchAccOffsetY(R.dimen.dp_365)
                /** 隐私协议 */
                //是否隐藏复选框(设置此属性truesetCheckboxDefaultState不会生效)
                .setCheckboxHidden(true)
                // 隐私协议字体颜色资源ID(自定义隐私协议的字体颜色也受该值影响)
                .setAgreementColorId(R.color.colorFEA100)
                //设置隐私协议文字起始
                .setAgreementTextStart(R.string.verify_agreement_start)
                //设置移动隐私协议文字
                .setAgreementCmccText(R.string.verify_agreement_cmcc)
                //设置联通隐私协议文字
                .setAgreementCuccText(R.string.verify_agreement_cucc)
                //设置电信隐私协议文字
                .setAgreementCtccText(R.string.verify_agreement_ctcc)
                //设置隐私协议文字连接1
                .setAgreementTextAnd1(R.string.verify_agreement_and1)
                // 自定义隐私协议一文字资源ID
                .setCusAgreementNameId1(R.string.verify_agreement_1)
                // 自定义隐私协议一URL
                .setCusAgreementUrl1(AppConfig.TEST_APPLY_URL)
                //自定义隐私协议一颜色
                .setCusAgreementColor1(R.color.colorFEA100)
                //设置隐私协议文字连接2
                .setAgreementTextAnd2(R.string.verify_agreement_and2)
                // 自定义隐私协议二文字资源ID
                .setCusAgreementNameId2(R.string.verify_agreement_2)
                // 自定义隐私协议二URL
                .setCusAgreementUrl2(AppConfig.TEST_APPLY_URL)
                //自定义隐私协议二颜色
                .setCusAgreementColor2(R.color.colorFEA100)
                //设置隐私协议文字结束
                .setAgreementTextEnd(R.string.verify_agreement_end)
                //隐私协议是否左对齐,默认居中
                .setAgreementGravityLeft(false)
                //隐私协议其他文字颜色
                .setAgreementBaseTextColorId(R.color.color999999)
                //隐私协议 x轴偏移量,默认30
                .setAgreementOffsetX(R.dimen.dp_40)
                //隐私协议 x轴rightMargin右偏移量,默认30
                .setAgreementOffsetRightX(R.dimen.dp_40)
                //隐私协议 底部y轴偏移量
                .setAgreementOffsetBottomY(R.dimen.dp_20)
                //设置状态栏为透明状态栏,5.0以上生效
                .setImmersiveTheme(true)
                //设置状态栏文字颜色为黑色,只在6.0以上生效
                .setImmersiveStatusTextColorBlack(false)
                //使用平移动画
                .setTranslateAnim(true)
                .build();
        SecVerify.setUiSettings(uiSettings);
    }

这里需要注意的是自定义隐私协议的链接不能为空,否则不能成功显示,还有就是我注释掉的一些空间的X轴偏移量,不设置的时候它是默认居中的,只要自己设置Y轴偏移量就行了,被官方demo坑了一下。

结语

能力有限,文章中可能有错误或者不严谨的地方,欢迎批评指正,不喜勿喷。