1. 简要描述
- 此为人脸核身的小程序版本,功能包含人脸活体检测和个人身份信息验证;
- 商户小程序通过跳转当前小程序方式,完成人脸识别和身份核验后再跳回商户小程序,为商户提供一种人脸核身的替代解决方案;
- 身份信息比对库为公安一所的数据库;
- 支持非信贷业务场景的小程序;
2. 使用前须知
- 微信小程序名称:学谷智能Face
- 此服务为学谷智能官方提供,调用前先到<插件中心>订阅试用套餐;
- 插件中心地址:
https://product.plugin.shargoodata.com
3. 订购服务
“人脸核身”
功能:人脸检测,判断当前操作人是否是真人,且完成人脸和身份信息的一致性验证;
注意:确保已订购了“人脸核身” 试用版套餐;“人脸活体”
功能:人脸识别,判断当前人物真实性,确保操作人是真人
注意:确保已订购了“人脸活体” 试用版套餐;
4. 获取 token 的方式 ( 建议服务端获取 )
4.1 服务端获取方法:点击查看文档
简要描述:
api获取请求token
请求URL:
https://gauss.shargoodata.com/gauss/authorization/token.json
请求方式:
POST
请求数据类型:
x-www-form-urlencoded
请求参数:
参数名 | 是否必须 | 类型 | 说明 |
---|---|---|---|
platformNo | 是 | string | 商户号 |
secretKey | 是 | string | 密钥 |
expiresIn | 是 | long | token有效期 单位(秒)不能超过30天,最大为2592000 |
4.2 小程序前端获取方法(仅供参考):
wx.request({ url: 'https://gauss.shargoodata.com/gauss/authorization/token.json', data: { platformNo: '*****', // 此为[学谷智能]商户号,请到注册邮箱查看; secretKey: '*****' }, dataType: 'JSON', method: 'POST', header: { 'content-type': 'application/x-www-form-urlencoded' }, success: function(res) { console.log(res) } })
接口返回结果实例:
{
data: "" // 返回的token
outside_no: null
success: true
}
5. 微信跳转api
type envVersion = 'develop' | 'trial' | 'release'
const uuid; // 作为唯一key,16位 (仅用于加密,可以使用在线生成uuid工具,也可以后端生成)
// api文档可参考:https://developers.weixin.qq.com/miniprogram/dev/api/navigate/wx.navigateToMiniProgram.html
wx.navigateToMiniProgram({
appId: 'wxe83fe5a4f77efb58', // 跳转到另外一个小程序的appId(复制即可)
path: 'pages/source/index?id=' + uuid, // 跳转到小程序的页面(复制即可)
extraData: {
params: aseEncryptParams(JSON.stringify(data), uuid)
}, // data需要携带的信息,具体请见详情
envVersion: 'release', // 跳转的环境, 支持的枚举 envVersion
success(res) { // success } // 跳转成功
})
data输入信息
字段 | 类型 | 说明 | 必填/选填 | 备注 |
---|---|---|---|---|
token | string | token | 是 | |
platformNo | string | 商户号 | 是 | |
orderNo | string | 商户订单号 | 是 | 由商户自己生成,代表该次调用的唯一值,便于后续查询 |
extraInfo | object | 人脸核身/人脸活体 | 是 | 如果含姓名和身份证号,则调用“人脸核身”接口;如果不含,则调用“人脸活体”接口; |
extendData | object | 扩展表 | 否 |
extraInfo
字段 | 类型 | 说明 | 必填/选填 | 备注 |
---|---|---|---|---|
isShowCamera | boolean | 跟官方审核相关 | 是 | 默认为true |
isShowResultPage | boolean | 是否显示状态结果页面,只保留显示人脸检测页; | 否 | true:显示结果页面,默认 true;false:不显示状态结果页面; |
idName | string | 姓名 | 否 | 人脸核身服务必传 |
idNumber | string | 身份证 | 否 | 人脸核身服务必传 |
返回信息
字段 | 类型 | 说明 |
---|---|---|
data | object | code,filePath,msg(小程序版本filepath不可用,通过查询接口获取图片) |
success | boolean | 执行是否成功,true:扣费;false:不扣费; |
success为true时,data.code取值说明
code码 | 说明 |
---|---|
200 | 验证通过 |
405 | 照片不匹配 |
404 | 库中无此号 |
403 | 相片质量校验不合格 |
406 | 身份证号与姓名不匹配 |
401 | 活体验证不通过 |
400 | 无效的参数 |
402 | 无效的证件 |
500 | 输入图片无法处理;通道异常; |
success为false时,error_code报错码枚举:
code码 | 说明 |
---|---|
400 | image图片不可为空 |
加密库
// 这里使用CryptoJS
import CryptoJS from 'crypto-js';
/**
* ASE加密
* @description 使用加密秘钥,对 需要加密的参数 进行加密
* @param {string} word - 需要加密的参数,这里最好用JSON.stringify序列化
* @param {string} key - 加密密钥(长度必须是 16 的整数倍,这里我们可以用uuid)
*/
export function aseEncryptParams(word: json, key: string) {
// 加密的参数 - 从 UTF-8编码 解析出原始字符串
const wordUTF8 = CryptoJS.enc.Utf8.parse(word);
// 密钥 - 从 UTF-8编码 解析出原始字符串
const keyUTF8 = CryptoJS.enc.Utf8.parse(key);
const encrypted = CryptoJS.AES.encrypt(wordUTF8, keyUTF8, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7,
});
return encrypted.toString();
}
/**
* ASE解密
* @description 使用加密秘钥,对 需要解密的参数 进行解密
* @param {string} encryptedWord - 需要解密的参数
* @param {string} key - 加密密钥(长度必须是 16 的整数倍)
*/
export function aesDecryptParams(encryptedWord: string, key: string) {
// 密钥 - 从 UTF-8编码 解析出原始字符串
const keyUTF8 = CryptoJS.enc.Utf8.parse(key);
const bytes = CryptoJS.AES.decrypt(encryptedWord, keyUTF8, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7,
});
return JSON.parse(bytes.toString(CryptoJS.enc.Utf8))
}
小程序调用Demo
import CryptoJS from 'crypto-js';
Page({
data: {
token: ""
},
onLoad() {
this.init() // 初始化获取token
},
init() {
const that = this
wx.request({
url: 'https://gauss.shargoodata.com/gauss/authorization/token.json',
data: {
platformNo: "xxx", // 商户号
secretKey: "xxx" // 密钥
},
dataType: 'JSON',
method: 'POST',
header: {
'content-type': 'application/x-www-form-urlencoded'
},
success: function(res) {
that.setData({
token: JSON.parse(res.data).data
})
}
})
},
/**
* 点击事件
*/
handleToProgram() {
const uuid = "xxx" // 作为唯一key,16位 (仅用于加密,可以使用在线生成uuid工具,也可以后端生成)
const data = {
token: this.data.token,
platformNo: "xxx", // 商户号
orderNo: "xxx", // 订单号,由商户自己生成,确保唯一值
extraInfo: {
isShowCamera: true,
idName: "原则", // 仅限demo使用,调试环境请替换成真实数据
idNumber: "327462199901122356" // 仅限demo使用,调试环境请替换成真实数据
}
}
wx.navigateToMiniProgram({
appId: 'wxe83fe5a4f77efb58', // 跳转到另外一个小程序的appId(复制即可)
path: 'pages/source/index?id=' + uuid, // 跳转到小程序的页面(复制即可)
extraData: {
params: this.aseEncryptParams(JSON.stringify(data), uuid)
},
envVersion: 'release',
success(res) {
console.log(res)
}
})
},
/**
* 加密函数
*/
aseEncryptParams(word, key) {
// 加密的参数 - 从 UTF-8编码 解析出原始字符串
const wordUTF8 = CryptoJS.enc.Utf8.parse(word);
// 密钥 - 从 UTF-8编码 解析出原始字符串
const keyUTF8 = CryptoJS.enc.Utf8.parse(key);
const encrypted = CryptoJS.AES.encrypt(wordUTF8, keyUTF8, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7,
});
return encrypted.toString();
}
})
H5调用Demo
const uuid = "xxx" // 作为唯一key,16位 (仅用于加密,可以使用在线生成uuid工具,也可以后端生成)
const data = {
token: "xxx", // 参考本文档第4条,获取token
platformNo: "xxx", // 商户号
orderNo: "xxx", // 订单号,由商户自己生成,确保唯一值
extraInfo: {
isShowCamera: true,
idName: "原则", // 仅限demo使用,调试环境请替换成真实数据
idNumber: "327462199901122356" // 仅限demo使用,调试环境请替换成真实数据
}
}
const jwt = aseEncryptParams(JSON.stringify(data), uuid) // 参数加密处理
<wx-open-launch-weapp
id="launch-btn"
appid="wxe83fe5a4f77efb58"
path="pages/source/index?id=${uuid}&jwt=${jwt}"
envVersion="release" // 正式版release、开发版develop、体验版trial
>
<script type="text/wxtag-template">
<button class="btn">打开小程序</button>
</script>
</wx-open-launch-weapp>
6. 查询接口:获取“人脸核身”处理结果;
功能:除了前端返回处理结果,系统也提供服务端查询接口,便于商户通过服务端获取处理结果和照片;
请求URL:
https://gauss.shargoodata.com/gauss/mp/ocr/query
请求方式:
POST
请求数据类型:
x-www-form-urlencoded
表头:
参数名 | 类型 | 默认值 | 是否必填 | 说明 |
---|---|---|---|---|
token | String | 无 | 是 | token |
表体:
参数名 | 类型 | 默认值 | 是否必填 | 说明 |
---|---|---|---|---|
platformNo | String | 无 | 是 | 商户号 |
body | String | 无 | 是 | 订单号,与前文的orderNo相同 |
返回信息
字段 | 类型 | 说明 |
---|---|---|
success | boolean | true代表执行成功,扣费;false代表执行不成功,不扣费 |
data | object | code,msg,image(base64形式,人脸照片) |
success为true时,code取值说明
code码 | 说明 |
---|---|
200 | 验证通过 |
405 | 照片不匹配 |
404 | 库中无此号 |
403 | 相片质量校验不合格 |
406 | 身份证号与姓名不匹配 |
401 | 活体验证不通过 |
400 | 无效的参数 |
402 | 无效的证件 |
500 | 输入图片无法处理 |
success为false时,error_code报错码枚举:
code码 | 说明 |
---|---|
509 | 结果记录未查到 |
7. 常规故障处理:
1)Q:页面测试一直提示“拼命加载中”
A:因开发者工具真机调试缺乏部分api,因此人脸识别暂时不支持 真机调试 ,只能用 真机预览 ; 请勿使用小程序开发者工具的 真机调试 功能进行调试,建议直接编译到手机运行,或者在有摄像头的电脑上进行调试2)插件并不是每次跳转都会跳到用户传入的url去,当且仅当插件中没有出现错误的时候(比如传入的商户号错误,或者token无效),
正常情况下,插件调用的是wx.redirectTo跳转指定url,如果是tabBar页面,需填写urlType为tabBar3)当您希望插件结束后跳转至新的小程序页面时,success方法中更改dom的话会导致无效,这是插件跳转小程序的一个bug;
解决方法为:success回调方法中保存插件传来的值到全局变量中,然后在onload中使用此全局变量修改dom(如果插件没有跳转到新的小程序页面,即url不传的话,此问题将不会存在)4)Q:提示“你暂时不具备此资质”;
A:检查一下extraInfo里的isshowcamera这个字段的参数值是true还是false,把这个值改成true可正常使用;5)Q:上传到体验版或者线上,提示“验证签名失败”;
A:在小程序公众平台的服务器配置这里,把获取token的网址配置一下;网址为:https://gauss.shargoodata.com
然后删除小程序重新进去就可以了;6)Q:开发工具上可以,为什么发布到体验版就不行了?
A:在小程序公众平台的服务器配置这里,把获取token的网址配置一下;网址为:https://gauss.shargoodata.com
然后删除小程序重新进去就可以了;7)Q:页面一直显示”Lodaing…正在跳转,请稍后…”
A:请检查参数是否正确,加密库以及加密模式要保持一致;8)Q:如何获取小程序跳转后返回的参数
A:了解微信小程序开发文档里面的apihttps://developers.weixin.qq.com/miniprogram/dev/api/navigate/wx.navigateBackMiniProgram.html
9)Q:查询结果提示“结果记录未找到”
A:检查以下情况:查询订单号是否有错误;前端调用接口的顺序是否错误;是否在app.onshow里接收了返回值;10)Q:人脸采集页面白屏,没有显示人脸框
A:采用跳转形式调用人脸功能,会有弹框提示用户授权,如果用户误点击拒绝,会出现白屏,无法调用摄像头;可以删除小程序,重新进入;
8. 产品体验demo:
9. 客服咨询:
手机号:15068737550
微信: