在移动端App中,一键登录依赖原生SDK实现。但在H5页面和微信小程序这类Web技术栈场景中,需要走一条不同的技术路径。易盾号码认证提供了H5 JS SDK(NEOneLogin),并通过微信web-view组件实现对小程序场景的覆盖。

本文聚焦H5和小程序两个场景的一键登录接入方案,涵盖从依赖引入到上线的全流程。

H5一键登录接入

H5端的一键登录通过 NEOneLogin JS SDK 实现,本质是在页面中内嵌一个由运营商提供的iframe授权页。用户在该iframe中补全手机号中间四位并确认授权,SDK将token回调给业务方。

两种引入方式

方式一:npm模块引入(推荐,有TypeScript类型提示)

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',
  phoneInputStyle: 'square',
});

方式二:script标签引入

<script src="https://yidunfe.nosdn.127.net/sdk/NEOneLogin.v3.1.2.umd.js"></script>
<script>
const neOneLogin = new window.NEOneLogin({
  businessId: '从易盾申请的 businessId',
});
</script>

script方式引入后,构造函数挂载在 window.NEOneLogin 上。

全屏模式 vs 弹框模式

H5 SDK支持两种展示模式:

全屏模式(float,默认):授权页占满整个屏幕,由iframe全屏覆盖。适合独立的一键登录页面场景。

const neOneLogin = new NEOneLogin({
  businessId: 'xxx',
  mode: 'float',
  elements: ['back', 'logo', 'slogan', 'phone', 'loginButton', 'switchButton', 'policy'],
});

// 点击按钮调起授权页
document.querySelector('#login-btn').onclick = () => {
  neOneLogin.getToken();
};

弹框模式(popup):授权页嵌入页面中的指定容器,适合在已有页面中以弹框形式展示。

const neOneLogin = new NEOneLogin({
  businessId: 'xxx',
  mode: 'popup',
  popupContainer: document.querySelector('#popup-container'),
  elements: ['phone', 'switchButton', 'loginButton', 'policy'],
  iframeStyles: {
    position: 'absolute',
    left: '0',
    bottom: '0',
    height: '274px',
  },
});

弹框模式的核心配置:

  • popupContainer:承载授权页的DOM元素,需预先设置好容器的位置、宽高和样式
  • iframeStyles:控制授权页iframe在容器内的定位,通常设为绝对定位并固定在容器底部
  • elements:可以只渲染必要的模块(如不展示Logo和slogan),由业务方自己的UI承担视觉引导

弹框模式的典型场景:在注册表单页中嵌入一键登录,页面顶部由业务方自己展示标题和引导文案,授权页只提供手机号输入和登录按钮。

事件回调处理

SDK通过事件监听机制回调各种状态,业务方按需处理:

// 成功——拿到token和accessToken,传给后端校验
neOneLogin.on('success', (data) => {
  fetch('/api/login', {
    method: 'POST',
    body: JSON.stringify({
      token: data.token,
      accessToken: data.accessToken,
    }),
  });
});

// 失败——走降级方案(短信验证码等)
neOneLogin.on('error', (err) => {
  console.log('一键登录失败', err.data);
  neOneLogin.dispose();  // 销毁实例
  // 切换到短信验证码登录
});

// 授权页就绪——预取号成功,授权页已挂载
neOneLogin.on('ready', () => {
  console.log('授权页已就绪');
});

// 返回按钮关闭
neOneLogin.on('close', () => {
  // 用户点击返回,可以做数据上报
});

// 切换登录方式
neOneLogin.on('switch', () => {
  // 用户点击"其它登录方式"
  neOneLogin.disposeAuthFrame(); // 关闭授权页
  // 切换到其他登录方式
});

// 提示事件
neOneLogin.on('tip', ({ code, text }) => {
  // code: complete_phone → 手机号未补全
  // code: agree_terms → 未勾选协议
});

关键配置:referer

这是H5端最容易踩的坑。生产环境HTTPS下,如果不在head标签中配置referer策略,运营商会对空的referer做校验失败。

<head>
  <meta content="always" name="referrer" />
</head>

不加这一行,运营商会返回referer校验失败错误(移动20010、联通30010、电信40010)。

生命周期管理

SDK实例需要正确的生命周期管理:

// 关闭授权页(不销毁实例,可重新getToken)
neOneLogin.disposeAuthFrame();

// 完全销毁实例(组件卸载时调用)
neOneLogin.dispose();

// 手动控制登录按钮状态
neOneLogin.enableLoginButton();   // 启用
neOneLogin.disableLoginButton();  // 禁用

通常情况下不需要手动 enableLoginButton——因为运营商会对同一token做次数校验,失败后建议直接销毁实例重建,而非重新启用按钮。

微信小程序接入

