3.1.1 • Published 1 month ago

@yidun/quickpass-sdk-one-login-h5 v3.1.1

Weekly downloads
-
License
ISC
Repository
-
Last release
1 month ago

一键登录(NEOneLogin)

简介

NEOneLogin 为支持 H5 一键登录的 JS SDK,整合三大运营商(移动、联调、电信),一步校验手机号与当前 SIM 卡号是否一致,优化注册、登录、支付等场景验证流程。

快速上手

按照以下步骤快速调用示例。

资源引入

目前支持两种接入 SDK 方式。强烈推荐使用第一种 模块引入 的方式接入,以获取良好的类型提示。

1. 模块引入

下载 npm 包:

# npm
npm install @yidun/quickpass-sdk-one-login-h5
# yarn
yarn add @yidun/quickpass-sdk-one-login-h5
# pnpm
pnpm add @yidun/quickpass-sdk-one-login-h5

在代码中引用:

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

2. script 引入

body 标签下引入 SDK

<script src="https://yidunfe.nosdn.127.net/sdk/NEOneLogin.v3.1.0.umd.js"></script>

引入该脚本之后,不需要像模块引入方式一样通过 import 引入 NEOneLogin 变量,初始化时直接按下列方式即可:

const neOneLogin = new window.NEOneLogin({
  // ...
});

3. 添加 head referrer

生产上有 https 访问的,https 请求跨域,会导致上报的 referer 为空,运营商会去校验请求 referer 是否进行备案,请在 html 文件下的 head 标签添加如下代码解决此问题:

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

调用 SDK

1. 初始化 SDK

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

const neOneLogin = new NEOneLogin({
  businessId: '从易盾申请的 businessId',
  logo: 'https://xxxxxx.com/logo.png',
  phoneInputStyle: 'square',
});

2. 调起授权页

neOneLogin.getToken();

调用该方法后,会调起授权页,需用户输入中间四位手机号。

3. 开始验证

neOneLogin.on('success', (data) => {
  console.log('success', data);
  ajax({
    url: 'https://xxxxx.com/login',
    data: {
      token: data.token,
      accessToken: data.accessToken,
    },
  });
});

用户在授权页输入完手机号码,点击登录后,会向运营商发送校验请求,获得 accessToken,通过 success 事件,SDK 会将用于验证的 tokenaccessToken 都回调给业务方。

配置说明

在初始化 SDK 时,可以传入以下配置:

参数描述类型默认值是否必填
businessId从易盾申请的 businessIdstring-
mode授权页面弹出模式,float 模式下占满全屏,popup 模式下需要通过 popupContainer 传入一个容器。弹框 popup 模式如何使用及其效果,可见弹框模式float | popupfloat
popupContainer只在 popup 模式下生效,用于承接授权页的容器,若不设置此项,默认为 float 模式string | HTMLElement-
elements需要渲染在授权页的模块,可选项有 backlogosloganphoneswitchButtonpolicyloginButton,根据数组中模块的位置进行顺序渲染,详细使用方法见自定义模块渲染方式string[]['back', 'logo', 'slogan', 'phone', 'policy', 'loginButton']
backText授权页返回按钮文本string返回
logologo 的 url 地址,可传 base64string-
logoStyleslogo 的样式LogoStyles-
sloganAppName标语要显示的 app 名称string网易易盾
sloganStyles标语样式SloganStyles-
phoneStyles手机号模块样式PhoneStyles-
phoneInputStyle手机号输入框类型sub | squaresub
switchBtnText切换按钮文本string其它登录方式
switchBtnStyles切换按钮样式SwitchButtonStyles-
policy隐私条款PolicyDefine[]-
policyTarget指定在何处显示隐私条款链接的 URL,当 modepopup 模式时,推荐设置为非 self 的任意值。self | blank | parent | top-
policyStyles隐私条款模块样式PolicyStyles-
loginBtnText登录按钮文本string一键登录
loginBtnStyles登录按钮样式LoginButtonStyles-
iframeStyles授权页 iframe 的样式,你可以传入任何 css 样式,key 支持短横线连接或小驼峰形式CSSStyleDeclaration不同的 mode 有不同的默认样式,皆可以覆盖
toastDelay提示弹框的存在时间,单位为 ms(毫秒)number3000
toastShow是否显示提示框,如果设置为 false,开发可监听 tip 事件使用自己的提示组件booleantrue
toastStyles提示弹框模块样式ToastStyles

