1. 简要描述

  • 此为人脸核身的小程序版本,功能包含人脸活体检测和个人身份信息验证;
  • 商户小程序通过跳转当前小程序方式,完成人脸识别和身份核验后再跳回商户小程序,为商户提供一种人脸核身的替代解决方案;
  • 身份信息比对库为公安一所的数据库;
  • 支持非信贷业务场景的小程序;

2. 使用前须知

  • 微信小程序名称:学谷智能Face
  • 此服务为学谷智能官方提供,调用前先到<插件中心>订阅试用套餐;
  • 插件中心地址: https://product.plugin.shargoodata.com

3. 订购服务

  • “人脸核身”

    功能:人脸检测,判断当前操作人是否是真人,且完成人脸和身份信息的一致性验证;
    注意:确保已订购了“人脸核身” 试用版套餐;

  • “人脸活体”

    功能:人脸识别,判断当前人物真实性,确保操作人是真人
    注意:确保已订购了“人脸活体” 试用版套餐;

4. 获取 token 的方式 ( 建议服务端获取 )


简要描述:

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为tabBar

  • 3)当您希望插件结束后跳转至新的小程序页面时,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:了解微信小程序开发文档里面的api

    https://developers.weixin.qq.com/miniprogram/dev/api/navigate/wx.navigateBackMiniProgram.html

  • 9)Q:查询结果提示“结果记录未找到”
    A:检查以下情况:查询订单号是否有错误;前端调用接口的顺序是否错误;是否在app.onshow里接收了返回值;

  • 10)Q:人脸采集页面白屏,没有显示人脸框
    A:采用跳转形式调用人脸功能,会有弹框提示用户授权,如果用户误点击拒绝,会出现白屏,无法调用摄像头;可以删除小程序,重新进入;

8. 产品体验demo:

小程序体验demo

9. 客服咨询:

手机号:15068737550

邮箱: enjoycai@shargoodata.com

微信:

文档更新时间: 2024-12-12 14:16   作者:admin