微信小程序中无法直接运行H5 JS SDK,但可以通过 web-view 组件加载一个部署好的H5一键登录页面,实现间接接入。

技术原理

整体架构是:小程序web-view → H5一键登录页面 → 运营商授权页 → token回调 → 微信JSSDK通信 → 小程序页面

接入步骤

第一步:创建web-view承载页面

在小程序 pages/ 下创建 one-login 页面:

<!-- one-login.wxml -->
<view class="container">
  <web-view src="https://your-domain.com/one-login-h5.html"></web-view>
</view>

第二步:部署H5一键登录页面

将接入NEOneLogin SDK的页面部署到HTTPS服务器。该页面需要额外处理与小程序的通信:

// 成功时跳转小程序验证页
neOneLogin.on('success', (data) => {
  window.wx.miniProgram.redirectTo({
    url: `/pages/verify/verify?from=h5&event=verify&token=${data.token}&accessToken=${data.accessToken}`
  });
});

// 失败时跳转小程序失败页
neOneLogin.on('error', (err) => {
  window.wx.miniProgram.redirectTo({
    url: `/pages/unpass/unpass?from=h5&event=${err.data.code}`
  });
});

第三步:创建验证页面接收token

在小程序创建 pages/verify/verify 页面,在 onLoad 生命周期中接收参数:

// verify.js
Page({
  onLoad(options) {
    const { from, event, token, accessToken } = options;
    if (from === 'h5' && event === 'verify') {
      // 拿到 token 和 accessToken,调用后端校验接口
      wx.request({
        url: 'https://your-api.com/api/verify',
        method: 'POST',
        data: { token, accessToken },
        success(res) {
          // 校验成功,完成登录
        }
      });
    }
  }
});

第四步:配置业务域名(上线必须)

在微信小程序管理后台 — 开发管理 — 开发设置 — 业务域名中,添加两个域名:

  1. 你的H5页面域名:如 https://your-domain.com(部署一键登录H5页面的域名)
  2. 易盾授权页域名https://ye.dun.163yun.com(运营商授权页iframe的域名,必须添加)

配置后需下载校验文件,放置到你的H5页面域名根目录下,同时将该文件发给易盾技术支持——因为易盾的授权页域名根目录下也需要放置该文件。

第五步:本地开发时跳过校验

开发阶段可以勾选"不校验合法域名、web-view(业务域名)"快速调试,但上线前务必完成域名配置。

小程序接入的注意事项

  • 手机预览时需打开"开发模式"重新进入小程序,否则无法预览web-view内容
  • 两个业务域名都必须配置:自己的域名和易盾的 ye.dun.163yun.com
  • H5页面的通信使用了微信JSSDK的 wx.miniProgram.redirectTo,需确保H5页面已引入微信JSSDK
  • web-view中的页面必须HTTPS

H5端常见错误码

错误码 说明 排查方向
-8001 网络请求错误 检查网络连接
-8002 预取号超时 网络环境差,重试
10000 预取号失败 检查businessId和网络
20001 移动取号失败 移动网络相关
20010 移动referer校验失败 检查referer meta标签和报备
30001 联通获取省份URL失败 联通网络相关
30010 联通报备referer校验失败 同上
40001 电信预授权失败 电信网络相关
40010 电信报备referer校验失败 同上
40000 未知运营商 非三大运营商网络或WiFi关闭

常见问题(FAQ)

Q1:H5端为什么一直返回referer校验失败?

三个原因依次排查:①是否在 <head> 中添加了 <meta content="always" name="referrer"/>;②生产域名是否在运营商后台完成了referer报备;③请求是否确实走了HTTPS(HTTP下referer可能为空)。

Q2:小程序中web-view提示无法打开页面?

检查:①web-view的src是否HTTPS;②业务域名是否已完成配置(包括易盾的 ye.dun.163yun.com);③校验文件是否已放置到域名根目录。开发阶段可临时勾选"不校验合法域名"。

Q3:弹框模式下授权页不显示?

确认popupContainer元素是否存在并可见,建议给容器设置明确的宽高。同时检查iframeStyles是否正确(弹框模式默认iframe定位为absolute,需配合父容器使用)。

Q4:点击登录按钮后按钮一直禁用状态?

这是正常行为——登录按钮在点击后自动禁用,防止重复提交。如果取号失败,可以调用 dispose() 销毁实例后重新初始化,或调用 enableLoginButton() 手动启用。

Q5:小程序和H5能不能共用一个businessId?

可以。businessId在易盾后台对应一个应用,只要签名/包名/referer配置正确即可。

Q6:H5需要配置包名和签名吗?

不需要。H5端不做包名和签名校验,取而代之的是域名referer校验——需要在运营商后台报备生产域名。


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

Logo

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

更多推荐