增值税发票识别
百度 官方文档
识别并结构化返回增值税发票的各个字段及其对应值,包含了发票基础信息9项,货物相关信息12项,购买方/销售方的名称、识别号、地址电话、开户行及账号,共29项结构化字段
基本说明:
接口地址:https://aip.baidubce.com/rest/2.0/ocr/v1/vat_invoice
返回格式:json
请求方式:post
请求示例:https://aip.baidubce.com/rest/2.0/ocr/v1/vat_invoice?access_token=test
请求参数说明:
名称 类型 必填 说明
image string 必填 图像数据,base64编码后进行urlencode,要求base64编码和urlencode后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/png/bmp格式
accuracy string 选填 normal(默认配置)对应普通精度模型,识别速度较快,在四要素的准确率上和high模型保持一致,high对应高精度识别模型,相应的时延会增加,因为超时导致失败的情况也会增加(错误码282000)
返回参数说明:
名称 类型 说明
log_id uint64 唯一的log id,用于问题定位
words_result_num uint32 识别结果数,表示words_result的元素个数
words_result array() 识别结果数组
InvoiceType string 发票种类名称
InvoiceCode uint32 发票代码
InvoiceNum uint32 发票号码
InvoiceDate uint32 开票日期
TotalAmount uint32 合计金额
TotalTax string 合计税额
AmountInFiguers array() 价税合计(小写)
AmountInWords object 价税合计(大写)
CheckCode string 校验码
SellerName uint32 销售方名称
SellerRegisterNum uint32 销售方纳税人识别号
PurchaserName uint32 购方名称
PurchaserRegisterNum uint32 购方纳税人识别号
CommodityName object[] 货物名称
-row uint32 行号
-word string 内容
CommodityType object[] 规格型号
-row uint32 行号
-word string 内容
CommodityUnit object[] 单位
-row uint32 行号
-word string 内容
CommodityNum object[] 数量
-row uint32 行号
-word string 内容
CommodityPrice object[] 单价
-row uint32 行号
-word string 内容
CommodityAmount object[] 金额
-row uint32 行号
-word string 内容
CommodityTaxRate object[] 税率
-row uint32 行号
-word string 内容
CommodityTax object[] 税额
-row uint32 行号
-word string 内容
JSON返回示例:
{
	"log_id": "5425496231209218858",
	"words_result_num": 29,
	"words_result": {
		"InvoiceNum": "14641426",
		"SellerName": "上海易火广告传媒有限公司",
		"CommodityTaxRate": [{
			"word": "6%",
			"row": "1"
		}],
		"SellerBank": "中国银行南翔支行446863841354",
		"Checker": ":沈园园",
		"TotalAmount": "94339.62",
		"CommodityAmount": [{
			"word": "94339.62",
			"row": "1"
		}],
		"InvoiceDate": "2016年06月02日",
		"CommodityTax": [{
			"word": "5660.38",
			"row": "1"
		}],
		"PurchaserName": "百度时代网络技术(北京)有限公司",
		"CommodityNum": [{
			"word": "",
			"row": "1"
		}],
		"PurchaserBank": "招商银行北京分行大屯路支行8661820285100030",
		"Remarks": "告传",
		"Password": "074/45781873408>/6>8>65*887676033/51+<5415>9/32--852>1+29<65>641-5>66<500>87/*-34<943359034>716905113*4242>",
		"SellerAddress": ":嘉定区胜辛南路500号15幢1161室55033753",
		"PurchaserAddress": "北京市海淀区东北旺西路8号中关村软件园17号楼二属A2010-59108001",
		"InvoiceCode": "3100153130",
		"CommodityUnit": [{
			"word": "",
			"row": "1"
		}],
		"Payee": ":徐蓉",
		"PurchaserRegisterNum": "110108787751579",
		"CommodityPrice": [{
			"word": "",
			"row": "1"
		}],
		"NoteDrawer": "沈园园",
		"AmountInWords": "壹拾万圆整",
		"AmountInFiguers": "100000.00",
		"TotalTax": "5660.38",
		"InvoiceType": "专用发票",
		"SellerRegisterNum": "913101140659591751",
		"CommodityName": [{
			"word": "信息服务费",
			"row": "1"
		}],
		"CommodityType": [{
			"word": "",
			"row": "1"
		}]
	}
}
服务级错误码参照
错误码 说明
1 服务器内部错误,请再次请求, 如果持续出现此类错误,请在控制台提交工单联系技术支持团队
2 服务暂不可用,请再次请求, 如果持续出现此类错误,请在控制台提交工单联系技术支持团队
3 调用的API不存在,请检查后重新尝试
4 集群超限额
6 无权限访问该用户数据
14 IAM鉴权失败,建议用户参照文档自查生成sign的方式是否正确,或换用控制台中ak sk的方式调用
17 每天请求量超限额
18 QPS超限额
19 请求总量超限额
100 无效的access_token参数,请检查后重新尝试
110 access_token无效
111 access token过期
282000 服务器内部错误,如果您使用的是高精度接口,报这个错误码的原因可能是您上传的图片中文字过多,识别超时导致的,建议您对图片进行切割后再识别,其他情况请再次请求, 如果持续出现此类错误,请在控制台提交工单联系技术支持团队
216100 请求中包含非法参数,请检查后重新尝试
216101 缺少必须的参数,请检查参数是否有遗漏
216102 请求了不支持的服务,请检查调用的url
216103 请求中某些参数过长,请检查后重新尝试
216110 appid不存在,请重新核对信息是否为后台应用列表中的appid
216200 图片为空,请检查后重新尝试
216201 上传的图片格式错误,现阶段我们支持的图片格式为:PNG、JPG、JPEG、BMP,请进行转码或更换图片
216202 上传的图片大小错误,现阶段我们支持的图片大小为:base64编码后小于4M,分辨率不高于4096*4096,请重新上传图片
216630 识别错误,请再次请求,如果持续出现此类错误,请在控制台提交工单联系技术支持团队
216631 识别银行卡错误,出现此问题的原因一般为:您上传的图片非银行卡正面,上传了异形卡的图片或上传的银行卡正品图片不完整
216633 识别身份证错误,出现此问题的原因一般为:您上传了非身份证图片或您上传的身份证图片不完整
216634 检测错误,请再次请求,如果持续出现此类错误,请在控制台提交工单联系技术支持团队
272000 未能匹配模板,请检查参照字段的设置是否符合规范,并重新选取或增加更多的参照字段
272001 未能成功分类
282003 请求参数缺失
282004 您指定的模板暂未发布,请先保存发布该模板,再调用
282005 处理批量任务时发生部分或全部错误,请根据具体错误码排查
282006 批量任务处理数量超出限制,请将任务数量减少到10或10以下
282102 未检测到图片中识别目标,请确保图片中包含对应卡证票据
282103 图片目标识别错误,请确保图片中包含对应卡证票据,如果持续出现此类错误,请在控制台提交工单联系技术支持团队
282110 URL参数不存在,请核对URL后再次提交
282111 URL格式非法,请检查url格式是否符合相应接口的入参要求
282112 url下载超时,请检查url对应的图床/图片无法下载或链路状况不好,您可以重新尝试一下,如果多次尝试后仍不行,建议更换图片地址
282113 URL返回无效参数
282114 URL长度超过1024字节或为0
282808 request id xxxxx 不存在
282809 返回结果请求错误(不属于excel或json)
282810 图像识别错误
完整教学代码示例
<?php
/**
 * Created by PhpStorm.
 * User: FZS
 * Time: 2019/3/13 17:10
 */
