一键登录解决了"获取本机号码"的问题,但并非所有场景都需要获取号码本身。很多业务场景只关心一件事:用户输入的手机号,是不是当前设备SIM卡的号码?

这就是本机校验的定位。它不获取明文号码,只做一致性校验——用户输入手机号,SDK通过运营商网关比对当前流量卡号码是否与输入一致,返回"是"或"否"。

本文详细拆解本机校验的技术方案、适用场景和前端接入实现。

本机校验 vs 一键登录:什么时候用哪个

两者共用同一个SDK(易盾号码认证SDK同时包含一键登录和本机校验能力),但解决的是不同的问题:

维度 一键登录 本机校验
用户操作 点击授权页登录按钮 输入手机号后点击验证
授权页 需要拉起运营商授权页 不需要,纯后台校验
获取明文号码 ✅ 后端获取到完整手机号 ❌ 只返回是否一致
适用场景 注册、登录 二次验证、绑卡、支付确认
用户体验 点击一次即可登录 需手动输入号码
隐私感知 用户看到掩码+授权确认 用户相对无感

一键登录适合:新用户注册、首次登录——此时还没有用户手机号,需要通过运营商能力获取本机号码。

本机校验适合:已登录用户的敏感操作验证——比如绑定银行卡、修改支付密码、大额转账时,验证当前设备SIM卡是否与账户绑定的手机号一致,作为一种隐式的身份因子。

本机校验本质上是一个静默的二因子验证——不需要短信验证码的等待,不需要用户额外操作,在后台静默完成"手机号=本机SIM卡"的校验。

交互流程

本机校验共三步,比一键登录少一个授权页环节:

  1. 初始化:调用SDK初始化,传入业务ID
  2. 获取认证Token:传入待验证的手机号,SDK向运营商获取Token
  3. 发起认证:应用服务端携带Token和手机号调用易盾后端接口,拿到认证结果

和一键登录的关键差异:本机校验不需要拉起授权页,不展示手机掩码,不需要用户确认授权。整个流程对用户来说几乎无感——只需在需要验证时输入手机号,其余步骤在后台完成。

网络环境要求与一键登录一致:需蜂窝网络或蜂窝+WiFi同时开启;双卡手机取当前发流量卡的号码;2G/3G成功率低于4G/5G。

Android端接入

本机校验共用一键登录的QuickLogin SDK实例,代码比一键登录更简洁:

// 1. 初始化
QuickLogin quickLogin = QuickLogin.getInstance();
quickLogin.init(this, "业务id");

// 2. 获取认证Token
quickLogin.getToken("用户输入的手机号", new QuickLoginTokenListener() {
    @Override
    public void onGetTokenSuccess(String ydToken, String accessCode) {
        // 成功获取token和accessCode
        // 将 ydToken、accessCode、手机号 传给后端调用check接口
        verifyOnServer(ydToken, accessCode, phoneNumber);
    }

    @Override
    public void onGetTokenError(String ydToken, int code, String msg) {
        // 获取token失败,走降级(如短信验证码)
    }
});

与一键登录的代码差异:

  • 调用 getToken(phoneNumber, listener) 而非 onePass(listener)
  • 不需要调用 prefetchMobileNumber() 预取号
  • 不需要调用 setUnifyUiConfig() 设置授权页UI
  • 不需要调用 quitActivity() 退出授权页

iOS端接入

iOS端的本机校验同样共用 NTESQuickLoginManager

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

// 2. 获取认证Token
[[NTESQuickLoginManager sharedInstance] getTokenWithPhoneNumber:@"手机号"
    completion:^(NSDictionary *resultDic) {
        NSNumber *boolNum = [resultDic objectForKey:@"success"];
        if ([boolNum boolValue]) {
            NSString *token = [resultDic objectForKey:@"token"];
            NSString *accessToken = [resultDic objectForKey:@"accessToken"];
            // 传给后端做check校验
        } else {
            // 获取token失败,走降级
        }
    }];

iOS端无需关注授权页相关的 NTESQuickLoginModel 配置,也无需调用 shouldQuickLogin 预检。整个调用链路比一键登录缩短了一半。

