一键登录

一键登录

能力简述

此模块主要分为两块功能:

(1)一键登录:通过运营商网关认证能力,用户无需输入手机号码和短信验证码,即可使用手机号一键登录成功。

(2)本机号码认证:校验用户输入的手机号码是否为当前设备使用,用于替代短信验证码。

接入前准备

请联系QQ:3007288195 开通权限。

配置SDK

在接入一键登录之前,请先确认已经集成个验SDK。下文使用到的资源文件,均可在官网下载的SDK资源包中获得。调用一键认证接口前请先完成个验SDK的接入与初始化。

maven接入方式

dependencies {
     //个验基础功能
    compile 'com.getui:gysdk:1.4.3.2'
    compile 'com.getui:gtc:2.1.0'
    //一键登录
    compile 'com.getui:elogin:1.0.0.1'
}

aar 包接入方式

(1)添加 aar包文件

将官网下载下来的 aar包 放置到项目的libs目录下

(2)配置 build.gradle


    defaultConfig {
         ....
    }

    repositories {
    flatDir {
        dirs 'libs'
    }
   }

    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
        // 添加个验 aar 依赖,name与aar包的名字同步
        compile(name: 'gysdk-1.4.3.2', ext: 'aar')  
        compile(name: 'gtc-2.1.0', ext: 'aar')
        //添加一键登录
        compile(name: 'elogin-1.0.0.1', ext: 'aar')
    }

添加so文件

开发者按自己的需求,将需要支持的cpu架构so文件添加到工程。如果将so文件添加在module的libs文件夹下,注意在module的gradle配置中添加以下配置:

android {

    sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
    }

}

配置AndroidManifest

如果需要使用一键登录,则需要在AndroidManifest文件中配置相关的activity。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="你的应用包名">

    <application
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme"
        tools:replace="android:allowBackup">

        //使用一键登录功能,需要添加以下activity。
        <activity
            android:name="com.getui.gysdk.view.ELoginActivity"
            android:exported="false"
            android:launchMode="singleTask"
            android:screenOrientation="portrait" />
        <activity
            android:name="cn.com.chinatelecom.account.sdk.ui.AuthActivity"
            android:exported="false"
            android:launchMode="singleTask"
            android:screenOrientation="portrait" />
        <activity
            android:name="cn.com.chinatelecom.account.sdk.ui.PrivacyWebviewActivity"
            android:exported="false"
            android:launchMode="singleTask"
            android:screenOrientation="portrait" />

    </application>
</manifest>

混淆配置

-dontwarn com.getui.**
-keep class com.getui.**{*;}
-keep class cn.com.chinatelecom.account.**{*;}
-keep class cn.com.chinatelecom.gateway.lib.** {*;}
-keep class com.unicom.xiaowo.login.**{*;}

接口列表

API 类名: com.getui.gysdk.GYManager

方法 功能说明
eAccountLogin 【一键登录】一键登录接口
finishAuthActivity 【一键登录】手动关闭一键登录界面
getVerifyToken 【本机号码校验】获取本机号码校验通行证
verifyPhoneNumber 【本机号码校验】本机号码校验接口
checkELoginEnable 检测当前环境是否可以使用一键登录或本机号码校验功能

一键登录

功能说明

一键登录方案,依托运营商的移动数据网络,采用“通信网关取号”及 SIM卡识别等技术,准确识别用户手机号码,实现一键登录,并可有效规避短信验证码泄露风险。

整体流程

注意

"蓝色流程”由合作方实现对接。

“绿色流程”由个推实现,合作方可进行了解。

成功对接效果图:

接口说明


    /**
     * 一键登录.
     *
     * @param context       上下文.
     * @param smsTemplateId 短信模板.
     * @param authConfig    登录页面配置.
     * @param callBack      一键登录回调.
     */
    public void eAccountLogin(Context context, String smsTemplateId, AuthConfig authConfig, GyCallBack callBack);    

输入参数

参数名称 是否必填 类型 描述
context Context 当前上下文
smsTemplateId String 短信模板,在一键登录未通过,调用云验证的时候会用到该参数
authConfig AuthConfig 登录页面配置
callBack GyCallBack 回调

