uniapp微信小程序接入人脸核身SDK

这几天使用uni-app开发某银行的一个微信小程序,需要集成接入腾讯云的人脸核身SDK,如上图所示,记录下整合接入过程及踩的一些坑,帮助后面需要的朋友们。关于uni-app接入人脸核身SDK有不懂的地方可以在下面提问,看到会及时回复。 申请服务不是所有的企业都能够申请的,需要符合以下行业要求的客户才能申请政务:政府机构或事业单位金融:银行、保险医疗:公立医疗机构运营商:电信运营商教育:公立教育机构交通:航空、客运、网约车、交通卡、共享交通、轨道交通、租车旅游:酒店物流:快递、邮政、物流 由于SDK会调用小程序原生的wx.startFacialRecognitionVerify方法,所以总共得申请2个服务SDK服务:申请人脸核身服务小程序:查看申请流程(需要发送邮件申请,使用该服务的小程序的appid,后面开发也是用的这个)重要的事情说3遍以上这2个服务都需要申请,缺一不可。以上这2个服务都需要申请,缺一不可。以上这2个服务都需要申请,缺一不可。 下载SDK由于不是我申请的,所以怎么下载我也不知道,听群里的人说的是SDK腾讯云下发给客户的。 SDK目录结构 SDK接入参考腾讯云文档的接入方法:https://cloud.tencent.com/document/product/1007/31071文档是针对原生小程序写的,所以页面引入的方法有所不同由于uni-app不支持直接引入小程序的原生页面,所以这里能想到的就是将它当作成一个微信小程序的组件,然后uni-app的页面引入这个组件 解压引入SDK在uni-app项目中新建wxcomponents目录,将SDK解压后放到该目录pages.json中globalStyle中全局引入小程序的组件,注意引用的路径 "usingComponents": { "verify-mpsdk": "/wxcomponents/verify_mpsdk/index/index"} 新建人脸核身页面pages中新建人脸核身的页面face(名字可以随意,根据自己的需要起名),pages.json中配置页面face页面中引入verify-mpsdk组件最终的人脸核身的页面访问就是/pages/face/face 初始化SDK在需要的页面初始化SDK,如有个页面需要点击按钮进行人脸核身,就在这个页面进行初始化。这个直接照着文档快速入门中的来就行了,这里就直接使用uni-app默认的index页面,适当修改下即可,大概代码如下: <template> <view class="content"> <button type="primary" @tap="gotoVerify"> 进入人脸核身 </button> </view></template><script> export default { data() { return { BizToken: '' } }, onLoad() { // 初始化慧眼实名核身组件 const Verify = require('@/wxcomponents/verify_mpsdk/main.js') Verify.init() }, methods: { // 单击进入人脸核身按钮时,触发该函数 gotoVerify () { this.BizToken = '' // 这里需要我们去客户后端调用DetectAuth接口获取BizToken // 调用实名核身功能 wx.startVerify({ data: { token: this.BizToken // BizToken }, success: (res) => { // 验证成功后触发 // res 包含验证成功的token, 这里需要加500ms延时,防止iOS下不执行后面的逻辑 setTimeout(() => { // 验证成功后,拿到token后的逻辑处理,具体以客户自身逻辑为准 console.log(res) }, 500) }, fail: (err) => { // 验证失败时触发 // err 包含错误码,错误信息,弹窗提示错误 setTimeout(() => { console.log(err) wx.showModal({ title: "提示", content: err.ErrorMsg, showCancel: false }) }, 500) } }) } } }</script>注意下这里的BizToken,需要调用后端服务接口来获取,需要后端的同学调用腾讯云提供的DetectAuth来返回前端需要的BizToken,调试开发阶段我们可以先通过腾讯云提供的工具API 3.0 Explorer直接来获取这个BizToken如果服务申请成功后控制台一般能找到SecretId,SecretKey,RuleId注意Endpoint和Region选择的地区得保持和申请时选择的地区一致。填写完成后点击在线调用中的发送请求按钮,如果填的都对的话返回信息里面会有BizToken拿到BizToken后就可以直接使用了,修改下上面的代码:xxxxxxxxxxxxxxxxx就是拿到的BizToken ...

August 17, 2019 · 1 min · jiezi

uniapp-H5版本IOS图片长按识别

问题描述:uni-app开发H5碰到ios系统下,图片长按没有识别二维码(小程序码)的选项。问题解决:uni-app的配置文件中配置H5相关配置,设置路由模式为hash即可解决问题

July 14, 2019 · 1 min · jiezi

uniapp-组件传值踩坑记录

小程序端子组件的created事件和父组件的onload同时执行; 在小程序端,用watch监听传进来的值,等有值了再进行下一步操作;H5端先执行父组件的onload,再执行子组件的created;H5端可以在created中进行下一步操作,因为此时已经有prop传进来了

