增值税发票查验

使用说明

统一接口版本号 v2

八戒财税提供全国增值税发票查验接口,支持的发票类型:

发票类型 发票类型代码
增值税专用发票 01
货物运输业增值税专用发票 02
机动车销售统一发票 03
增值税普通发票 04
增值税电子专用发票 08
增值税电子普通发票 10
增值税普通发票(卷票) 11
增值税电子普通发票(通行费) 14
二手车销售统一发票 15
全电发票类型 发票类型代码
电子发票(普通发票) 21
电子发票(增值税专用发票) 20
铁路电子客票 83
航空运输电子客票行程单 61

可通过发票代码获取当前发票类型,参考根据发票代码判断发票类型

查验参数对应发票位置说明(不同发票校验码位置可能差异):参考发票查验参数对应图解

接口列表和资费

接口通常分为3步:

  1. 预处理:参数校验、OCR识别发票图片、解析发票二维码等
  2. 发票查验:同步查询官方平台信息
  3. 格式化数据:返回格式化数据结果,提供额外的信息如官方截图

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 电子发票查验 基础查验结果

基础查验

参数名称类型必选描述
fpdmString根据发票类型决定发票代码(当发票种类是全电发票时不填,其他类型发票必填)
fphmString发票号码
kprqString开票日期,建议格式YYYYMMDD
checkCodeString根据发票类型决定校验码:当发票种类是"04"(普票)、"10"(电子票)、"11"(卷式发票)、"14"(通行费)时,校验码后6位必传,其他类型发票可以不传
noTaxAmountString不含税金额/车价合计:当发票种类是"01"(增值税专用发票)、"02"(货物运输业增值税专用发票)、"03"(机动车销售统一发票)、"08"(增值税电子专用发票)、"15"(二手车销售统一发票)时必传,其他类型发票可以不传
jshjString价税合计:当发票种类是全电发票【电子发票(普通发票)、电子发票(增值税专用发票)、铁路电子客票、航空运输电子客票行程单】时必传,其他类型发票可以不传

当发票号码为 20 位数字时,为全电发票。 发票类型参考

二维码发票查验

参数名称 类型 必选 描述
code String 发票二维码解析后字符串

字符串格式:01,10,051001700111,45226924,39.57,20180506,72967695763208703577,621B,

注意:卷票等二维码信息不完整,通过此接口会提示参数错误

OCR发票查验

参数名称类型必选描述
imgString2选1    将发票图片转换为Base64编码字符串,不包含前缀data:image/jpg;base64,
urlString发票图片链接地址,如:https://exmaple.com/img.jpg
extType    Boolean可选是否混贴发票识别,发票覆盖增值税发票专票、普票和电子发票、增值税发票卷票、机动车发票等各类常见票据,不使用混贴发票识别不传或传false

图片大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/png/bmp格式

PDF,OFD电子发票查验

参数名称类型必选描述
pdfBase64String2选1将PDF/ODF文件转换为Base64编码字符串,不包含前缀data:image/jpg;base64,
pdfUrlStringPDF/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": "原始税率字符串,例如【不征收】"
  }
}

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售
  "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 '参数错误:发票代码不支持';
}