uniapp 百度ocr身份证识别-------兼容H5和小程序

要用百度ocr,就要先注册百度云,步骤如下。
1.注册百度云
2.进入百度云点击控制台
3.点击左侧菜单栏 文字识别 点击创建应用
uniapp 百度ocr身份证识别-------兼容H5和小程序_第1张图片
4.点击创建应用,应用名称可以自己随意创建,文字识别包名根据自己需求选择需要还是不需要(我是uniapp,选择的不需要)
5.然后可以在应用管理查看自己建立的应用,里面有API Key和Secret Key,用于请求access_token。
6.然后就根据自己需要的识别功能的api 调用接口
封装请求


// 配置公共的URL路径
const Host = "https://aip.baidubce.com/";
// const Host = "/api"


const http = (params) => {

  //返回promise 对象
  return new Promise((resolve, reject) => {
    uni.request({
      // 服务器url+参数中携带的接口具体地址
      url:Host+params.url,
      // 请求参数
      data: params.data,
      // 设置后端需要的常用的格式就好,特殊情况调用的时候单独设置
      header: params.header || {
        "Content-Type": "application/json;charset=utf-8",
        "api-version": params.apiVersion ||'1.0'
      },
	  // "Authorization": token
      // 默认为GET,可以不写,如常用请求格式为POST,可以设置POST为默认请求方式
      method: params.method && params.method.toUpperCase() || 'POST',
      dataType: params.dataType,//返回的数据格式,默认为JSON,特殊格式可以在调用的时候传入参数
      responseType: params.responseType,//响应的数据类型
      success: res => {
        // 接口访问正常返回数据
        if ((res.statusCode == 200 && res.data.code === 200)||res.data.code === 401) {
          //1. 操作成功返回数据
          resolve(res.data)
        } else {
          //2. 操作不成功返回数据,以toast方式弹出响应信息,如后端未格式化非操作成功异常信息,则可以统一定义异常提示
		  if(res.data.code === 503){
            uni.showToast({
              icon: "none",
              title: "系统异常",
              duration:3000
            })   
          }else{
			  if(res.data.msg){
			    uni.showToast({
			      icon: "none",
			      title: res.data.msg,
                  duration:3000
			    })
			  }
		  }
		  resolve(res.data)
        }
      },
      fail: function (e) {
        if(e.errMsg === "request:fail timeout"){
          uni.showToast({
            icon: "none",
            title: "网络连接超时,请稍后重试"
          })
        }
        reject(e);
        setTimeout(() =>{
          uni.hideLoading();
        }, 1500)
      },
      complete(e){
        resolve(e)
      }
    })
  })
}

module.exports = {
  httpRequest: http
}

写接口方法

import {httpRequest} from '../http.js'
let url = {
	// 获取token
	getToken:'oauth/2.0/token',
	idCard:'rest/2.0/ocr/v1/idcard',
}

module.exports = {
	getTokenR(params){
		return httpRequest({
			url:`${url.getToken}?grant_type=client_credentials&client_id=7uermpcxy2CEmG8P3AbDlaIm&client_secret=tUCe8ks6YfFhegA6vH7MPUg0510nv0R9`
		})
	},
	getMessage(params){
		return httpRequest({
			url:`${url.idCard}?access_token=${params.access_token}`,
			data:params.data,
			header:{
				"Content-Type":"application/x-www-form-urlencoded"
			}
		})
	}
 }

编写页面调用接口

<template>
	<view class="content">
        <button @click='choosePicture'>选择图片</button>
		<view v-if='showImg' style="width: 100%;height: 120px;">
			<image  v-for='item of chooseImgList' :src='item' class='chooseImg'></image>
		</view>
		<button @click='scan'>扫一扫</button>
		<text style="margin:20px;">扫描结果:{{res}}</text>
	    <button @click='idCard'>上传身份证(正面)</button>
		<view class='idCardMessage'>
			<view>姓名:{{idCardMessageObj.name}}</view>
			<view>性别:{{idCardMessageObj.sex}}</view>
			<view>民族:{{idCardMessageObj.nation}}</view>
			<view>出生:{{idCardMessageObj.born}}</view>
			<view>住址:{{idCardMessageObj.address}}</view>
			<view>身份证号:{{idCardMessageObj.idNum}}</view>
		</view>
	</view>
</template>

