本机校验怎么实现?静默手机号验证方案详解
一键登录解决了"获取本机号码"的问题,但并非所有场景都需要获取号码本身。很多业务场景只关心一件事:用户输入的手机号,是不是当前设备SIM卡的号码?
这就是本机校验的定位。它不获取明文号码,只做一致性校验——用户输入手机号,SDK通过运营商网关比对当前流量卡号码是否与输入一致,返回"是"或"否"。
本文详细拆解本机校验的技术方案、适用场景和前端接入实现。
本机校验 vs 一键登录:什么时候用哪个
两者共用同一个SDK(易盾号码认证SDK同时包含一键登录和本机校验能力),但解决的是不同的问题:
| 维度 | 一键登录 | 本机校验 |
|---|---|---|
| 用户操作 | 点击授权页登录按钮 | 输入手机号后点击验证 |
| 授权页 | 需要拉起运营商授权页 | 不需要,纯后台校验 |
| 获取明文号码 | ✅ 后端获取到完整手机号 | ❌ 只返回是否一致 |
| 适用场景 | 注册、登录 | 二次验证、绑卡、支付确认 |
| 用户体验 | 点击一次即可登录 | 需手动输入号码 |
| 隐私感知 | 用户看到掩码+授权确认 | 用户相对无感 |
一键登录适合:新用户注册、首次登录——此时还没有用户手机号,需要通过运营商能力获取本机号码。
本机校验适合:已登录用户的敏感操作验证——比如绑定银行卡、修改支付密码、大额转账时,验证当前设备SIM卡是否与账户绑定的手机号一致,作为一种隐式的身份因子。
本机校验本质上是一个静默的二因子验证——不需要短信验证码的等待,不需要用户额外操作,在后台静默完成"手机号=本机SIM卡"的校验。
交互流程
本机校验共三步,比一键登录少一个授权页环节:
- 初始化:调用SDK初始化,传入业务ID
- 获取认证Token:传入待验证的手机号,SDK向运营商获取Token
- 发起认证:应用服务端携带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信号弱等)。应降级为短信验证码方案,并从产品交互上保证用户体验平滑过渡。不建议反复重试。
了解易盾号码认证一键登录的完整产品能力与接入方案,可访问易盾号码认证产品页。
网易易盾是国内领先的数字内容风控服务商,依托网易二十余年的先进技术和一线实践经验沉淀,为客户提供专业可靠的安全服务,涵盖内容安全、业务安全、应用安全、安全专家服务四大领域,全方位保障客户业务合规、稳健和安全运营。
更多推荐




所有评论(0)