uni-app 接入极验验证码攻略

背景

uni-app 的项目中需要接入极验验证码,根据极验官方文档,只能在微信的 wxml 页面中引入模板,但是对于每个页面都有接口调用的情况下,手动加是不可能的,开发量大,测试工作量也大,需要回归整个app,但是官方也没有提供类似全局api的形式给到 js 去调用,小程序不像H5 是可以临时插入dom进行操作的,所有要做到全局把控,只能通过中间页的形式。

实现思路

思路:通过小程序里面建一个中间页面,在接口响应的时候,根据 code 码跳转到承载极验验证码的页面,在这个页面里面做相关的逻辑处理,成功之后在返回到上一个页面即可。为了不占用主包的大小,所以这个中间页最好放在分包里面。为了保存数据,在页面中使用,可以将数据存在 vuex 中,这样可以全局读取,进行二次验证传递给接口。

实现步骤

申请插件

登陆微信小程序的后台,在设置-第三方服务-插件管理中添加插件,通过 appid(wxefa63d84fe9f64a2)查找并添加验证码插件,等待极验通过申请即可使用。

插件通过后,可以在微信开发者工具详情-插件信息中查看插件的版本号


配置插件

  • 在文件src/manifest.json中找到微信相关的配置,加入插件:
"mp-weixin": { /* 微信小程序特有相关 */
    "appid": "xx",
    "setting": {
      "urlCheck": false
    },
    "usingComponents": true,
    "optimization": {
      "subPackages": true
    },
    "plugins": {
      "myPlugin": {
        "version": "1.3.3",
        "provider": "wxefa63d84fe9f64a2"
      }
    }
  },
  • src/pages.json中找到分包subPackages,加入承载验证码操作的中间页,在这个页面引入插件,就可以在当前页面中使用:
"subPackages": [
  "root": "packageSecond",
  "pages": [
    {
      "path": "pages/geetest/geetest",
      "style": {
        "navigationBarTitleText": "验证码",
        "mp-weixin": {
           "usingComponents": {
              "captcha": "plugin://myPlugin/captcha"
            }
         }
       }
    }
  ]
]

中间页

新建中间页,在分包目录下,如src/packageSecond/pages下新建一个中间页面geetest/geetest.vue,页面中引入极验验证码的模板,按照vue的语法转换模板,监听成功和失败的时间,做相应的业务逻辑处理,根据官方文档,微信小程序的模板写法<captcha id="captcha" wx:if="{{loadCaptcha}}" gt="{{gt}}" challenge="{{challenge}}" offline="{{offline}}" bindonSuccess="captchaSuccess" />
wx:if换成v-if{{}}语法换成 vue 模板语法,事件绑定换成@onSuccess

// geetest/geetest.vue
<template>
  <view class="container">
    <view class="gettest-box">
      <captcha
        v-if="geetestObj.loadCaptcha"
        :gt="geetestObj.gt"
        :challenge="geetestObj.challenge"
        :offline="geetestObj.offline"
        @onError="error"
        @onSuccess="success"
      />
    </view>
  </view>
</template>
<script>
import { mapState } from 'vuex'
import store from 'store'

export default {
  computed: {
    ...mapState({
      geetestObj: state => state.geetestObj,
    }),
  },
  methods: {
    error(e) {
      console.log('我是挤眼验证码,我出错了')
    },
    async success(result) {
      try {
        store.commit('SET_GEETEST_RESULT', result.detail)
        const secondVerifyUrl = '/api/secondVerify'
        const reportResultUrl = '/api/reportResult'
        const options = {stone: true, json: true}
        const resultData = result.detail
  
        // 二次验证需要的参数
        const secondVerifParams = {
          challenge: resultData.geetest_challenge,
          serverStatus: this.geetestObj.serverStatus,
          validate: resultData.geetest_validate,
          seccode: resultData.geetest_seccode,
          devicePlatform: 'h5',
        }

        const secondVerify = await postRequest(secondVerifyUrl, secondVerifParams, options)
        let { resultCode = '' } = secondVerify
        if (resultCode) {
          const params = {
            challenge: resultData.geetest_challenge,
            serverStatus: this.geetestObj.serverStatus,
            result: resultCode === '200' ? 1 : 0,
            devicePlatform: 'h5',
          }
          const reportResult = await postRequest(reportResultUrl, params, options)
          if (reportResult.resultCode) {
            const pages = getCurrentPages() // 当前页面
            const beforePage = pages[pages.length - 2] // 上一页
            const options = beforePage.options
            uni.navigateBack({
              success: function() {
                beforePage.onLoad(options) // 执行上一页的onLoad方法
              }
            })
          }
        }
      } catch(e) {
        console.log(e)
      }
    }
  }
}
</script>
<style lang="scss">
.container {
  width: 100vw;
  height: 100vh;
  position: relative;

  .gettest-box {
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    width: 100%;
    height: 100%;
    display: flex;
    align-items: center;
    justify-content: center;
  }
}
</style>

监听接口

封装好的接口请求中监听响应的状态,将数据存到 store 中,在验证码中间页拿到数据,进行二次验证的时候传给后端接口。

// server.js
fetchInstance.interceptors.response.use(res => {
    // #ifdef MP-WEIXIN
    if (res.data.status === 485) {
        const data = res.data.data
        const obj = {
            loadCaptcha: data.newCaptcha,
            gt: data.gt,
            challenge: data.challenge,
            offline: !data.serverStatus,
            serverStatus: data.serverStatus
        }
        store.commit('SET_GEETEST_OBJ', obj)
        uni.navigateTo({
            url: '/packageSecond/pages/geetest/geetest'
        })
    }
    // #endif
})

以上就是接入的这个过程。
效果如下:



参考:
https://docs.geetest.com/sensebot/apirefer/api/miniprogram
https://docs.geetest.com/sensebot/deploy/client/miniprogram
https://uniapp.dcloud.io/component/mp-weixin-plugin

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容