//----------------------------------
// 百度增值税发票识别调用类
//----------------------------------
class freeApi{
    private $apiKey = false; //百度应用AppID
    private $secretKey = false; //百度应用API Key
    private $tokenUrl = 'https://aip.baidubce.com/oauth/2.0/token';
    private $apiUrl = 'https://aip.baidubce.com/rest/2.0/ocr/v1/vat_invoice';
    public function __construct($apikey,$secretkey){
        $this->apiKey = $apikey;
        $this->secretKey = $secretkey;
    }
    /**
     * 获取token
     * @return array
     */
    public function getToken(){
        $params = [
            'grant_type' => 'client_credentials',
            'client_id'  => $this->apiKey,
            'client_secret' => $this->secretKey,
        ];
        $params = $this->handleUrl($params);
        return $this->returnArray($this->freeApiCurl($this->tokenUrl,$params,1));
    }
    /**
     * url拼接
     * @return string
     */
    private function handleUrl($params){
        $o = "";
        foreach ( $params as $k => $v )
        {
            $o.= "$k=" . urlencode( $v ). "&" ;
        }
        $params = substr($o,0,-1);
        return $params;
    }
    /**
     * 将JSON内容转为数据,并返回
     * @param string $content [内容]
     * @return array
     */
    public function returnArray($content){
        return json_decode($content,true);
    }
    /**
     * 获取增值税发票证识别结果
     * @return array
     */
    public function getResult(){
        $params = [
            'image' => base64_encode(file_get_contents('图片路径')),
        ];
        return $this->returnArray($this->freeApiCurl($this->apiUrl.'?access_token='.$this->getToken()['access_token'],$params,1));
    }
    /**
     * 请求接口返回内容
     * @param  string $url [请求的URL地址]
     * @param  string $params [请求的参数]
     * @param  int $ipost [是否采用POST形式]
     * @return  string
     */
    public function freeApiCurl($url,$params=false,$ispost=0){
        $httpInfo = array();
        $ch = curl_init();
        curl_setopt( $ch, CURLOPT_HTTP_VERSION , CURL_HTTP_VERSION_1_1 );
        curl_setopt( $ch, CURLOPT_HTTP_VERSION , CURL_HTTP_VERSION_1_1 );
        curl_setopt( $ch, CURLOPT_USERAGENT , 'free-api' );
        curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT , 60 );
        curl_setopt( $ch, CURLOPT_TIMEOUT , 60);
        curl_setopt( $ch, CURLOPT_RETURNTRANSFER , true );
        if( $ispost )
        {
            curl_setopt( $ch , CURLOPT_POST , true );
            curl_setopt( $ch , CURLOPT_POSTFIELDS , $params );
            curl_setopt( $ch , CURLOPT_URL , $url );
        }
        else
        {
            if($params){
                curl_setopt( $ch , CURLOPT_URL , $url.'?'.$params );
            }else{
                curl_setopt( $ch , CURLOPT_URL , $url);
            }
        }
        $response = curl_exec( $ch );
        if ($response === FALSE) {
            return false;
        }
        $httpCode = curl_getinfo( $ch , CURLINFO_HTTP_CODE );
        $httpInfo = array_merge( $httpInfo , curl_getinfo( $ch ) );
        curl_close( $ch );
        return $response;
    }
}