LogoStyles

参数描述类型默认值是否必填
width宽度大小,比如 22050%220pxnumber | string220
height高度大小,比如 110110px,如果你的图片高度是确定的,建议把这个配置加上,设置为你希望的图片高度大小,这样可以避免由于图片加载过程中出现的布局跳动问题number | string-
top距离顶部位置,比如 220220pxnumber | string150
align垂直排列方式left | center | rightcenter

SloganStyles

参数描述类型默认值是否必填
width宽度大小,比如 22050%220pxnumber | string100%
top距离顶部位置,比如 5050pxnumber | string50
align垂直排列方式left | center | rightcenter
color字体颜色string#333
size字体大小number | string14px

PhoneStyles

参数描述类型默认值是否必填
top距离顶部位置,比如 220220pxnumber | string150
align垂直排列方式left | center | rightcenter
color字体颜色string#333
size字体大小number | string26px
cursorColor闪烁光标颜色number | string#2a62ff
subBottomColorphoneInputStylesub 模式时,底线的背景颜色string#2a62ff
subWidthphoneInputStylesub 模式时,输入框的宽度number | string28px
subHeightphoneInputStylesub 模式时,输入框的高度number | string32px
squareBackgroundphoneInputStylesquare 模式时,输入框的背景色stringrgba(192, 208, 238, 0.4)
squareWidthphoneInputStylesquare 模式时,输入框的宽度number | string32px
squareHeightphoneInputStylesquare 模式时,输入框的高度number | string32px
squareRadiusphoneInputStylesquare 模式时,输入框的圆角number | string8px

SwitchButtonStyles

参数描述类型默认值是否必填
width宽度大小,比如 22050%220pxnumber | string100%
top距离顶部位置,比如 3030pxnumber | string30
align垂直排列方式left | center | rightcenter
color字体颜色string#2a62ff
size字体大小number | string14px

PolicyDefine

参数描述类型默认值是否必填
url条款页链接string-
content条款展示的文本名称string-

PolicyStyles

参数描述类型默认值是否必填
width宽度大小,比如 22050%220pxnumber | string100%
top距离顶部位置,比如 5050pxnumber | string50
align垂直排列方式left | center | rightcenter
color字体颜色string#333
size字体大小number | string14px

LoginButtonStyles