July 14, 2019 · 1 min · jiezi

Loading图总有一款适合你

总有一款适合你的Loadinggithub地址,喜欢的可以star下哦 插件预览图 使用教程1.插件代码拷贝 下载后把components目录下countUp.vue文件拷贝到自己项目目录下2.插件全局配置 在项目里main.js中配置如下代码import loading from './components/loading/loading.vue'Vue.component('loading',loading)3.插件使用 vue页面使用<template> <view> <loading ></loading> </view></template><script></script><style></style>还收集了一些其他的Loding Loaders.css css-loaders SVG-Loaders 暂时收集了这些,我相信能满足大部分人的需求了 兼容性uni-app项目中使用都兼容

July 5, 2019 · 1 min · jiezi

uniapp-scrollview-实现滑动菜单

<scroll-view class="monthDescTab" scroll-x="true" @scroll="scroll" scroll-left="0"> <view v-for="(month, index) in dataArrMonth" class="beforeMonth" :class="beforeMonthActive == index ? 'active' : ''" @click="toMonth(month, index)" :key="month" v-show="monthTitleShow" > {{ month }}月 </view></scroll-view><style>.monthDescTab { width: 100%; /* * 文本不会换行,文本会在在同一行上继续,直到遇到 <br> 标签为止。 * 只有加入这句话white-space: nowrap; scroll-view组件才能够滑动(此处为横向滑动) */ white-space: nowrap; font-size: 30upx; height: 50upx; line-height: 50upx; color: #e8e8e5;}</style>

July 3, 2019 · 1 min · jiezi

小程序swiper轮播CSS3动画及跳转到指定swiperitem实现思路

需要解决的问题近几日一直在看怎样制作微信小程序的swiper轮播图。因为我既需要生成小程序的代码,也需要生成H5版代码,如果编写两套效率会比较低下,所以选择了uni-app。 uni-app已经在基础组件swiper中已经直接支持了轮播动画。 我主要需要解决的是以下几个问题: ①在swiper中怎样添加css3流行的animate.css动画。②添加好后如果滑动了轮播图,怎样能保证下一屏的动画不自动播放。③怎样能实现轮播图的无限循环播放。④怎样能实现,当用户点击一个按钮之后,可以跳转到指定的swiper-item中。也就是跳转到指定的屏。⑤小程序和H5版的代码会生成一个头部,在H5版中需要隐藏掉导航栏。以下就是我整个制作的思路过程,仅供参考。另外,代码是uni-app开发,所以在小程序中和H5中测试都没有问题。另外为了方便小程序开发同学了解,会提供小程序版代码和uni-app代码供参考。 代码实现在H5开发中经常使用的就是animate.css。在微信中自然是支持的,因为微信会对上传的小程序有大小限制,所以这里我使用了一个极简化的animate.css,其中删掉了很多-webkit-animation开头的css3。因为我们只需要在小程序和H5中运行,这样做影响也不大。如果需要的话,可以从下面的代码中获取。 我们先来看下代码: <template> <view class="content"> <button type="primary" @tap="goChange">跳转到第二屏</button> <swiper class="content-swiper" :vertical="true" :indicator-dots="true" :autoplay="false" :interval="3000" :duration="1000" @change="changeSwiper" @animationfinish="changeFinish" :current-item-id="item_id" circular="true"> <swiper-item item-id="slide0"> <view class="swiper-item"> <image src="../../static/uni.png" :class="animate_0"></image> </view> </swiper-item> <swiper-item item-id="slide1"> <view class="swiper-item"> <image src="../../static/uni.png" :class="animate_1"></image> </view> </swiper-item> <swiper-item item-id="slide2"> <view class="swiper-item"> <image src="../../static/uni.png" :class="animate_2"></image> </view> </swiper-item> <swiper-item item-id="slide3"> <view class="swiper-item"> <image src="../../static/uni.png" :class="animate_3"></image> </view> </swiper-item> </swiper> </view></template><script> export default { data() { return { item_id: 'slide2', animate_0: 'animated swing', animate_1: '', animate_2: '', animate_3: '' } }, onLoad() { }, methods: { changeSwiper(event){ // 清空除了当前swiper以外的所有动画 let current = event.detail.current; // 当前页下标 this.item_id = 'slide'+current; // 这里必须记录,否则只能跳转一次 switch (current){ case 0: this['animate_1'] = this['animate_2'] = this['animate_3'] = ''; break; case 1: this['animate_0'] = this['animate_2'] = this['animate_3'] = ''; break; case 2: this['animate_0'] = this['animate_1'] = this['animate_3'] = ''; break; case 3: this['animate_0'] = this['animate_1'] = this['animate_2'] = ''; break; } }, changeFinish(event){ // swiper动画完成之后,给当前swiper添加动画效果 let current = event.detail.current; switch(current){ case 0: this['animate_0'] = 'animated swing'; break; case 1: this['animate_1'] = 'animated shake'; break; case 2: this['animate_2'] = 'animated tada'; break; case 3: this['animate_3'] = 'animated heartBeat'; break; } }, goChange(){ this.item_id = 'slide1'; } } }</script><style lang="scss"> @import '../../common/animate.css'; .content { text-align: center; .content-swiper{ height: 100vh; image{ height: 200upx; width: 200upx; margin-top: 200upx; } } }</style>首先uni-app支持sass。在css中直接引入了简洁版animate.css。问题①之后通过查看文档,发现circular这个参数可以实现类似H5页面使用swiper.jsloop参数的功能。这里我掉到了uni-app和微信小程序文档描述的坑中。因为一直在找loop(循环)这个参数,我甚至都以为实现不了这个无限循环的功能了呢。原来小程序中这个参数叫做circular(圆形)。o(╯□╰)o 问题③因为我这里要实现一个竖屏的滑动效果,所以将参数vertical设置为true。在uni-app中,通过change事件,可以监听每一个轮播屏的改变。在这个事件中,我记录的当前屏的下标current。然后将非当前屏的全部css3动画取消掉。最后在animationfinish事件中,当swiper滑动动画结束后,给当前屏的元素添加css3动画。问题②在uni-app中有个current-item-id参数,代表当前所在滑块的 item-id。这个文档我看了好久,才明白。原来是需要在swiper-item中指定上item-id。然后当用户点击事件触发时,修改绑定到current-item-id上的值即可。我的代码初始化时指定到了item-id为slide2这一屏上。问题④最后一个问题时uni-app中隐藏掉H5导航栏。只需要在pages.json中设置titleNView为false即可。微信小程序代码<!--index.wxml--><view class="container"> <button bindtap='goChange'>跳转到</button> <swiper vertical="true" circular="true" current="{{currentId}}" indicator-dots="true" bindchange="changeSwiper" bindanimationfinish="changeFinish"> <swiper-item> <image src='../../static/uni.png' class='animated {{animate_0}}'></image> </swiper-item> <swiper-item> <image src='../../static/uni.png' class='animated {{animate_1}}'></image> </swiper-item> <swiper-item> <image src='../../static/uni.png' class='animated {{animate_2}}'></image> </swiper-item> </swiper></view>//index.jsconst app = getApp()Page({ data: { currentId: 0, animate_0: 'swing', animate_1: '', animate_2: '' }, onLoad: function() { }, goChange: function() { this.setData({ currentId: 2 }); }, changeSwiper: function(event) { let current = event.detail.current; switch (current) { case 0: this.setData({ animate_1: '', animate_2: '' }); break; case 1: this.setData({ animate_0: '', animate_2: '' }); break; case 2: this.setData({ animate_0: '', animate_1: '' }); break; } }, changeFinish: function(event) { let current = event.detail.current; switch (current) { case 0: this.setData({ animate_0: 'swing', }); break; case 1: this.setData({ animate_1: 'shake', }); break; case 2: this.setData({ animate_2: 'tada', }); break; } }})我将代码托管到了腾讯云开发者平台,需要的话可以参考。在代码目录unpackage/dist/build/h5中,就是生成好的H5版页面。需要注意的是,要部署到web服务器使用,不支持本地file协议打开。其中生成了两个版本的代码,方便大家参考。 ...

May 31, 2019 · 2 min · jiezi

小程序webview关闭后页面音频没有关闭

问题描述:在web-view的src中,引入了一个HTML5页面,这个页面有个自动播放的音频。在小程序中,点击右上角关闭小程序后,web-view页面中的音频依然会播放。 期待现象期待关闭小程序之后,音频也停止。 通过查找文档,发现没有直接提供方法,网上找了一圈之后,尝试的方案也都无法实现。 所以我这里想到的思路是,当用户关闭小程序时,应该销毁掉web-view。可惜,目前没有这个接口。 所以我就利用了模拟的方式来实现,当前小程序页面onHide时,就将web-view的页面src属性清空。 后来经过测试发现,在ios平台下,需要制定一个url,在android平台下只需要清空。另外为了防止造成缓存,给url后面添加了一个随机的参数。 以下是代码片段。 <template> <view> <web-view :src="webUrl"></web-view> </view></template><script> export default { data() { return { webUrl: 'https://demo.com/weixin/index.html' } }, onLoad() { }, onHide(){ // webview关闭后,刷新url。否则会造成音乐在后台继续播放的bug if (uni.getSystemInfoSync().platform == "ios") { this.webUrl = 'https://demo.com/weixin/index.html?redirect=true'; }else{ // android系统下只能给空值 this.webUrl = ';' } }, onBackPress(){ }, methods: { } }</script><style></style>

May 30, 2019 · 1 min · jiezi