微信小程序:实现证件OCR识别

公司要求在小程序证件上传时,自动识别证件(身份证、户口本)等,自动填入表单中,达到提升用户体验。

方案

解决此问题,有几种方案:

方案 识别率 成本
公司部署OCR模型,调后端接口
纯前端OCR方案
百度证件OCR识别服务 -

三种方案中,我们综合考虑,百度提供的接口服务最好的方案,因为正确率高,响应速度快,成本根据用户的量关联的。所有第三种方案可行。 大家也可以使用其他厂商的API服务~

实现思路:

获取百度云的baidu_access_token ---> 用户在小程序端选择图片--->图片转换base64 --->请求百度云OCR服务

代码实现

获取百度云的baidu_access_token

js 复制代码
/**
 * 使用 AK,SK 生成鉴权签名(Access Token)
 * @return string 鉴权签名信息(Access Token)
 */
export default function getAccessToken() {
  let options = {
    method: "POST",
    url:
      "https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=" +
      AK +
      "&client_secret=" +
      SK,
  };
  return new Promise((resolve, reject) => {
    request(options)
      .then((res) => {
        console.log(res, "获取token成功");
        uni.setStorageSync("baidu_access_token", res.access_token);
      })
      .catch((error) => {
        console.log(error, "获取token失败");
        uni.showToast({
          title: "获取token失败",
          icon: "none",
        });
        reject(error);
      });
  });
}

用户在小程序端选择图片

使用uniapp 或 微信小程序的选择相册接口,也可以使用uview的upload组件。我这里使用的是upload组件

js 复制代码
  <u-upload :fileList="fileList1" @afterRead="(e) => afterRead(e)">
  </u-upload>

图片转换base64

js 复制代码
// 转换为base64的函数
function toBase64(path) {
  return new Promise((resolve, reject) => {
    uni.request({
      url: path,
      responseType: "arraybuffer",
      success: (res) => {
        resolve(uni.arrayBufferToBase64(res.data));
      },
    });
  });
}

请求百度云OCR服务

js 复制代码
export default function cardOCR(imageUrl) {
  const access_token = uni.getStorageSync("baidu_access_token");
  const options = {
    method: "POST",
    url: `https://aip.baidubce.com/rest/2.0/ocr/v1/idcard?access_token=${access_token}`,
    headers: {
      "Content-Type": "application/x-www-form-urlencoded",
    },
    data: {
      id_card_side: "front",
    },
  };
  options.headers["Access-Token"] = access_token;

  return new Promise((resolve, reject) => {
    toBase64(imageUrl).then((res) => {
      options.data.image = res;
      request(options)
        .then((res) => {
          if (res.words_result_num > 0) {
            resolve(res.words_result);
          }
        })
        .catch((error) => {
          reject(error);
        });
    });
  });
}

结语

友好推荐:闪图浏览器插件,作者开发的插件;解决写文章没有表情包使用,如何保存,管理表情包的烦恼; juejin.cn/post/751636...

相关推荐
LinXunFeng24 分钟前
Obsidian - 使用 Share Note 分享笔记并自部署
前端·笔记·github
乘风gg4 小时前
为什么AI 时代来临,大部分人吃不到红利
前端·ai编程·claude
恋猫de小郭5 小时前
Android 限制侧载新进展,谷歌联合国内厂商推验证计划
android·前端·flutter
IT_陈寒5 小时前
Redis内存爆了,原来我漏掉了这个致命配置
前端·人工智能·后端
恋猫de小郭5 小时前
解读 Android 17 全新内存限制,有没有“豁免”后门?
android·前端·flutter
Hyyy6 小时前
理解LLM的基本工作原理:预训练、微调、推理的区别
前端
Gatlin6 小时前
前端逆向与反逆向:一场猫鼠游戏的底层逻辑与实战
前端
Pedantic6 小时前
本地通知(Local Notifications)学习笔记
前端
森蓝情丶7 小时前
我给 AI 搭了个法庭:一个前端仔的 LangGraph 实战全记录
前端·后端
爱勇宝7 小时前
干了近 8 年,一夜之间被裁:AI 时代,程序员最该害怕的不是 AI
前端·后端·程序员