一文解决微信小程序OCR识别API接口调用实现

本文涉及的产品
票证核验,票证核验 50次/账号
自定义KV模板,自定义KV模板 500次/账号
OCR统一识别,每月200次
简介: 一文解决微信小程序OCR识别API接口调用实现

服务端调用微信小程序OCR识别接口实现

一 开发环境

后端语言 java

技术工具框架 springboot

二 实现目的

本demo适用于快速服务端调用微信小程序OCR接口实现,以行驶证接口为例

包括

  1. 图片上传
  2. 调用微信小程序接口实现OCR识别
  3. swagger3 集成调用 去除不必要的 - - 简单实用,详细查看openapi文档

三 Demo上线

  1. 搭建我们的基础环境

目录结构如下


  • pom文件配置
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.7.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
  </parent>
  <groupId>com.example</groupId>
  <artifactId>demo</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>demo</name>
  <description>Demo project for Spring Boot</description>
  <properties>
    <java.version>1.8</java.version>
  </properties>
  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
  • 集成swagger3

官网下载swagger,将dist目录放入Resource-static下,修改dist为swagger3

打开目录下index.html,修改为

const ui = SwaggerUIBundle({
        url: "swagger.json",
        dom_id: '#swagger-ui',
        deepLinking: true,
        presets: [
          SwaggerUIBundle.presets.apis,
          SwaggerUIStandalonePreset
        ],
        plugins: [
          SwaggerUIBundle.plugins.DownloadUrl
        ],
        layout: "StandaloneLayout"
      })
      // End Swagger UI call region
      window.ui = ui

官网打开petstore.swagger.io/v...,模板json…

{
  "swagger": "2.0",
  "info": {
    "title": "小程序服务端demo",
    "description": "本文档为,小程序服务端接口描述文档swagger页面",
    "version": "1.0.0"
  },
  "tags": [
    {
      "name": "小程序后端服务",
      "description": "此服务提供小程序访问后端系统的业务实现."
    }
  ],
  "schemes": [
    "http"
  ],
  "paths": {
    "/api/vehicle/upload-vehicle": {
      "post": {
        "tags": [
          "小程序后端服务"
        ],
        "summary": "行驶证照片上传接口",
        "description": "行驶证照片上传接口",
        "operationId": "uploadFile",
        "consumes": [
  • application启动类添加Feign调用注解
@SpringBootApplication
@EnableFeignClients
public class DemoApplication {
  public static void main(String[] args) {
    SpringApplication.run(DemoApplication.class, args);
  }
}
  • 配置全局文件 application.yml (properties修改为yml即可)
#服务配置
server:
  port: 8890
  compression:
    enabled: true
  max-http-header-size: 10000000
spring:
  application:
    name: ocr-demo
#外部调用
app:
  vehicle: "https://api.weixin.qq.com"

至此,我们的基础环境细致的讲解完毕,且完整基础环境搭建完整,骚年们,开始代码!!!!

  1. 通用返回dto编写
package com.example.demo.common.dto;
import java.io.Serializable;
import java.util.LinkedList;
import java.util.List;
import java.util.Objects;
/**
 * 通用接口返回结果.
 *
 * @author : 小隐乐乐
 * @since : 2022/4/11 9:44
 */
public class RestControllerResult<T> implements Serializable {
  private static final long serialVersionUID = -3698136820012767666L;
  private Boolean success;
  private Integer code;
  private List<String> infoMsgs = new LinkedList<>();
  private List<String> warningMsgs = new LinkedList<>();
  private String errorMsg;
  private T data;
  public RestControllerResult() {
  }
  public RestControllerResult(T t) {
    this.data = t;
  }
  public Boolean getSuccess() {
    return this.success;
  }
  public void setSuccess(Boolean success) {
    this.success = success;
  }
  public Integer getCode() {
    return this.code;
  }
  public void setCode(int code) {
    this.code = code;
  }
  public List<String> getInfoMsgs() {
    return this.infoMsgs;
  }
  public void setInfoMsgs(List<String> infoMsgs) {
    this.infoMsgs = infoMsgs;
  }
  public List<String> getWarningMsgs() {
    return this.warningMsgs;
  }
  public void setWarningMsgs(List<String> warningMsgs) {
    this.warningMsgs = warningMsgs;
  }
  public String getErrorMsg() {
    return this.errorMsg;
  }
  public void setErrorMsg(String errorMsg) {
    this.errorMsg = errorMsg;
  }
  public T getData() {
    return this.data;
  }
  public void setData(T data) {
    this.data = data;
  }
  public static <T> RestControllerResult<T> success(T data) {
    RestControllerResult result = new RestControllerResult(data);
    result.setSuccess(true);
    return result;
  }
  @Override
  public boolean equals(Object o) {
    if (this == o) {
      return true;
    } else if (o != null && this.getClass() == o.getClass()) {
      RestControllerResult<?> that = (RestControllerResult) o;
      return this.code.equals(that.code) && Objects.equals(this.success, that.success) && Objects
          .equals(this.infoMsgs, that.infoMsgs) && Objects
          .equals(this.warningMsgs, that.warningMsgs) && Objects
          .equals(this.errorMsg, that.errorMsg) && Objects.equals(this.data, that.data);
    } else {
      return false;
    }
  }
  @Override
  public int hashCode() {
    return Objects.hash(
        new Object[]{this.success, this.code, this.infoMsgs, this.warningMsgs, this.errorMsg,
            this.data});
  }
  @Override
  public String toString() {
    StringBuilder sb = new StringBuilder("RestControllerResult{");
    sb.append("success=").append(this.success);
    sb.append(", code=").append(this.code);
    sb.append(", infoMsgs=").append(this.infoMsgs);
    sb.append(", warningMsgs=").append(this.warningMsgs);
    sb.append(", errorMsg='").append(this.errorMsg).append(''');
    sb.append(", data=").append(this.data);
    sb.append('}');
    return sb.toString();
  }
}
  1. controller层编写(分为api-controller)

api

package com.example.demo.api;
import com.example.demo.common.dto.RestControllerResult;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
/**
 * 小程序请求后端系统Api.
 *
 * @author : 小隐乐乐
 * @since : 2022/4/11 9:50
 */
@RestController
@RequestMapping("/api/vehicle")
public interface AppVehicleMiniApi {
  /**
   * 上传行驶证照片.
   *
   * @param img 图片
   * @return result
   */
  @PostMapping("upload-vehicle")
  RestControllerResult uploadVehicle(@RequestParam("file") MultipartFile img);
}

controller

package com.example.demo.controller;
import com.alibaba.fastjson.JSONObject;
import com.example.demo.api.AppVehicleMiniApi;
import com.example.demo.common.dto.RestControllerResult;
import com.example.demo.service.AppVehicleService;
import javax.annotation.Resource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
/**
 * 小程序请求后端系统完成功能Controller.
 *
 * @author : 小隐乐乐
 * @since : 2022/4/11 9:44
 */
@RestController
public class AppVehicleMiniApiController implements AppVehicleMiniApi {
  private static final Logger logger = LoggerFactory.getLogger(AppVehicleMiniApiController.class);
  private static final String IMG_EMPTY = "上传照片为空";
  @Resource
  private AppVehicleService appVehicleService;
  @Override
  public RestControllerResult uploadVehicle(MultipartFile img) {
    logger.info("=======>行驶证上传<=======");
    RestControllerResult resultsDtoRestControllerResult = new RestControllerResult<>();
    if (img.isEmpty()) {
      logger.error(IMG_EMPTY);
      resultsDtoRestControllerResult.setSuccess(false);
      resultsDtoRestControllerResult.setCode(400);
      resultsDtoRestControllerResult.setErrorMsg(IMG_EMPTY);
      return resultsDtoRestControllerResult;
    }
    System.out.println(JSONObject.toJSONString(appVehicleService.ocrVehilce(img)));
    resultsDtoRestControllerResult.setSuccess(true);
    resultsDtoRestControllerResult.setCode(200);
    resultsDtoRestControllerResult.setData(appVehicleService.ocrVehilce(img));
    return resultsDtoRestControllerResult;
  }
}

3.service实现

package com.example.demo.service;
import org.springframework.web.multipart.MultipartFile;
/**
 * 行驶证图片上传服务接口.
 *
 * @author : 小隐乐乐
 * @since : 2022/4/11 9:50
 */
public interface AppVehicleService {
  /**
   * 识别行驶证.
   *
   * @param img 上传图片
   * @return 识别结果
   */
  Object ocrVehilce(MultipartFile img);
}
package com.example.demo.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.example.demo.feign.AppVehicleFeign;
import com.example.demo.service.AppVehicleService;
import java.util.Map;
import javax.annotation.Resource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
/**
 * 行驶证照片服务.
 *
 * @author : 小隐乐乐
 * @since : 2022/4/11 9:50
 */
@Service
public class AppVehicleServiceImpl implements AppVehicleService {
  private static final Logger logger = LoggerFactory.getLogger(AppVehicleServiceImpl.class);
  @Resource
  private AppVehicleFeign appVehicleFeign;
  @Override
  public Object ocrVehilce(MultipartFile img) {
    Object value = appVehicleFeign.getWeiXinToken();
    String s = JSONObject.toJSONString(value);
    Map<String, Object> map = (Map<String, Object>)JSONObject.parse(s);
    Object token = "";
    if (map.get("access_token") != null) {
      logger.info("最终token为" + map.get("access_token"));
      token = map.get("access_token");
    } else {
      //返回失败结果
      logger.error("微信接口服务获取token发生错误,错误代码 " + map.get("errcode"));
      logger.error("微信接口服务获取token发生错误,错误信息 " + map.get("errmsg"));
    }
    return appVehicleFeign.ocrVehicle(img,token.toString());
  }
}

4.重点戏:Feign调用实现

package com.example.demo.feign;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.multipart.MultipartFile;
/**
 * 行驶证处理feign.
 *
 * @author : 小隐乐乐
 * @since : 2022/4/11 9:50
 */
@FeignClient(value = "vehicle", fallbackFactory = AppVehicleFeignFactory.class, url = "${app.vehicle}")
public interface AppVehicleFeign {
  /**
   * 获取微信token.
   *
   * @return token
   */
  @GetMapping("/cgi-bin/token?grant_type=client_credential&appid=[小程序开发id]&secret=[微信密钥]")
  Object getWeiXinToken();
  /**
   * 识别行驶证.
   *
   * @param img 照片
   * @param token token
   * @return 识别结果
   */
  @PostMapping(value = "/cv/ocr/driving?type=photo&access_token={token}",consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
  Object ocrVehicle(@RequestPart(value = "file") MultipartFile img,
      @PathVariable(name = "token") String token);
}
package com.example.demo.feign;
import feign.hystrix.FallbackFactory;
/**
 * 行驶证feign工厂.
 *
 * @author : 小隐乐乐
 * @since : 2022/4/11 9:50
 */
public class AppVehicleFeignFactory implements FallbackFactory<AppVehicleFeign> {
  @Override
  public AppVehicleFeign create(Throwable throwable) {
    return null;
  }
}

终于可以愉快地测试了!!!!!

启动应用,访问地址 http://localhost:8890/swagger3/index.html

image.png

干净、简洁、明了

点击上传接口,try it out,选择行驶证照片,执行

image.png

目录
相关文章
|
3月前
|
监控 小程序 安全
小程序的 API 做了什么处理,能够做到全局变量的隐藏
【10月更文挑战第23天】小程序的 API 通过运行环境隔离、作用域限制、数据绑定机制、事件机制、状态管理、代码封装和模块化、安全策略和权限控制以及运行时监控和检测等多种手段来实现全局变量的隐藏。这些措施共同作用,确保了小程序的安全、稳定和可靠运行,同时也提高了开发效率和代码质量。
|
4月前
|
JSON 文字识别 小程序
微信小程序OCR插件,实现身份证、行驶证、银行卡、营业执照和驾驶证等识别
微信小程序OCR插件,实现身份证、行驶证、银行卡、营业执照和驾驶证等识别
499 0
|
5月前
|
小程序 前端开发 API
微信小程序 - 调用微信 API 回调函数内拿不到 this 问题(解决方案)
本文讨论了在微信小程序中调用API回调函数时无法获取到`this`上下文的问题,并提供了解决方案。在回调函数中,使用一个变量(如`that`)来保存当前的`this`引用,然后在回调内部使用这个变量来访问当前页面的数据和方法。
|
6月前
|
Web App开发 缓存 小程序
【Azure API 管理】从微信小程序访问APIM出现200空响应的问题中发现CORS的属性[terminate-unmatched-request]功能
【Azure API 管理】从微信小程序访问APIM出现200空响应的问题中发现CORS的属性[terminate-unmatched-request]功能
|
6月前
|
移动开发 开发框架 小程序
开发H5程序或者小程序的时候,后端Web API项目在IISExpress调试中使用IP地址,便于开发调试
开发H5程序或者小程序的时候,后端Web API项目在IISExpress调试中使用IP地址,便于开发调试
|
7月前
|
文字识别 小程序 安全
印刷文字识别操作报错合集之微信小程序调用API时路径总是返回不对,该如何处理
在使用印刷文字识别(OCR)服务时,可能会遇到各种错误。例如:1.Java异常、2.配置文件错误、3.服务未开通、4.HTTP错误码、5.权限问题(403 Forbidden)、6.调用拒绝(Refused)、7.智能纠错问题、8.图片质量或格式问题,以下是一些常见错误及其可能的原因和解决方案的合集。
|
7月前
|
前端开发 小程序 API
【微信小程序】使用 Promise、async 和 await 将异步API 改写为同步
【微信小程序】使用 Promise、async 和 await 将异步API 改写为同步
138 0
|
7月前
|
小程序 API
微信小程序getLocation报错 getLocation:fail the api need to be declared in the requiredPrivateInfos field in
微信小程序getLocation报错 getLocation:fail the api need to be declared in the requiredPrivateInfos field in
467 1
|
8月前
|
文字识别 小程序 算法
视觉智能开放平台产品使用合集之通过小程序接入视觉智能开放平台API能力,不是上海地域的OSS链接,该怎么办
视觉智能开放平台是指提供一系列基于视觉识别技术的API和服务的平台,这些服务通常包括图像识别、人脸识别、物体检测、文字识别、场景理解等。企业或开发者可以通过调用这些API,快速将视觉智能功能集成到自己的应用或服务中,而无需从零开始研发相关算法和技术。以下是一些常见的视觉智能开放平台产品及其应用场景的概览。
|
8月前
|
API 开发工具
企业微信api接口调用-触发企业微信推送会话列表
企业微信api接口调用-触发企业微信推送会话列表

热门文章

最新文章