Vue3 配合 TypeScript 接入腾讯云滑块验证 引入 SDK 封装 TypeScript 调用方法 Options 提供以下配置参数

Vue3 配合 TypeScript 接入腾讯云滑块验证

引入 SDK

找到 index.html<head> 标签中增加腾讯云验证器 SDK 引用
./index.html:

html 复制代码
<!-- 腾讯云:滑块验证 -->
<!-- 验证码程序依赖(必须)。请勿修改以下程序依赖,如使用本地缓存,或通过其他手段规避加载,会影响程序的正常使用。 -->
<!-- 文档:https://cloud.tencent.com/document/product/1110/36841 -->
<script src="https://ssl.captcha.qq.com/TCaptcha.js" ></script>

封装 TypeScript 调用方法

为了兼容 TypeScript 类型提示,并且优雅的在 Vue3 中使用,我们用下面这个 .ts 文件对 SDK 的 TencentCaptcha 方法进行封装。

./src/util/sliderValidator.ts:

typescript 复制代码
/** 验证结果 */
export type SliderValidatorResult = {
  /** 验证结果,0:验证成功。2:用户主动关闭验证码。 */
  ret: number

  /** 验证成功的票据,当且仅当 ret = 0 时 ticket 有值。 */
  ticket: string

  /** 验证码应用ID */
  CaptchaAppId: string

  /** 自定义透传参数 */
  bizState: any

  /** 本次验证的随机串,请求后台接口时需带上 */
  randstr: string
}

/**
  # TencentCaptcha 的配置参数

  - res(用户主动关闭验证码)= `{ret: 2, ticket: null}`
  - res(验证成功) = `{ret: 0, ticket: string, randstr: string}`
  - res(客户端出现异常错误 仍返回可用票据) = `{ret: 0, ticket: string, randstr: string,  errorCode: number, errorMessage: string}`
*/
export type TencentCaptchaOptions = {

  /** 自定义透传参数,业务可用该字段传递少量数据,该字段的内容会被带入callback回调的对象中 */
  bizState?: any

  /** 开启自适应深夜模式 */
  enableDarkMode?: boolean

  /**
    # sdkOpts
    示例 `{"width": 140, "height": 140}`

    注: 只在移动端原生 webview 调用时传入,为设置的验证码元素 loading 弹框大小
  */
  sdkOpts?: { width: number; height: number }

  /**
    # ready
    验证码加载完成的回调, 回调参数为验证码实际的宽高。
    手机原生端可根据此值设置弹框大小。
  */
  ready?: (p: { sdkView: { width: number; height: number } }) => any
}

/** 腾讯验证码 */
declare class TencentCaptcha {
  constructor(appId: string, callback: (p: SliderValidatorResult) => any, options?: TencentCaptchaOptions)
  show(...params: any): any
}

// 复刻 Promise 下的 Resolve 和 Reject 类型
type Resolve = (value: SliderValidatorResult | PromiseLike<SliderValidatorResult>) => void
type Reject = (reason?: any) => void

// 返回值方法
export type ApplySlider = () => Promise<SliderValidatorResult>

/**
  腾讯滑块验证器
**/
export function sliderVerification(options?: TencentCaptchaOptions): ApplySlider {
  if (!TencentCaptcha) throw new Error('TencentCaptcha is not defined')

  let promise = {} as { resolve: Resolve; reject: Reject }
  let slider: TencentCaptcha
  onMounted(() => {
    slider = new TencentCaptcha(
      // App Id
      import.meta.env.VITE_TENCENT_CAPTCHA_APP_ID,
      // Callback
      (res: SliderValidatorResult) => {
        promise.resolve(res)
      },
      // Options
      options,
    )
  })

  return () => {
    return new Promise<SliderValidatorResult>((resolve, reject) => {
      slider.show()
      promise = { resolve, reject }
    })
  }
}

使用方法

vue 复制代码
<script lang="ts" setup>
import { sliderVerification, ApplySlider } from '~/util/SliderValidator'
let applySlider: ApplySlider
// 初始化滑块验证器
// 初始化参数,参考 TencentCaptchaOptions
onMounted(() => { applySlider = sliderVerification() })

// 开始验证
async function onVerify() {
  const res = await applySlider()
  console.log('SliderValidatorResult:', res)
}
</script>
<template>
  <button @click="onVerify"> 滑块验证 </button>
</template>

这边会用到一个 import.meta.env.VITE_TENCENT_CAPTCHA_APP_ID 的参数,可以从从腾讯云的验证码控制台中获取, 验证码控制台页面内【图形验证】>【验证列表】进行查看 。如果未新建验证,请根据业务需求选择适合的验证渠道、验证场景进行新建。

使用方法

vue 复制代码
<script lang="ts" setup>
import { sliderVerification } from '~/util/sliderValidator'
// 初始化验证器实例
const applySlider = sliderVerification({
  // Options
  bizState: 'hello, slider!',
  enableDarkMode: true,
})
// 触发验证器
async function onVerify() {
  const res = await applySlider()
  console.log('SliderValidatorResult:', res)
}
</script>
<template>
  <!-- 将方法绑定到一个按钮 -->
  <button @click="onVerify">
    滑块验证
  </button>
</template>
Options 提供以下配置参数
配置名 值类型 说明
bizState Any 自定义透传参数,业务可用该字段传递少量数据,该字段的内容会被带入callback回调的对象中
enableDarkMode Boolean 开启自适应深夜模式
sdkOpts Object 示例 {"width": 140, "height": 140} 注: 只在移动端原生webview调用时传入,为设置的验证码元素loading弹框大小
ready Function 验证码加载完成的回调, 回调参数为验证码实际的宽高。手机原生端可根据此值设置弹框大小
相关推荐
skywalk81632 小时前
JupyterLab notebook环境在Ubuntu24.04下的安装和Windows 10下vscode远程使用jupyter
windows·vscode·ubuntu·jupyter
shelby_loo9 小时前
在 Ubuntu 下通过 Docker 部署 Caddy 服务器
服务器·ubuntu·docker
政宇 | STAR10 小时前
Ubuntu升级ssh版本到9.8
服务器·ubuntu·ssh
WGS.10 小时前
Temporary failure resolving ‘security.ubuntu.com‘
linux·ubuntu
码韵12 小时前
【Ubuntu使用技巧】Ubuntu22.04无人值守Crontab工具实战详解
linux·运维·ubuntu
【D'accumulation】13 小时前
深入聊聊typescript、ES6和JavaScript的关系与前瞻技术发展
java·开发语言·前端·javascript·typescript·es6
vvw&14 小时前
如何在 Ubuntu 22.04 上安装 Varnish HTTP 教程
linux·运维·服务器·ubuntu·http·apache·firewalld
乐大师16 小时前
Dell服务器升级ubuntu 22.04失败解决
运维·服务器·ubuntu
放逐者-保持本心,方可放逐16 小时前
基于Node.js + Koa2 + MySQL + TypeScript的应用示例
mysql·typescript·node.js·koa2·服务端基础应用
vvw&17 小时前
如何在 Ubuntu 22.04 上部署 Nginx 并优化以应对高流量网站教程
linux·运维·服务器·后端·nginx·ubuntu·性能优化