smsTemplateId说明:
如果配置了smsTemplateId,在一键登录未通过或者用户点击切换账号的时候,SDK会调用内置的云验证界面进行验证。如果开发者需要自己定制云验证界面或者不需要在一键登录未通过的时候使用云验证,将smsTemplateId配置为null即可。

注意事项:
该接口的调用会启动一个授权页面,所以不建议开发者同时多次打开(既一次一键登录请求未完成后又立马调用该接口),重复打开可能会导致先传入的回调不能正常触发。同时建议开发者将一键登录相关的activity的启动模式设置为android:launchMode="singleTask"

页面定制说明

通过配置authConfig参数,开发者可以定制一键登录界面。使用方法见下面的调用示例。其中只有扩展内容是可选的,其余的配置都是必填项。

  • 合作方无定制页面需求:可使用个验demo提供的界面样式,仅需在样例基础上修改 App Logo 和 App Name 即可使用。
  • 合作方有定制页面需求:可参个验demo,传入相应的布局文件及控件ID。

配置包括登录界面、对话框和隐私协议界面的布局文件,以及相应的资源文件,详见个验提供的Demo中 Layout、drawable-xhdpi、drawable 和 color 等资源目录下 ct_account 开头的资源文件。
注意:定制界面需要遵守下文提到的页面规范说明

页面规范说明

1、合作方需展示运营商品牌,不得通过任何技术手段,将登录页面的隐私栏、品牌露出内容隐藏、覆盖,且要突出隐私协议的可点击性,推荐通过修改字体颜色和增加下划线来达成这一效果;
2、 合作方设计页面时所添加的元素,不得涉及任何形式的违法违规内容,若检测到此类行为,将禁止合作方使用此能力。
3、 若有出现未按要求设计登录页面的行为或有非正常调用行为,为了保护用户的隐私安全,运营商有权将合作方应用的登录功能下线,由此产生的一切影响由合作方自己承担。

调用示例

 AuthConfig.Builder configBuilder = new AuthConfig.Builder()
                //设置“登录界面”的布局文件ID
                .setAuthActivityLayoutId(R.layout.ct_account_auth_activity)
                //设置“登录界面”的控件ID
                .setAuthActivityViewIds(
                        R.id.ct_account_nav_goback, //导航栏返回按钮ID
                        R.id.ct_account_desensphone, //脱敏号码文本控件ID
                        R.id.ct_account_brand_view, //品牌标识文本控件ID
                        R.id.ct_account_login_btn, //登录按钮控件ID
                        R.id.ct_account_login_loading, //登录加载中控件ID(必须为ImageView控件)
                        R.id.ct_account_login_text, //登录按钮文本控件ID
                        R.id.ct_account_other_login_way, //其他登录方式控件ID
                        R.id.ct_auth_privacy_checkbox, //隐私协议勾选框控件ID
                        R.id.ct_auth_privacy_text)  //“服务与隐私协议”文本控件ID

                //设置隐私协议对话框的布局文件ID
                .setPrivacyDialogLayoutId(R.layout.ct_account_privacy_dialog)
                //设置隐私协议对话框的控件ID
                .setPrivacyDialogViewIds(R.id.ct_account_dialog_link, //“服务与隐私协议”文本控件ID
                        R.id.ct_account_dialog_cancel, // 返回按钮控件ID
                        R.id.ct_account_dialog_confirm) //确认按钮控件ID

                //设置隐私协议WebviewActivity的布局文件ID
                .setWebviewActivityLayoutId(R.layout.ct_account_privacy_webview_activity)
                //设置隐私协议界面的控件ID
                .setWebviewActivityViewIds(R.id.ct_account_webview_goback, //导航栏返回按钮ID
                        R.id.ct_account_progressbar_gradient, //进度条控件ID(ProgressBar控件)
                        R.id.ct_account_webview) //协议内容WebView控件ID

                //扩展:添加View及点击事件 (可选)
                .setExtendView1(R.id.extend_view_1, new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        showToast("click on extend_view_1");
                    }
                })
                .setExtendView2(R.id.extend_view_2, new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        showToast("click on extend_view_2");
                    }
                })
                .setExtendView3(R.id.extend_view_3, new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        showToast("click on extend_view_3");
                    }
                });
        AuthConfig authPageConfig = configBuilder.build();

        GYManager.getInstance().eAccountLogin(activity, null, authPageConfig, new GyCallBack() {
            @Override
            public void onSuccess(GYResponse response) {
                Log.d(TAG, "response:" + response);
                try {
                    JSONObject jsonObject = new JSONObject(response.getMsg());
                    int type = jsonObject.getInt("verifyType");
                    jsonObject = jsonObject.getJSONObject("data");
                    if (type == 0) {//一键登录
                        String token = jsonObject.getString("token");
                        String expiredTime = jsonObject.getString("expiredTime");
                    } else {//云短信验证
                        String pn = jsonObject.getString("pn");
                        String token = jsonObject.getString("token");
                    }
                } catch (Throwable t) {
                    t.printStackTrace();
                }
            }

            @Override
            public void onFailed(GYResponse response) {
                Log.d(TAG, "response:" + response);
                showToast("验证失败:" + response);
            }
        });