<script>
	import {getTokenR,getMessage} from '@/api/index/index.js'
	import { pathToBase64, base64ToPath } from '@/component/image-tools/index.js'
	export default {
		data() {
			return {
				title: 'Hello',
				chooseImg:"",
				showImg:false,
				chooseImgList:[],
				picSrc:"",
				showIdCard:'',
				res:"",
				idCardMessageObj:{
					name:"",
					sex:"",
					nation:"",
					born:"",
					address:"",
					idNum:""
				}
			}
		},
		onLoad() {

		},
		methods: {
          choosePicture(){
			  uni.showLoading({
			    title: "上传中...",
			    mask: true
			  })
			  const that=this
			return  new Promise((resolve,reject)=>{
				  uni.chooseImage({
				  				  count:9,
								  sizeType: ['compressed'],
				  				  success:function(e){
				  					  that.chooseImgList=e.tempFilePaths
				  					  that.showImg=true;
									  uni.hideLoading();
				  					  resolve(e)
				  				  },
				  				  fail:function(e){
				  					  console.log('失败:',e)
				  				  }
				  })
			})
		  },
		  scan(){
			   const that=this
		      uni.scanCode({
				  success:function(result){
					  that.res=result.result
					  console.log('成功',result.result)
				  },
				  fail:function(res){
					  that.res=res
					  console.log(res)
				  }
			 })
		  },
		  idCard(){
			  this.myToken()
		  },
		  // 获取token
		  myToken(){
			 this.choosePicture().then(res=>{
				 uni.showLoading({
				   title: "识别中...",
				   mask: true
				 })
				 const pic=res.tempFilePaths[0]	
				let base64String
				 // data:image/png;base64,
				// #ifdef MP-WEIXIN
				  console.log('小程序')
				   base64String = `${wx.getFileSystemManager().readFileSync(pic, "base64")}`;
			    // #endif
				   // #ifdef H5
				   console.log('H5')
					 pathToBase64(pic)
					   .then(base64 => {
						   base64=base64.slice(23)
						   base64String=base64
					   })
					   .catch(error => {
						 console.error(error)
					   })
				   // #endif
				 getTokenR().then(res=>{
				 				  const params={
				 					  access_token:res.access_token,
									  data:{
										 image: base64String,
										 id_card_side: 'front'
									  }
				 				  }
				 				  getMessage(params).then(r=>{
									  uni.hideLoading();
									  this.idCardMessageObj={
										  name:r.words_result.姓名.words,
										  sex:r.words_result.性别.words,
										  nation:r.words_result.民族.words,
										  born:r.words_result.出生.words,
										  address:r.words_result.住址.words,
										  idNum:r.words_result.公民身份号码.words,
									  }
									  // console.log(this.idCardMessageObj)
									  console.log(r)
								  })
				 })
			 })
		  }
	  }
	}
</script>

<style>
   .content{}
   .chooseImg{width: 100px;height:100px;display: inline-block;margin: 10px;float: left;}
.idCardMessage{width: 100%;padding: 20px;box-sizing: border-box;}
.idCardMessage view{width: 100%;min-height: 30px;line-height:30px;}
</style>

这有一个组件将绝对路径图片转为base64位

function getLocalFilePath(path) {
    if (path.indexOf('_www') === 0 || path.indexOf('_doc') === 0 || path.indexOf('_documents') === 0 || path.indexOf('_downloads') === 0) {
        return path
    }
    if (path.indexOf('file://') === 0) {
        return path
    }
    if (path.indexOf('/storage/emulated/0/') === 0) {
        return path
    }
    if (path.indexOf('/') === 0) {
        var localFilePath = plus.io.convertAbsoluteFileSystem(path)
        if (localFilePath !== path) {
            return localFilePath
        } else {
            path = path.substr(1)
        }
    }
    return '_www/' + path
}

export function pathToBase64(path) {
    return new Promise(function(resolve, reject) {
        if (typeof window === 'object' && 'document' in window) {
            if (typeof FileReader === 'function') {
                var xhr = new XMLHttpRequest()
                xhr.open('GET', path, true)
                xhr.responseType = 'blob'
                xhr.onload = function() {
                    if (this.status === 200) {
                        let fileReader = new FileReader()
                        fileReader.onload = function(e) {
                            resolve(e.target.result)
                        }
                        fileReader.onerror = reject
                        fileReader.readAsDataURL(this.response)
                    }
                }
                xhr.onerror = reject
                xhr.send()
                return
            }
            var canvas = document.createElement('canvas')
            var c2x = canvas.getContext('2d')
            var img = new Image
            img.onload = function() {
                canvas.width = img.width
                canvas.height = img.height
                c2x.drawImage(img, 0, 0)
                resolve(canvas.toDataURL())
                canvas.height = canvas.width = 0
            }
            img.onerror = reject
            img.src = path
            return
        }
        if (typeof plus === 'object') {
            plus.io.resolveLocalFileSystemURL(getLocalFilePath(path), function(entry) {
                entry.file(function(file) {
                    var fileReader = new plus.io.FileReader()
                    fileReader.onload = function(data) {
                        resolve(data.target.result)
                    }
                    fileReader.onerror = function(error) {
                        reject(error)
                    }
                    fileReader.readAsDataURL(file)
                }, function(error) {
                    reject(error)
                })
            }, function(error) {
                reject(error)
            })
            return
        }
        if (typeof wx === 'object' && wx.canIUse('getFileSystemManager')) {
            wx.getFileSystemManager().readFile({
                filePath: path,
                encoding: 'base64',
                success: function(res) {
                    resolve('data:image/png;base64,' + res.data)
                },
                fail: function(error) {
                    reject(error)
                }
            })
            return
        }
        reject(new Error('not support'))
    })
}

值得注意的是H5请求跨域就开启代理,小程序不需要

你可能感兴趣的:(uniapp 百度ocr身份证识别-------兼容H5和小程序)