参数描述类型默认值是否必填
width宽度大小,比如 220100%220pxnumber | string100%
top距离顶部位置,比如 5050pxnumber | string50
align垂直排列方式left | center | rightcenter
color字体颜色string#fff
size字体大小number | string18px
height按钮高度大小,比如 4810%48pxnumber | string48
background按钮背景颜色stringlinear-gradient(90deg,#5f83fe,#324dff)
radius按钮四周圆角大小number | string8px

ToastStyles

参数描述类型默认值是否必填
width宽度大小,比如 auto80%220pxnumber | stringauto
top提示弹框距离顶部第一个非静态定位父元素的距离,比如 284284pxnumber | string284
align垂直排列方式left | center | rightcenter

自定义模块渲染方式

在一键登录授权页,你看到的所有 UI 都是由一个个模块组成的,每个模块由一个字符串表示,比如 back 代表的是顶部的返回按钮,logo 代表的是你看到的 logo。

elements 配置项可以让你自定义这些模块的渲染顺序,以及决定它们渲不渲染,下图将为你直观演示该配置项的作用:

手动配置代码演示:

const neOneLogin = new NEOneLogin({
  businessId: '易盾申请的 businessId',
  elements: ['back', 'logo', 'slogan', 'phone', 'loginButton', 'switchButton', 'policy'],
});

弹框模式

关于配置项 mode 默认是 float 模式,即授权页是全屏占满的,如果你希望是在当前页以弹框的形式展示授权页面,需要同时设置 modepopupContainer 配置项。

弹框模式示例代码:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, viewport-fit=cover" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <meta content="always" name="referrer" />
    <title>一键登录H5 - demo</title>
    <style>
      #get-token-btn {
        position: fixed;
        left: 10px;
        top: 10px;
      }
      #popup-container {
        position: fixed;
        left: 50%;
        top: 50%;
        width: 90%;
        height: 400px;
        transform: translate(-50%, -50%);
        border-radius: 20px;
        box-shadow: rgb(0 0 0 / 10%) 0px 4px 12px;
      }
      .title {
        text-align: center;
        margin-top: 30px;
      }
      .sub-title {
        display: inline-block;
        text-align: center;
        width: 100%;
      }
    </style>
    <script src="libs/jquery@3.6.0.js"></script>
  </head>
  <body>
    <div id="root">
      <button id="get-token-btn">调起授权页</button>
      <div id="popup-container">
        <h2 class="title">免费领试听课</h2>
        <span class="sub-title">提交后会有老师联系您</span>
      </div>
    </div>

    <script>
      (function () {
        const popupContainer = document.querySelector('#popup-container');
        const neOneLogin = new NEOneLogin({
          businessId: '从易盾申请的 businessId',
          mode: 'popup',
          popupContainer,
          phoneInputStyle: 'square',
          // 只渲染 4 个模块,其它的自定义
          elements: ['phone', 'switchButton', 'loginButton', 'policy'],
          logoStyles: {
            top: 10,
          },
          sloganAppName: '网易易盾',
          sloganStyles: {
            top: 10,
          },
          phoneStyles: {
            top: 20,
          },
          switchBtnText: '切换手机号',
          loginBtnText: '授权登录',
          loginBtnStyles: {
            top: 20,
          },
          policy: [
            {
              content: '自定义条款1',
              url: 'https://www.baidu.com',
            },
            {
              content: '自定义条款',
              url: 'https://www.baidu.com',
            },
          ],
          policyStyles: {
            top: 20,
          },
          iframeStyles: {
            position: 'absolute',
            left: '0',
            bottom: '0',
            height: '274px',
          },
        });

        document.querySelector('#get-token-btn').onclick = () => {
          neOneLogin.getToken();
        };
      })();
    </script>
  </body>
</html>

从上面可以看到,我们调整了各个模块的 top 以覆盖 SDK 的默认距离,并将授权页放到了我们自定义的容器中。下图是实际效果:

实例方法

以下是初始化实例上可调用的方法:

  • 调起授权页

核心方法,调用该方法后即调起授权页,用户进行手机号补全,示例:

neOneLogin.getToken();
  • 关闭授权页

调用该方法后可关闭授权页,会删除授权页 iframe,若重新调用 getToken 方法,会重新生成授权页 iframe,示例:

neOneLogin.disposeAuthFrame();
  • 销毁流程

销毁流程,建议在组件卸载时使用,示例:

neOneLogin.dispose();
  • 启用登录按钮

将登录按钮状态设置为可用,示例:

neOneLogin.enableLoginButton();

用户点击登录后,登录按钮就会一直保持禁用状态,可手动调用上面方法将其启用。不过大多数情况下,接入方无需使用该方法,建议失败时走降级或者销毁实例重新验证,因为运营商会对同一个 token 做次数校验。

  • 禁用登录按钮

将登录按钮状态设置为禁用,示例:

neOneLogin.disableLoginButton();

事件回调

在验证过程中会抛出⼀些回调事件,业务上可以监听这些事件,⾃⾏做⼀些处理。

  • success 事件
neOneLogin.on('success', (data) => {
  console.log('success', data);
  // 成功拿到 token 和 accessToken 后像服务端发起校验
  ajax({
    url: 'https://xxxxx.com/login',
    data: {
      token: data.token,
      accessToken: data.accessToken,
    },
  });
});
  • error 事件
neOneLogin.on('error', (err) => {
  // err.data 中可以拿到错误信息
  console.log('error', err.data);
  neOneLogin.dispose();
  neOneLogin = null;
  // 失败后可以走业务方自己的降级流程
  // handleOneLoginFailProcess()
});
  • ready 事件
