用户注册登录环节的体验,直接影响App的拉新转化率和留存率。传统的短信验证码方式,用户需要等待短信、手动输入,流程繁琐且流失率高。号码认证一键登录方案通过运营商网关直接获取本机号码,用户点击一次即可完成登录,将原本十几秒的操作压缩到1秒以内。

易盾号码认证服务整合了移动、联通、电信三大运营商的取号能力,提供Android、iOS、H5、鸿蒙四端统一的SDK接入方案。本文从前端视角梳理各平台的核心接入流程。

一键登录的交互流程

无论哪个平台,一键登录的前端交互都遵循四个步骤:

  1. 初始化:调用SDK初始化接口,传入业务ID
  2. 预取号:提前获取手机号掩码(133****8888),耗时约1-2秒
  3. 拉起授权页:展示运营商授权界面,用户确认后点击登录
  4. 获取Token:SDK返回token和accessToken,传递给后端完成验号

双卡手机取当前发4G/5G流量卡对应的号码。iOS支持12.0及以上,Android支持4.0及以上(minSdkVersion 16),鸿蒙支持API12及以上。

Android端接入

依赖引入

推荐使用远程仓库依赖(3.0.4版本开始支持):

// 在对应 module 的 build.gradle 中添加
implementation 'io.github.yidun:quicklogin:3.6.0'

确认项目根目录的 build.gradle 中配置了 mavenCentral 支持。

权限配置

必选权限(网络相关,保证WIFI+数据双开时成功切换):

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />

建议申请 READ_PHONE_STATE(用于移动运营商双卡场景精准识别流量卡类型,不授予会使取号成功率降低约1%):

ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_PHONE_STATE}, 0);

核心调用

// 1. 初始化(建议放在 Application.onCreate())
QuickLogin quickLogin = QuickLogin.getInstance();
quickLogin.init(this, "业务id");

// 2. 预取号(建议提前调用,与授权页拉起不要串行)
quickLogin.prefetchMobileNumber(new QuickLoginPreMobileListener() {
    @Override
    public void onGetMobileNumberSuccess(String ydToken, String mobileNumber) {
        // 预取号成功,拿到掩码 mobileNumber(如 133****8888)
        prefetchResult = true;
    }
    @Override
    public void onGetMobileNumberError(String ydToken, int code, String msg) {
        // 预取号失败,走降级方案(如短信验证码)
    }
});

// 3. 设置授权页UI + 拉起授权页
UnifyUiConfig.Builder builder = new UnifyUiConfig.Builder();
quickLogin.setUnifyUiConfig(builder.build(this));
quickLogin.onePass(new QuickLoginTokenListener() {
    @Override
    public void onGetTokenSuccess(String ydToken, String accessCode) {
        quickLogin.quitActivity();
        // 拿到 token 和 accessCode,传给后端校验
    }
    @Override
    public void onGetTokenError(String ydToken, int code, String msg) {
        quickLogin.quitActivity();
        // 取号失败,走降级
    }
});

iOS端接入

依赖引入

通过 CocoaPods 集成:

pod 'NTESQuickPass'
# 或指定版本
pod 'NTESQuickPass', '3.2.3'

执行 pod install 即可。手动集成需添加 libz.1.2.8.tbdlibc++.1.tbd 依赖库。

核心调用

// 1. 初始化
[[NTESQuickLoginManager sharedInstance] registerWithBusinessID:@"业务ID"];

// 2. 判断当前网络是否支持一键登录
BOOL shouldQuickLogin = [[NTESQuickLoginManager sharedInstance] shouldQuickLogin];
if (!shouldQuickLogin) {
    // 不支持,走降级方案
}

// 3. 预取号 + 拉起授权页
[[NTESQuickLoginManager sharedInstance] getPhoneNumberCompletion:^(NSDictionary *resultDic) {
    BOOL success = [[resultDic objectForKey:@"success"] boolValue];
    if (success) {
        // 设置授权页UI(必须在拉起授权页之前)
        [[NTESQuickLoginManager sharedInstance] setupModel:model];
        // 拉起授权页
        [[NTESQuickLoginManager sharedInstance] CUCMCTAuthorizeLoginCompletion:^(NSDictionary *resultDic) {
            if ([[resultDic objectForKey:@"success"] boolValue]) {
                NSString *accessToken = [resultDic objectForKey:@"accessToken"];
                // 将 token 和 accessToken 传给后端校验
            }
        }];
    } else {
        // 预取号失败,走降级
    }
}];

关键注意点:iOS端预取号接口支持设置超时时间,默认3秒。预取号返回的 securityPhone 字段——电信会返回脱敏手机号,移动和联通只返回掩码。

H5端接入

H5端通过 npm 包或 script 标签引入 JS SDK:

npm install @yidun/quickpass-sdk-one-login-h5
import NEOneLogin from '@yidun/quickpass-sdk-one-login-h5';

const neOneLogin = new NEOneLogin({
  businessId: '从易盾申请的 businessId',
  logo: 'https://your-domain.com/logo.png',
  mode: 'float',  // float 全屏 或 popup 弹框模式
  phoneInputStyle: 'square', // sub 下划线 或 square 方格
});

