增值税发票查验
使用说明
统一接口版本号 v2
八戒财税提供全国增值税发票查验接口,支持的发票类型:
发票类型 | 发票类型代码 |
---|---|
增值税专用发票 | 01 |
货物运输业增值税专用发票 | 02 |
机动车销售统一发票 | 03 |
增值税普通发票 | 04 |
增值税电子专用发票 | 08 |
增值税电子普通发票 | 10 |
增值税普通发票(卷票) | 11 |
增值税电子普通发票(通行费) | 14 |
二手车销售统一发票 | 15 |
全电发票类型 | 发票类型代码 |
---|---|
电子发票(普通发票) | 21 |
电子发票(增值税专用发票) | 20 |
铁路电子客票 | 83 |
航空运输电子客票行程单 | 61 |
可通过发票代码获取当前发票类型,参考根据发票代码判断发票类型
查验参数对应发票位置说明(不同发票校验码位置可能差异):参考发票查验参数对应图解
接口列表和资费
接口通常分为3步:
- 预处理:参数校验、OCR识别发票图片、解析发票二维码等
- 发票查验:同步查询官方平台信息
- 格式化数据:返回格式化数据结果,提供额外的信息如官方截图
TIP
接口响应结果返回success: true
才计费
不同接口单次请求成功消耗的资源点数不同,具体如下
接口路径 | 消耗资源点 | 功能 | 描述 |
---|---|---|---|
/v2/invoice/query | 1 | 基础查验 | 基础查验结果 |
/v2/invoice/qrcode | 1 | 二维码发票查验 | 通过二维码字符串,返回基础查验结果 |
/v2/invoice/ocr | 混贴发票识别 1 否则 0.5 | OCR 发票查验 | OCR 结果+查验失败提示 |
/v2/invoice/ocr | 混贴发票识别 2 否则 1.5 | OCR 发票查验 | OCR 结果+基础查验结果 |
/v2/invoice/pdf | 1.5 | PDF,OFD 电子发票查验 | 基础查验结果 |
基础查验
参数名称 | 类型 | 必选 | 描述 |
---|---|---|---|
fpdm | String | 根据发票类型决定 | 发票代码(当发票种类是全电发票时不填,其他类型发票必填) |
fphm | String | 是 | 发票号码 |
kprq | String | 是 | 开票日期,建议格式YYYYMMDD |
checkCode | String | 根据发票类型决定 | 校验码:当发票种类是"04"(普票)、"10"(电子票)、"11"(卷式发票)、"14"(通行费)时,校验码后6位必传,其他类型发票可以不传 |
noTaxAmount | String | 不含税金额/车价合计:当发票种类是"01"(增值税专用发票)、"02"(货物运输业增值税专用发票)、"03"(机动车销售统一发票)、"08"(增值税电子专用发票)、"15"(二手车销售统一发票)时必传,其他类型发票可以不传 | |
jshj | String | 价税合计:当发票种类是全电发票【电子发票(普通发票)、电子发票(增值税专用发票)、铁路电子客票、航空运输电子客票行程单】时必传,其他类型发票可以不传 |
当发票号码为 20 位数字时,为全电发票。 发票类型参考
二维码发票查验
参数名称 | 类型 | 必选 | 描述 |
---|---|---|---|
code | String | 是 | 发票二维码解析后字符串 |
字符串格式:01,10,051001700111,45226924,39.57,20180506,72967695763208703577,621B,
注意:卷票等二维码信息不完整,通过此接口会提示参数错误
OCR发票查验
参数名称 | 类型 | 必选 | 描述 |
---|---|---|---|
img | String | 2选1 | 将发票图片或pdf转换为Base64编码字符串,不包含前缀data:image/jpg;base64, |
url | String | 发票图片或pdf链接地址,如:https://exmaple.com/img.jpg | |
extType | Boolean | 可选 | 是否混贴发票识别,发票覆盖增值税发票专票、普票和电子发票、增值税发票卷票、机动车发票等各类常见票据,不使用混贴发票识别不传或传false |
图片大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/png/bmp格式
PDF,OFD电子发票查验
参数名称 | 类型 | 必选 | 描述 |
---|---|---|---|
pdfBase64 | String | 2选1 | 将PDF/ODF文件转换为Base64编码字符串,不包含前缀data:image/jpg;base64, |
pdfUrl | String | PDF/ODF电子发票链接地址,如:https://exmaple.com/pdf.pdf |
PDF大小不超过1M
响应结果
基础信息
{
"fpdm": "发票代码",
"fplx": "发票类型",
"fphm": "发票号码",
"kprq": "开票日期",
"xfMc": "销售方名称",
"xfNsrsbh": "销售方纳税人识别号",
"xfContact": "销售方联系方式",
"xfBank": "销售方开户行",
"gfMc": "购方名称",
"gfNsrsbh": "购方纳税人识别号",
"gfContact": "购方联系方式",
"gfBank": "购方开户行",
"code": "发票校验码",
"num": "发票机器码",
"del": "是否作废(String 0 未作废|2 已作废|3 红冲发票|7 部分冲红|8 全额冲红)",
"isOil": "是否成品油发票(Boolean true|false)",
"taxamount": "税额合计",
"goodsamount": "价格合计",
"sumamount": "价税合计",
"quantityAmount": "数量合计",
"updateTime": "更新时间",
"queryCount": "税局查验次数",
"remark": "备注",
"goodsData": [], // 详细清单类目
"isGoodsList": "是否含销货清单票(String Y|N)",
"goodsTotalInfo": {
"name": "名称",
"spec": "规格",
"unit": "单位",
"amount": "数量",
"priceUnit": "单价",
"priceSum": "金额",
"taxRate": "税率",
"taxSum": "税额",
"orgTaxRate": "原始税率字符串,例如【不征收】"
},
"tspzlx": "" // 特殊票种类型
}
tspzlx(特殊票种类型)字段值可能为: 76 报废产品收购; 77 报废产品收购; 81 成品油; 82 稀土; 83 建筑服务; 84 货物运输服务; 85 不动产销售; 86 不动产经营租赁服务; 88 通行费电子发票; 89 旅客运输服务; 92 自产农产品销售; 93 拖拉机按减征税; 94 机动车; 96 农产品收购 ; 99或空(不属于特殊发票类型)
orgTaxRate字段,增值税专用发票(01),增值税普通发票(04),增值税电子专用发票(08),增值税电子普通发票(10)才会返回
增值税专用发票(01),增值税普通发票(04),增值税电子专用发票(08),增值税电子普通发票(10)
{
...基础信息,
"goodsData": [
{
"name": "名称",
"spec": "规格",
"unit": "单位",
"amount": "数量",
"priceUnit": "单价",
"priceSum": "金额",
"taxRate": "税率",
"taxSum": "税额"
}
]
}
机动车销售统一发票(03)
{
...基础信息,
"goodsData": [
{
"name": "名称",
"spec": "规格",
"unit": "单位",
"amount": "数量",
"priceUnit": "单价",
"priceSum": "金额",
"taxRate": "税率",
"taxSum": "税额",
"buyerId": "身份证或组织机构代码",
"origin": "产地",
"ccCode": "合格证",
"importCode": "进口证明书号",
"inspectionCode": "商检单号",
"engineCode": "发动机号",
"vinCode": "车架号",
"taxesCode": "完税凭证",
"tonnage": "吨位",
"limitNum": "限乘人数",
"taxOrg": "税务机关",
"taxOrgCode": "税务机关代码",
"auctionTel": "销货方电话"
}
]
}
二手车销售统一发票(15)
{
...基础信息,
"goodsData": [
{
"name": "名称",
"spec": "规格",
"unit": "单位",
"amount": "数量",
"priceUnit": "单价",
"priceSum": "金额",
"taxRate": "税率",
"taxSum": "税额",
"plateCode": "牌照",
"registerCode": "登记证号",
"vinCode": "车架号",
"vehicleOrg": "转入地车管所",
"auctionName": "经营、拍卖单位",
"auctionAdd": "经营、拍卖单位地址",
"auctionCode": "经营、拍卖单位纳税人识别号",
"auctionBank": "经营、拍卖单位开户银行账号",
"auctionTel": "经营、拍卖单位电话",
"marketName": "二手车市场",
"marketCode": "二手车市场纳税人识别号",
"marketAdd": "二手车市场地址",
"marketBank": "二手车行开户银行账号",
"marketTel": "二手车行电话"
}
]
}
货物运输业增值税专用发票(02)
{
...基础信息,
"goodsData": [
{
"name": "名称",
"spec": null,
"unit": null,
"amount": null,
"priceUnit": null,
"priceSum": "金额",
"taxRate": null,
"taxSum": null
}
]
}
增值税普通发票(卷票)(11)
{
...基础信息,
"goodsData": [
{
"name": "名称",
"spec": null,
"unit": null,
"amount": "数量",
"priceUnit": "单价",
"priceSum": "金额",
"taxRate": null,
"taxSum": null
}
]
}
增值税电子普通发票(通行费)(14)
{
...基础信息,
"goodsData": [
{
"name": "名称",
"spec": "规格",
"unit": "单位",
"amount": "数量",
"priceUnit": null,
"priceSum": null,
"taxRate": "税率",
"taxSum": "税额",
"dateBegin": "开始日期",
"dateEnd": "结束日期"
}
]
}
OCR发票查验结果
{
...发票信息,
"ocr": {
"发票代码": "50******30",
"发票号码": "06****05",
"开票日期": "2018年06月17日",
"校验码": "1234567890787878877",
"发票金额": "10000.00",
"大写金额": "10000",
"发票税额": "566.04",
"不含税金额": "9433.96",
"受票方名称": "某某某某某某某某有限公司",
"受票方税号": "915************586",
"受票方地址、电话": "*******地址",
"受票方开户行、账号": "工行******支行310*************273",
"销售方名称": "重庆某某某某某有限公司",
"销售方税号": "9458943594DD565645",
"销售方地址、电话": "重庆渝北区观音桥某某某地址023-81234567",
"销售方开户行、账号": "开户银行:招商银行股份有限公司重庆较场口支行",
"联次": "第二联:发票联",
"发票类型": "普通发票",
"发票代码解析": {
"批次号": "04",
"年份": "2018",
"税务局代码": "None",
"发票行业代码": "None",
"金额版": "万元版",
"行政区划代码": "重庆市",
"发票类别代码": "None"
}
}
}
ocr成功后续查验操作均失败的提示
{
"success": true,
"code": 1013,
"message": "OCR识别成功但查验失败",
"description": "查验失败具体提示",
"data": {
"ocr": {}
}
}
铁路电子客票
{
"del": "0", // 发票状态代码 0正常 2作废 3已红冲
"updateTime": "查询时间",
"cc": "G*7", // "车次"
"ccrq": "20231015", // 乘车日期
"cfsj": "14:19", // 出发时间
"cfz": "北京西", // 出发站
"cx": "02车", // 车厢
"ddz": "西安北", // 到达站
"dq": "北京", // 地区
"fplx": "83",
"fplxName": "铁路电子客票",
"dzkph": "21**************487952023", // 电子客票号
"fpdm": "",
"fphm": "23119**********25396",
"gfMc": "*******有限公司", // 购方名称
"gfNsrsbh": "9111******50046C", // 购方识别号
"taxamount": "47.68", // 税额合计
"goodsamount": "529.82", // 价格合计
"sumamount": "577.5", // 价税合计
"queryCount": "390", // 查验次数
"jshjcn": "伍佰柒拾柒元伍角", // 价税合计(中文大写)
"kprq": "20231015",
"kttz": "--", // 空调特征
"pz": "", // 票种
"taxRate": "9", // 税率
"xb": "二等座", // 席别
"xw": "05A号", // 席位
"ywlx": "1", // 业务类型: 0退 1售 2改
"name": "**", // 姓名
"zjh": "23************402X" // 证件号
}
航空运输电子客票行程单
{
"queryCount": "查询次数",
"updateTime": "查询时间",
"fpdm": "",
"fphm": "23********0000000660",
"dkbz": "", // 抵扣标志
"dzkphm": "784********94", // 电子客票号码
"del": "0", // 发票状态代码 0正常 2作废 3已红冲
"gfMc": "**航空有限公司", // 购方名称
"gfNsrsbh": "9135********9233XE", // 购方纳税人识别号
"gngjbz": "国内", // 国内国际标识
"gpdh": "", // GP单
"taxamount": "85.05", // 税额合计
"sumamount": "1080", // 价税合计
"goodsData": [ // 详细清单类目
{
"cyr": "南航", // 承运人
"cyrq": "2022-06-15", // 承运日期
"hbh": "CZ**27", // 航班号
"hdxh": "1", // 航段序号
"kpjb": "NR****NP", // 客票级别/客票类别
"mdz": "NKG 南京", // 目的站
"qfsj": "19:03", // 起飞时间
"sfz": "URC 乌鲁木齐", // 始发站
"zwdj": "N" // 座位等级
}
],
"fplx": "61",
"fplxName": "航空运输电子客票行程单",
"kprq": "20230315",
"lkxm": "***", // 旅客姓名
"sfzjhm": "65************2311" // 有效身份证件号码
}
错误码定义
错误码 | 提示信息 | 描述 |
---|---|---|
800 | 查验失败具体提示 | 税局服务异常,建议 15-20 分钟后重试 |
801 | 查验失败具体提示 | 税局服务暂时不可⽤ |
1000 | 参数错误:发票代码不支持 | 10 位或 12 位数字,只支持税控系统增值税发票 |
1001 | 参数错误:发票号码不正确 | 8 位数字 |
1002 | 参数错误:校验码或不含税金额错误 | 二者必传一个,且都为数字 |
1004 | 参数错误:当日开具发票可于次日进行查验 | |
1005 | 参数错误:图片不存在 | 图片或 url 必传一个 |
1006 | 参数错误:请传入正确开票日期 | 建议 YYYYMMDD 格式 |
1007 | OCR 识别失败 | |
1008 | 参数错误:二维码字符格式错误 | |
1009 | 超过该张发票当日查验次数(请于次日再次查验) | 每张票每天只能查询 5 次 |
1010 | 输入信息与税务数据不一致,请检查发票再重试! | 请检查发票查验 4 要素是否匹配 |
1011 | 由于查验行为异常,涉嫌违规,当前无法使用查验服务! | 请联系技术支持 |
1012 | 该省尚未开通发票查验功能! | |
1013 | OCR 识别成功但查验失败 | 查验失败具体提示 |
1014 | PDF,OFD 电子发票查验识别失败 | |
1015 | PDF 电子发票识别成功但查验失败 | 查验失败具体提示 |
1098 | 发票识别失败,请稍候再试|发票代码|发票号码 | 税务接口服务异常,稍后重新请求查询 |
1099 | 查无此票! | 离线开票未同步或平台无此发票 |
2000 | 查验失败具体提示 | 操作失败,请按提示操作 |
2001 | 查验失败具体提示 | 请检查发票查验 5 要素是否匹配 |
附录:根据发票代码判断发票类型
function getInvoiceType(fpdm) {
// 一些例外发票代码
const someCode = ['144031539110', '131001570151', '133011501118', '111001571071'];
if (someCode.includes(fpdm)) {
return {
fplx: '10',
fplxName: '增值税电子普通发票'
};
}
if (fpdm.length === 12) {
if (fpdm.charAt(0) === '0' && fpdm.substring(10, 12) === '11') {
return {
fplx: '10',
fplxName: '增值税电子普通发票'
};
}
if (fpdm.charAt(0) === '0' && fpdm.substring(10, 12) === '12') {
return {
fplx: '14',
fplxName: '增值税电子普通发票(通行费)'
};
}
if (
fpdm.charAt(0) === '0' &&
(fpdm.substring(10, 12) === '04' || fpdm.substring(10, 12) === '05')
) {
return {
fplx: '04',
fplxName: '增值税普通发票'
};
}
if (
fpdm.charAt(0) === '0' &&
(fpdm.substring(10, 12) === '06' || fpdm.substring(10, 12) === '07')
) {
return {
fplx: '11',
fplxName: '增值税普通发票(卷票)'
};
}
if (fpdm.charAt(0) === '0' && fpdm.substring(10, 12) === '17') {
return {
fplx: '15',
fplxName: '二手车销售统一发票'
};
}
if (fpdm.charAt(0) !== '0' && fpdm.substring(7, 8) === '2') {
return {
fplx: '03',
fplxName: '机动车销售统一发票'
};
}
if (fpdm.charAt(0) === '0' && fpdm.substring(10, 12) === '13') {
return {
fplx: '08',
fplxName: '增值税电子专用发票'
};
}
}
if (fpdm.length === 10) {
const b = fpdm.substring(7, 8);
if (b === '1' || b === '5') {
return {
fplx: '01',
fplxName: '增值税专用发票'
};
}
if (b === '6' || b === '3') {
return {
fplx: '04',
fplxName: '增值税普通发票'
};
}
if (b === '7' || b === '2') {
return {
fplx: '02',
fplxName: '货物运输业增值税专用发票'
};
}
}
return '参数错误:发票代码不支持';
}