neOneLogin.on('ready', () => {
  // 当预取号->授权页面成功挂载时触发
});
  • close 事件
neOneLogin.on('close', () => {
  // 当授权页通过返回按钮关闭时触发
});
  • switch 事件
neOneLogin.on('switch', () => {
  // 当授权页点击切换按钮时触发
  // 与 close 事件不同的是,close 事件触发时意味着授权页已经被关闭
  // 但 switch 事件不会关闭授权页,如果需要关闭,需要开发调用 disposeAuthFrame 方法
});
  • tip 事件
neOneLogin.on('tip', ({ code, text }) => {
  // 根据 code 或者 text 在⻚面中给出提示文案
});

当前包含以下 code 和 text:

codetext说明
complete_phone请补全手机号后登录授权页手机号未补全
agree_terms请勾选同意运营商认证服务条款后登录未勾选同意运营商认证服务条款

错误对照表

codemsg说明
-8001网络请求错误网络错误,请检查网络
10000预取号失败预取号失败
20001移动取号失败移动取号失败
20002移动获取 accessToken 失败移动获取 accessToken 失败
20010移动报备 referer 校验失败访问域名的 referer 与移动报备的地址不一致
30001联通获取省份 URL 失败联通获取省份 URL 失败
30002联通获取省份失败联通获取省份 URL 后,在获取省份时接口请求失败
30003联通获取 accessToken 失败联通获取 accessToken 失败
30010联通报备 referer 校验失败访问域名的 referer 与联通报备的地址不一致
40001电信预授权失败电信预授权失败
40002电信获取 accessCode 失败电信获取 accessCode 失败
40010电信报备 referer 校验失败访问域名的 referer 与电信报备的地址不一致
40000未知运营商,仅支持电信、联通、移动仅支持主流运营商

常见问题

1. 发生错误时该如何排查问题?

首先看返回的错误码,可从错误信息 err.data 中获取,然后与上述的【错误对照表】对比查看,需要强调的是,如果错误码为 40000,请检查设备网络是否关闭了 wifi。

2. 错误码在上述【错误对照表】中没有怎么办?

因为 SDK 内部在调用各个运营商服务时,他们有自己的错误提示信息,我们的策略是优先显示他们的错误信息,所以当出现这种情况时,开发者可根据错误信息中的 err.data.msg 大致排查下,如果还是不知道如何解决,请联系我们的技术支持。

3. 我用电脑如何进行开发?

首先要保证开发时本地服务的访问地址不能是 localhost 或者 ip,需要配置一个已报备过的完整的地址,例如 http://ye-dev.dun.163.com,这个时候推荐使用 SwitchHost 软件配置:127.0.0.1 ye-dev.dun.163.com,即可正常访问。其次保证使用电脑连接插卡的手机热点,进行开发,走手机流量。如果你通过宽带流量进行开发,一定只会收到错误码。

4. 小屏幕会自适应吗?

SDK 内部做了根据屏幕高度自适应,在屏幕高度 0 - 500px 以下和 500px - 600px 区间,各个 UI 模块的间距会减小,以保证在用户屏幕内能够显示所有模块。如果你自定义了模块的 top 属性,将会覆盖默认的间距,这个时候需要业务方自己做自适应工作。如果业务方使用的 modepopup 模式,因为我们无法得知容器的大小,所以无法做自适应,需要业务方自己设置各 UI 模块的 top 来缩减距离。

3.1.1

1 month ago

3.1.0

3 months ago

3.0.0

6 months ago

2.3.2

9 months ago

2.3.1

10 months ago

2.3.3

9 months ago

2.3.0

11 months ago

2.1.2

1 year ago

2.2.0

11 months ago

2.1.3

12 months ago

2.1.1

1 year ago

2.1.0

1 year ago

2.0.1

1 year ago

2.0.0

1 year ago

1.1.0

1 year ago

1.0.6

1 year ago

1.0.5

2 years ago

1.0.4

2 years ago

1.0.3

2 years ago

1.0.2

2 years ago

0.0.2

2 years ago

0.0.1

2 years ago

1.0.1

2 years ago

1.0.0

2 years ago