// 调起授权页
neOneLogin.getToken();

// 监听成功回调
neOneLogin.on('success', (data) => {
  // data.token + data.accessToken 传给后端校验
  ajax({
    url: '/api/login',
    data: { token: data.token, accessToken: data.accessToken }
  });
});

// 监听失败回调
neOneLogin.on('error', (err) => {
  // 走降级流程
});

H5接入关键注意事项:

  • 生产环境HTTPS必须在 <head> 中添加 <meta content="always" name="referrer"/>,否则运营商会校验referer失败
  • 弹框模式需要同时设置 mode: 'popup'popupContainer
  • 授权页的各个模块(返回按钮、logo、标语、手机号输入区、隐私协议、登录按钮)可通过 elements 数组自由排序

鸿蒙端接入

引入本地 har 包:

ohpm install ../libs/ntes_quick_login_har-signed_v2.0.1.har

权限配置(module.json5):

"requestPermissions": [
  { "name": "ohos.permission.INTERNET" },
  { "name": "ohos.permission.GET_NETWORK_INFO" },
  { "name": "ohos.permission.SET_NETWORK_INFO" }
]

核心调用(TypeScript/ArkTS):

import { NTESQuickLogin, NTESQuickLoginPreMobileListener, NTESQuickLoginTokenListener } from 'ntes_login_harmony_static';

// 初始化(建议在 Ability.onCreate 中)
NTESQuickLogin.getInstance().init("your businessId", this.context);

// 预取号
NTESQuickLogin.getInstance().prefetchMobileNumber(new NTESQuickLoginHandler());

class NTESQuickLoginHandler implements NTESQuickLoginPreMobileListener {
  onGetMobileNumberSuccess(ydToken: string, mobileNumer: string): void {
    // 预取号成功,调起授权页
    NTESQuickLogin.getInstance().onePass(new NTESQuickLoginTokenHandler());
  }
  onGetMobileNumberError(ydToken: string, code: number, msg: string): void {
    // 走降级
  }
}

各平台接入要点对比

维度 Android iOS H5 鸿蒙
最低版本 minSdkVersion 16 iOS 12 - API12
依赖方式 Maven Central CocoaPods npm / script ohpm har
预取号耗时 1-2秒 1-2秒(可设超时) 依赖网络 1-2秒
授权页模式 全屏Activity Push/Present/弹窗 float/popup 全屏/居中/底部
关键权限 5个网络权限+READ_PHONE_STATE(可选) 蜂窝网络权限 HTTPS+referer配置 3个网络权限
包名签名校验 需要 需要 需要referer报备 需要

通用接入注意事项

预取号时机:建议放在Application或启动页的onCreate中提前调用,不要在拉起授权页时串行调用。

降级策略:预取号或取号失败时,必须有短信验证码等降级方案。网络环境、运营商覆盖、用户关闭数据流量都可能导致取号失败。

授权页规范:按照运营商要求,不允许通过技术手段隐藏或覆盖授权页中的隐私栏、手机掩码号、供应商品牌内容。登录按钮文字必须包含"登录"或"注册"。易盾及运营商会对上线应用的授权页面进行审查。

Token有效期:易盾token有效期为2分钟,不可重复使用,需在有效期内完成后端校验。

三网分别测试:移动、联通、电信三网授权页的底层实现不同,上线前必须用三网SIM卡分别测试。

常见问题(FAQ)

Q1:预取号返回的mobileNumber为null是什么原因?

移动和联通在预取号成功回调中mobileNumber确实为null,这是正常现象——这两家运营商在授权页上自动展示手机掩码,不需要SDK层面返回掩码。只有电信会返回脱敏手机号。

Q2:安卓端必须获取READ_PHONE_STATE权限吗?

不是必须,但强烈建议获取。该权限用于移动运营商在双卡场景中精准识别当前使用的流量卡所属运营商类型,不获取会使取号成功率降低约1%。

Q3:预取号失败返回"错误的请求签名"怎么处理?

该错误说明App运行时的签名与运营商后台配置的签名信息不一致。需要联系易盾客服核对签名配置。

Q4:公网IP无效是什么问题?

可能原因有三:①未开启数据流量;②以wap方式访问(需切换到3gnet接口);③WiFi和数据同时开启时切换失败(常见于Android 6.0/6.0.1系统Bug)。

Q5:后端接口返回"wrong token"是什么原因?

Token过期,有效期为2分钟。需前端重新发起预取号和取号流程,不能复用已过期的token。

Q6:H5端取号一直失败是什么原因?

重点检查:①HTTPS环境是否在head中添加了referer meta标签;②生产域名是否在运营商后台完成了referer报备;③是否在WiFi环境下(需数据流量)。


了解易盾号码认证一键登录的完整产品能力与接入方案,可访问易盾号码认证产品页

Logo

网易易盾是国内领先的数字内容风控服务商,依托网易二十余年的先进技术和一线实践经验沉淀,为客户提供专业可靠的安全服务,涵盖内容安全、业务安全、应用安全、安全专家服务四大领域,全方位保障客户业务合规、稳健和安全运营。

更多推荐