返回示例

一键登录会通过GyCallBack返回结果.

GyCallBack:

public interface GyCallBack {

    /**
     * description:登录成功.
     */
    void onSuccess(GYResponse response);

    /**
     * description:登录失败.
     */
    void onFailed(GYResponse response);

}

GYResponse返回示例:

{
    gyuid='20827b1266924eb691b61f4a538222f232', 
    success=true, 
    code=30000,             
    msg='{"verifyType":0,"data":{"token":"je3o9NNU0w6kpyDEBpIdC4","expiredTime":1553139758029}}'
}
  • 类 GYResponse 属性详细说明:
属性 类型 属性说明
gyuid String 个验用户唯一标识
success boolean 登录是否成功
code int 状态码,30000表示登录成功
msg String 登录成功的时候,包含登录结果信息,登录失败的时候,为状态码描述信息
  • 登录成功的时候 msg说明:

登录成功的时候,GYResponse中msg会是如下的JSON格式字符串.


//一键登录成功
{
    "msg":{
            "verifyType":0,
            "data":{
                "token":"qUiRvTAFLeAb36ubCtpcj",
                "expiredTime":1552887621123
            }
    }
}
//一键登录失败,云短信验证成功
{
    "msg":{
            "verifyType":1,
            "data":{
                "pn":"17768345313",
                "token":"GY-20180918-1-omsG91sfte8LUteahzOh06"
            }
    }
}

一键登录成功返回参数解释:

字段 类型 说明
verifyType int 验证类型,0为一键登录验证,1为云短信验证。
data JSON 验证结果
token String 用户授权凭证信息,可用于从服务端获取完整手机号码。
expiredTime long token有效期

云短信验证成功返回参数解释:

字段 类型 说明
verifyType int 验证类型,0为一键登录验证,1为云短信验证。
data JSON 验证结果
token String 在云短信验证成功的时候,该值是请求的唯一id。
pn String 用户输入的完整手机号码

手动关闭一键登录界面

    /**
     * 手动关闭验证界面.
     */
    public void finishAuthActivity() 

调用该接口,即可立即关闭一键登录界面。注意,通过该接口关闭界面,一键登录接口不会有任何回调。

本机号码校验

整体流程

获取本机号码校验通行证接口

    /**
     * 获取本机号码校验通行证.
     *
     * @param context    上下文.
     * @param gyCallBack 回调.
     */
    public void getVerifyToken(Context context, GyCallBack gyCallBack);

输入参数

参数名称 是否必填 类型 描述
context Context context 上下文
gyCallBack GyCallBack 回调

调用示例

GYManager.getInstance().getVerifyToken(this, new GyCallBack() {
            @Override
            public void onSuccess(final GYResponse response) {
                try {
                    JSONObject jsonObject = new JSONObject(response.getMsg());
                    //获取accessCode
                    accessCode = jsonObject.getString("accessCode");
                } catch (Throwable t) {
                    t.printStackTrace();
                }
            }

            @Override
            public void onFailed(GYResponse response) {
                Log.d("onFailed", "response:" + response);
            }
        });

返回示例

通过GyCallBack返回结果.

GyCallBack:

public interface GyCallBack {

    /**
     * description:获取成功.
     */
    void onSuccess(GYResponse response);

    /**
     * description:获取失败.
     */
    void onFailed(GYResponse response);

}

GYResponse返回示例:

{
    gyuid='cd529bfde4c641d0bc42257e2ed7300131',
    success=true,
    code=30000,
    msg='{"accessCode":"nm37ba0ab5fbc54f09adae682d54be9186"}'
}
  • 类 GYResponse 属性详细说明:
属性 类型 属性说明
gyuid String 个验用户唯一标识
success boolean 是否获取成功
code int 状态码,30000表示获取成功
msg String 获取成功的时候,包含accessCode信息,验证失败的时候,为状态码描述信息
accessCode String 本机号码校验通行证

本机号码校验接口

    /**
     * 验证本机号码.
     *
     * @param context        上下文.
     * @param accessCode     本机号码校验通行证.
     * @param phone          待校验号码.
     * @param useCloudVerify 校验失败的时候,是否自动调用云验证.
     * @param gyCallBack     回调.
     */
    public void verifyPhoneNumber(Context context, String accessCode, String phone, boolean useCloudVerify, GyCallBack gyCallBack);

输入参数

参数名称 是否必填 类型 描述
context Context context 上下文
accessCode String 本机号码校验通行证
phone String 待验证号码
useCloudVerify boolean ture的时候,如果校验失败,自动调用云验证再次校验
gyCallBack GyCallBack 回调

调用示例

        GYManager.getInstance().verifyPhoneNumber(this, accessCode, phone, false, new GyCallBack() {
            @Override
            public void onSuccess(GYResponse response) {
                Log.d("onSuccess", "response:" + response);;
            }

            @Override
            public void onFailed(GYResponse response) {
                Log.d("onFailed", "response:" + response);
            }
        });

返回示例

通过GyCallBack返回结果.

GyCallBack:

public interface GyCallBack {

    /**
     * description:验证成功.
     */
    void onSuccess(GYResponse response);

    /**
     * description:验证失败.
     */
    void onFailed(GYResponse response);

}

GYResponse返回示例:

{
    gyuid='cd529bfde4c641d0bc42257e2ed7300131',
    success=true,
    code=30000,
    msg='成功'
}
  • 类 GYResponse 属性详细说明:
属性 类型 属性说明
gyuid String 个验用户唯一标识
success boolean 是否获取成功
code int 状态码,30000表示验证成功
msg String 返回码说明

检查当前环境是否可以使用一键登录

    /**
     * 检查当前环境是否可以使用一键登录.
     *
     * @return true表示可使用.
     */
    public boolean checkELoginEnable(Context context) 

一键登录和本机号码验证均需要用户开启数据流量。调用该方法可以判断当前用户设备是否可以使用一键登录或者本机号码验证。

状态码

状态码 含义
30000 操作成功
30001 当前网络环境不适合执行该操作
30002 用户点击了切换账号
30003 用户关闭验证界面
30004 其他错误
40047 一键登录取号失败
40053 手机号校验失败

其余情况请参考状态码汇总说明

常见问题

建议开发者在开发期间开启debug模式,通过查看debug日志,可以更好的排查问题。

//在初始化之前调用
GYManager.getInstance().setDebug(true);

1.checkELoginEnable接口返回false

checkELoginEnable接口检查当前设备的网络状态,如果满足以下两个条件则会返回true:

  • 设备安装了SIM卡(电信、移动或者联通)
  • 设备开启了数据流量(包含wifi和数据同时开启的情况)

返回true表示当前设备可以使用一键登录和本机号码校验功能。如果一直返回false,请检查上面两个条件是否满足。另外,该接口需要权限android.permission.READ_PHONE_STATE,如果没有授权,会导致返回false。

2.预登录异常

请检查是否添加了so库。

3.切换流量卡或者主卡,一键登录显示的手机号码没有变化

在使用过一键登录功能后,如果SIM卡没有变动,后续的一键登录默认使用上一次一键登录使用的手机号。目的是为了加快验证速度和降低运营商网络环境不稳定带来的影响。双卡的用户,调整SIM卡的卡槽位置或者切换流量卡,还是会使用默认手机号码登录。替换SIM卡后会使用当前的流量卡号码进行一键登录。

4.一键登录返回over-limit

权限未配置,请联系技术支持。

5.一键登录是否支持港澳台或者国外漫游

一键登录功能,仅限中国大陆,港澳台、及国外漫游都不支持。

文档中心搜索