鸿蒙端接入

import { NTESQuickLogin, NTESQuickLoginVerifyListener } from 'ntes_login_harmony_static';

// 1. 初始化
NTESQuickLogin.getInstance().init("your businessId", this.context);

// 2. 本机校验
NTESQuickLogin.getInstance().verifyPhoneNumber(
  "用户输入的手机号",
  new NTESVerifyMobileNumberTest("用户输入的手机号")
);

class NTESVerifyMobileNumberTest implements NTESQuickLoginVerifyListener {
  phone: string;
  constructor(phone: string) { this.phone = phone; }

  onGetTokenSuccess(ydToken: string, accessToken: string): void {
    // 将 ydToken、accessToken、phone 传给后端校验
  }

  onGetTokenError(ydToken: string, code: number, msg: string): void {
    // 走降级
  }
}

后端校验要点

前端拿到token和accessToken后,需要传递给应用服务端,由服务端调用易盾后端接口完成最终校验:

接口/api/v1/check(本机校验后端接口)

必传参数:businessId、token(SDK返回的ydToken)、accessToken(运营商返回的accessCode)、phone(用户输入的手机号)

鉴权方式:使用SecretID和SecretKey生成签名,详见易盾帮助中心的接口鉴权文档。签名计算方式与一键登录的后端接口一致。

返回结果:校验结果(手机号是否与SIM卡号一致)+ 运营商类型 + 错误信息。

降级策略

本机校验的取号成功率受网络环境、运营商覆盖、用户设备等多重因素影响。接入时必须设计降级方案:

  • 主方案:本机校验 → 静默完成手机号验证
  • 降级方案:短信验证码 → 发送6位验证码,用户手动输入
  • 体验衔接:不要等本机校验超时才触发降级,建议设置2-3秒的取号超时时间,超时即降级

iOS端本机校验已支持H5场景(需联系客服开通),Android端目前仅支持原生。

H5端的特殊说明

H5端的本机校验情况比较特殊。NEOneLogin H5 SDK主要定位为一键登录场景,本机校验目前仅支持iOS端的H5(需联系易盾客服开通)。Android端H5的本机校验暂不支持。

如果你的H5业务需要本机校验能力,建议:

  • iOS H5:联系客服开通H5本机校验
  • Android H5:考虑降级为短信验证码,或在条件允许时引导用户跳转到原生App完成本机校验

常见问题(FAQ)

Q1:本机校验和一键登录SDK是同一个包吗?

是同一个。易盾号码认证SDK(Android的 quicklogin、iOS的 NTESQuickPass、鸿蒙的 ntes_login_harmony_static)同时包含一键登录和本机校验能力。区别在于调用的方法不同:一键登录用 onePass() / CUCMCTAuthorizeLoginCompletion,本机校验用 getToken(phone) / verifyPhoneNumber

Q2:本机校验需要用户授权吗?

不需要拉起授权页,但产品层面建议在UI中告知用户"正在验证本机号码",保持透明度。运营商层面不要求授权页,因为本机校验不返回明文号码,只返回一致性结果。

Q3:本机校验能拿到明文手机号吗?

不能。本机校验只返回"一致"或"不一致"的判断结果。如果需要获取明文手机号,应使用一键登录方案。

Q4:本机校验的token有效期多长?

与一键登录一致,token有效期为2分钟,不可重复使用。

Q5:本机校验需要哪些权限?

Android端需要5个网络权限(INTERNET、ACCESS_NETWORK_STATE、CHANGE_NETWORK_STATE、ACCESS_WIFI_STATE、CHANGE_WIFI_STATE),建议申请READ_PHONE_STATE提升成功率。iOS端只需蜂窝网络权限。鸿蒙端需要INTERNET、GET_NETWORK_INFO、SET_NETWORK_INFO。

Q6:本机校验失败了怎么处理?

主因是网络环境不支持(WiFi Only、非三大运营商SIM卡、2G信号弱等)。应降级为短信验证码方案,并从产品交互上保证用户体验平滑过渡。不建议反复重试。


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

Logo

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

更多推荐