发票验真
功能介绍
支持10种增值税发票的信息核验:
增值税专用发票、增值税普通发票、增值税普通发票(卷式)、增值税电子专用发票、增值税电子普通发票、增值税电子普通发票(通行费)、二手车销售统一发票、机动车销售统一发票、区块链电子发票、全电发票,支持返回票面的全部信息。
该接口的使用限制请参见约束与限制,详细使用指导请参见OCR服务使用简介章节。
- 每份发票,每天最多可查验5次。
- 可查验最近5年内(国家税务总局)增值税发票管理系统开具的发票。
- 税务局数据同步有时延,建议当天新开的发票在24小时后查询。
约束与限制
- 支持增值税专用发票、增值税普通发票、增值税普通发票(卷式)、增值税电子专用发票、增值税电子普通发票、增值税电子普通发票(通行费)、二手车销售统一发票、机动车销售统一发票、区块链电子发票和全电发票,共计10种发票信息核验。
- 每份发票每天最多可查验5次。可查验最近5年内(国家税务总局)增值税发票管理系统开具的发票。
- 税务局数据同步有时延,建议当天新开的发票在24小时后查询。
- 文字识别服务属于公有云服务,线上用户资源共享,如果需要多并发请求,请提前联系我们。
调用方法
请参见如何调用API。
前提条件
在使用之前,需要您完成服务申请和认证鉴权,具体操作流程请参见开通服务和认证鉴权章节。
用户首次使用需要先申请开通。服务只需要开通一次即可,后面使用时无需再次申请。如未开通服务,调用服务时会提示ModelArts.4204报错,请在调用服务前先进入控制台开通服务,并注意开通服务区域与调用服务的区域保持一致。
URI
POST /v2/{project_id}/ocr/invoice-verification
请求参数
参数 |
是否必选 |
参数类型 |
描述 |
---|---|---|---|
X-Auth-Token |
是 |
String |
用户Token。 用于获取操作API的权限。获取Token接口响应消息头中X-Subject-Token的值即为Token。 |
Content-Type |
是 |
String |
发送的实体的MIME类型,参数值为“application/json”。 |
Enterprise-Project-Id |
否 |
String |
企业项目ID。OCR支持通过企业项目管理(EPS)对不同用户组和用户的资源使用,进行分账。 获取方法:进入“企业项目管理”页面,单击企业项目名称,在企业项目详情页获取Enterprise-Project-Id(企业项目ID)。
企业项目创建步骤请参见用户指南。
说明:
创建企业项目后,在传参时,有以下三类场景。
|
参数 |
是否必选 |
参数类型 |
说明 |
---|---|---|---|
code |
是 |
String |
发票代码。 发票种类为全电发票时,该参数须为空字符串。 |
number |
是 |
String |
发票号码。 |
issue_date |
是 |
String |
发票日期格式YYYY-MM-DD。 |
check_code |
否 |
String |
校验码后六位。 |
subtotal_amount |
否 |
String |
合计金额。和票据上的金额的有效数字保持一致,例如票据上的金额为88.00,则需要输入字符串为“88.00”,否则可能验真不成功。如果输入“88”或“88.0”可能会产生"result_code": "1010", " Parameter error."报错。 发票种类为全电发票时,该参数须为价税合计金额,其他票种使用不含税合计金额。 |
响应参数
根据识别的结果,可能有不同的HTTP响应状态码(status code)。例如,200表示API调用成功,400表示调用失败,详细的状态码和响应参数说明如下。
状态码: 200
参数 |
参数类型 |
描述 |
---|---|---|
result |
Object |
识别结果。 调用失败时不返回此字段。 依据发票类型不同,返回参数不同。 |
参数 |
参数类型 |
描述 |
---|---|---|
result |
Object |
调用成功时返回的识别结果。 |
type |
String |
发票类型,取值范围:
|
code |
String |
发票代码。 |
number |
String |
发票号码。 |
issue_date |
String |
开票日期。 |
machine_number |
String |
机器编号。 |
check_code |
String |
校验码。 |
status |
String |
发票状态,取值范围:
|
subtotal_amount |
String |
合计金额(不含税)。 |
subtotal_tax |
String |
合计税额。 |
total |
String |
价税合计(小写)。 |
total_in_words |
String |
价税合计(大写)。 |
remarks |
String |
备注。 |
receiver |
String |
收款人。 |
issuer |
String |
开票人。 |
reviewer |
String |
复核人。 |
buyer_name |
String |
购买方名称。 |
buyer_id |
String |
购买方纳税人识别号。 |
buyer_address |
String |
购买方地址、电话。 |
buyer_bank |
String |
购买方开户行及账号。 |
seller_name |
String |
销售方名称。 |
seller_id |
String |
销售方纳税人识别号。 |
seller_address |
String |
销售方地址、电话。 |
seller_bank |
String |
销售方开户行及账号。 |
deductible_toll |
String |
通行费发票返回信息:
|
result_code |
String |
取值范围见表10。 |
result_message |
String |
取值范围见表10。 |
items |
object |
发票中包含的消费信息。 |
name |
String |
货物或应税劳务、服务名称、项目名称(通行费)。 |
specification |
String |
规格型号。 |
unit |
String |
单位。 |
quantity |
String |
数量。 |
unit_price |
String |
单价。 |
amount |
String |
金额。 |
tax_rate |
String |
税率。 |
tax |
String |
税额。 |
license_plate_number |
String |
车牌号。 |
vehicle_type |
String |
类型。 |
start_date |
String |
通行日期起。 |
end_date |
String |
通行日期止。 |
参数 |
参数类型 |
描述 |
---|---|---|
result |
object |
调用成功时返回的识别结果。 |
type |
String |
发票类型,取值范围: 机动车销售统一发票:motor_vehicle_sales。 |
code |
String |
发票代码。 |
number |
String |
发票号码。 |
issue_date |
String |
开票日期。 |
machine_number |
String |
机器编号。 |
status |
String |
发票状态,取值范围:
|
subtotal_amount |
String |
不含税价(小写)。 |
total |
String |
价税合计(小写)。 |
total_in_words |
String |
价税合计(大写)。 |
issuer |
String |
开票人。 |
buyer_name |
String |
购方名称。 |
buyer_organization_number |
String |
购买方身份证号码/组织机构代码。 |
buyer_id |
String |
购买方纳税人识别号。 |
seller_name |
String |
销货单位名称。 |
seller_id |
String |
销售方纳税人识别号。 |
seller_phone |
String |
销售方电话。 |
seller_account |
String |
销售方账号。 |
seller_address |
String |
销售方地址。 |
seller_bank |
String |
销售方开户银行。 |
tax_rate |
String |
税率。 |
tax |
String |
税额。 |
tax_authority |
String |
主管税务机关名称。 |
tax_authority_code |
String |
主管税务机关代码。 |
tax_payment_receipt |
String |
完税凭证号码。 |
tonnage |
String |
吨位。 |
seating_capacity |
String |
限乘人数。 |
vehicle_type |
String |
车辆类型。 |
brand_model |
String |
厂牌型号。 |
manufacturing_location |
String |
产地。 |
quality_certificate |
String |
合格证号。 |
import_certificate |
String |
进口证明书号。 |
inspection_number |
String |
商检单号。 |
engine_number |
String |
发动机号码。 |
vehicle_identification_number |
String |
车辆识别代号/车架号码。 |
result_code |
String |
取值范围见表10。 |
result_message |
String |
取值范围见表10。 |
参数 |
参数类型 |
描述 |
---|---|---|
result |
object |
调用成功时返回的识别结果。 |
type |
String |
发票类型,取值范围: 二手车销售统一发票:used_vehicle_sales。 |
code |
String |
发票代码。 |
number |
String |
发票号码。 |
issue_date |
String |
开票日期。 |
machine_number |
String |
机器编号。 |
status |
String |
发票状态,取值范围:
|
total |
String |
车价合计(小写)。 |
total_in_words |
String |
车价合计(大写)。 |
remarks |
String |
备注。 |
issuer |
String |
开票人。 |
buyer_name |
String |
买方单位/个人。 |
buyer_organization_number |
String |
买单位代码/身份证号码。 |
buyer_address |
String |
买方单位/个人住址。 |
buyer_phone |
String |
买方电话。 |
seller_name |
String |
卖方单位/个人。 |
seller_organization_number |
String |
卖方单位代码/身份证号码。 |
seller_address |
String |
卖方单位 /个人住址。 |
seller_phone |
String |
卖方电话。 |
vehicle_license_plate_number |
String |
车牌照号。 |
registration_certificate_number |
String |
登记证号。 |
vehicle_type |
String |
车辆类型。 |
vehicle_identification_number |
String |
车辆识别代号/车架号码。 |
brand_model |
String |
厂牌型号。 |
transfer_motor_vehicle_department_name |
String |
转入地车辆车管所名称。 |
auction_unit_name |
String |
经营,拍卖单位。 |
auction_unit_address |
String |
经营,拍卖单位地址。 |
auction_unit_tax_number |
String |
经营,拍卖单位纳税人识别号。 |
auction_unit_bank_and_account |
String |
开户银行及账号。 |
auction_unit_phone |
String |
经营,拍卖单位电话。 |
used_vehicle_market_name |
String |
二手车市场。 |
used_vehicle_market_tax_number |
String |
二手车市场纳税人识别号。 |
used_vehicle_market_address |
String |
二手车市场地址。 |
used_vehicle_market_bank_and_account |
String |
二手车市场开户银行及账号。 |
used_vehicle_market_phone |
String |
二手车市场电话。 |
result_code |
String |
取值范围见表10。 |
result_message |
String |
取值范围见表10。 |
参数 |
参数类型 |
描述 |
---|---|---|
result |
object |
调用成功时返回的调用结果。 |
type |
String |
发票类型,取值范围: 全电发票(航空运输电子客票行程单):fully_digitalized_flight_itinerary。 |
international_flag |
String |
国内国际标识。 |
number |
String |
发票号码。 |
status |
String |
发票状态,取值范围:
|
passenger_name |
String |
旅客姓名。 |
id_number |
String |
有效身份证件号码。 |
gp_number |
String |
gp单号。 |
tax |
String |
增值税税额。 |
total |
String |
合计。 |
e_ticket_number |
String |
电子客票号码。 |
issue_date |
String |
填开日期。 |
buyer_name |
String |
购买方名称。 |
buyer_id |
String |
购买方纳税人识别号。 |
itinerary_list |
Array of ItineraryList objects |
机票行程列表。 |
参数 |
参数类型 |
描述 |
---|---|---|
departure_station |
String |
始发站。 |
destination_station |
String |
目的站。 |
carrier |
String |
承运人。 |
flight |
String |
航班号。 |
cabin_class |
String |
座位等级。 |
date |
String |
日期。 |
time |
String |
时间。 |
fare_basis |
String |
客票类别。 |
flight_segment |
String |
航段。 |
业务状态码(result_code) |
描述信息(result_message) |
处理方法 |
---|---|---|
1000 |
The invoice verification information is consistent with the tax authority’s information. 发票验证信息与税务机关的信息一致。 |
无需处理,发票验证信息与税务机关信息一致。 |
1001 |
One invoice can be verified for only five times per day. 一张发票每天只能验证5次。 |
超过当天查验次数,请第二天再查验。 |
1002 |
The invoice verification information cannot be found in the tax authority’s information. 在税务机关的信息中找不到发票验证信息。 |
被查验发票信息有误,请核对发票信息是否填写正确。 |
1003 |
The invoice verification information is inconsistent with the tax authority’s information. 发票验证信息与税务机关的信息不一致。 |
被查验发票信息有误,请核对发票信息是否填写正确。 |
1004 |
Only invoices issued within the last five years can be verified. 只能验证最近五年内开具的发票。 |
超过5年的发票不能查验。 |
1005 |
Unsupported invoice type. 不支持的发票类型。 |
被查验发票信息有误,请核对发票信息是否填写正确。 |
1006 |
The invoice verification information is abnormal in the tax authority’s information. 发票认证信息在税务机关信息中异常。 |
税局机关接口异常,请等候税局机关恢复后再重试(建议2小时后重试)。 |
1007 |
This batch of invoices is being verified. 该批发票正在校验中。 |
该批次发票正在核验中,请第二天再查验。 |
1008 |
The request to the invoice verification service provided by the State Taxation Administration of China timed out. 向税务机关提供的发票验证服务的请求超时。 |
(税局机关)发票查询服务请求超时,请等候税局机关恢复后再重试(建议2小时后重试)。 |
1009 |
Verification request rejected. Online invoice verification is currently not supported in this region. 验证请求被拒绝,此区域暂未开通线上查验通道。 |
(税局机关)查验请求被拒绝,此区域暂未开通线上查验通道。 |
1010 |
Parameter error. 参数错误。 |
参数错误,请检查请求参数是否填写正确。 |
状态码: 400
参数 |
参数类型 |
描述 |
---|---|---|
error_code |
String |
调用失败时的错误码,具体请参见错误码。 调用成功时不返回此字段。 |
error_msg |
String |
调用失败时返回的错误信息。 调用成功时不返回此字段。 |
请求示例
- 传入发票的代码、号码、发票日期、校验码后六位进行发票真伪核验
POST https://{endpoint}/v2/{project_id}/ocr/invoice-verification Request Header: Content-Type: application/json X-Auth-Token: MIINRwYJKoZIhvcNAQcCoIINODCCDTQCAQExDTALBglghkgBZQMEAgEwgguVBgkqhkiG... Request Body: { "code": "031001900000", "number": "12528000", "issue_date": "2020-08-09", "check_code": "000000" }
响应示例
状态码:200
成功响应示例(增值税普通发票)
{ "result": { "type": "vat_normal", "code": "03xxxxx00204", "number": "12528000", "issue_date": "20200809", "machine_number": "661xxxxx1000", "check_code": "79xxxxx8040xxxx00000", "status": "valid", "subtotal_amount": "1400.00", "subtotal_tax": "0.00", "total": "1400.00", "total_in_words": "壹仟肆佰元整", "remarks": "3091", "receiver": "", "issuer": "", "reviewer": "", "buyer_name": "xxx公司", "buyer_id": "91xxxxx0192xxxx00", "buyer_address": "", "buyer_bank": "", "seller_name": "xxx投资发展有限公司", "seller_id": "913101177858977000", "seller_address": "xx市xx区xx镇xx路xx号 021-xxxx1000", "seller_bank": "xx银行xx支行310xxxxxxxxx00000000", "deductible_toll": "N", "items": [ { "name": "", "specification": "", "unit": "1", "quantity": "1", "unit_price": "1400.00", "amount": "1400.00", "tax_rate": "免税", "tax": "***", "license_plate_number": "", "vehicle_type": "", "start_date": "", "end_date": "" } ], "result_code": "1000", "result_message": "The invoice verification information is consistent with the tax authority’s information." } }
成功响应示例(机动车销售统一发票)
{ "result": { "type": "motor_vehicle_sales", "code": "14xxxxx20000", "number": "00xxxx94", "issue_date": "20171128", "machine_number": "49xxxxx10000", "status": "valid", "subtotal_amount": "68376.07", "total": "80000.00", "total_in_words": "捌万元整", "issuer": "", "buyer_name": "xx", "buyer_organization_number": "", "buyer_id": "", "seller_name": "xx汽车销售服务有限公司", "seller_id": "91xxxxx059xxxx0000", "seller_phone": "0898-xxxxxx00", "seller_account": "265xxxxxx000", "seller_address": "xx省xx市xx大道176号", "seller_bank": "中国银行xx支行", "tax_rate": "0.17", "tax": "11623.93", "tax_authority": "xx区局二分局户籍二组", "tax_authority_code": "146xxxxxx00", "tax_payment_receipt": "", "tonnage": "-", "seating_capacity": "5", "vehicle_type": "轿车", "brand_model": "北京牌BJxxxxxx000", "manufacturing_location": "北京", "quality_certificate": "YJxxxxxx270000", "import_certificate": "-", "inspection_number": "-", "engine_number": "BAxxxxx000", "vehicle_identification_number": "LNBSCxxxxx0000", "result_code": "1000", "result_message": "The invoice verification information is consistent with the tax authority’s information." } }
成功响应示例(二手车销售统一发票)
{ "result": { "type": "used_vehicle_sales", "code": "03xxxxxx0000", "number": "00xxx000", "issue_date": "20191202", "machine_number": "661xxxxxx000", "status": "valid", "total": "20000.00", "total_in_words": "贰万元整", "remarks": "卖方纳税人识别号:33xxxxx900xxxxx00 买方纳税人识别号:37xxxxxx561xxxxx00 初次登记:2014-07-24 免征税款", "issuer": "", "buyer_name": "xxx", "buyer_organization_number": "37xxxxxx561xxxxx00", "buyer_address": "xx省xx市xx路街道办事处xx庄居委会xx号", "buyer_phone": ".", "seller_name": "xxx", "seller_organization_number": "339xxxxxx009xxxx00", "seller_address": "xx省xx市xx市xx路xx号", "seller_phone": ".", "vehicle_license_plate_number": "苏Kxxxx0", "registration_certificate_number": "32xxxxxx0000", "vehicle_type": "小型轿车", "vehicle_identification_number": "LBxxxxxxZ3xxxxxx000", "brand_model": "xx牌HQxxxx000", "transfer_motor_vehicle_department_name": "xx车辆管理所", "auction_unit_name": "", "auction_unit_address": "", "auction_unit_tax_number": "", "auction_unit_bank_and_account": "", "auction_unit_phone": "", "used_vehicle_market_name": "xx旧机动车交易市场", "used_vehicle_market_tax_number": "91xxxxx2MAxxxxx000", "used_vehicle_market_address": "xx市xx区xx路xxx号", "used_vehicle_market_bank_and_account": "xxxx银行股份有限公司xxxx物流园分理处10xxxxx040xxxx00", "used_vehicle_market_phone": "13xxxxx0000", "result_code": "1000", "result_message": "The invoice verification information is consistent with the tax authority’s information." } }
状态码:400
失败响应示例
{ "error_code": "AIS.0118", "error_msg": "Service request error." }
SDK代码示例
SDK代码示例如下。
使用SDK前建议将SDK更新至最新版,防止本地旧版SDK无法使用最新的OCR功能。
传入发票的代码、号码、发票日期、校验码后六位进行发票真伪核验
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
package com.huaweicloud.sdk.test; import com.huaweicloud.sdk.core.auth.ICredential; import com.huaweicloud.sdk.core.auth.BasicCredentials; import com.huaweicloud.sdk.core.exception.ConnectionException; import com.huaweicloud.sdk.core.exception.RequestTimeoutException; import com.huaweicloud.sdk.core.exception.ServiceResponseException; import com.huaweicloud.sdk.ocr.v1.region.OcrRegion; import com.huaweicloud.sdk.ocr.v1.*; import com.huaweicloud.sdk.ocr.v1.model.*; public class RecognizeInvoiceVerificationSolution { public static void main(String[] args) { // The AK and SK used for authentication are hard-coded or stored in plaintext, which has great security risks. It is recommended that the AK and SK be stored in ciphertext in configuration files or environment variables and decrypted during use to ensure security. // In this example, AK and SK are stored in environment variables for authentication. Before running this example, set environment variables CLOUD_SDK_AK and CLOUD_SDK_SK in the local environment String ak = System.getenv("CLOUD_SDK_AK"); String sk = System.getenv("CLOUD_SDK_SK"); ICredential auth = new BasicCredentials() .withAk(ak) .withSk(sk); OcrClient client = OcrClient.newBuilder() .withCredential(auth) .withRegion(OcrRegion.valueOf("<YOUR REGION>")) .build(); RecognizeInvoiceVerificationRequest request = new RecognizeInvoiceVerificationRequest(); InvoiceVerificationRequestBody body = new InvoiceVerificationRequestBody(); body.withCheckCode("000000"); body.withIssueDate("2020-08-09"); body.withNumber("12528000"); body.withCode("031001900000"); request.withBody(body); try { RecognizeInvoiceVerificationResponse response = client.recognizeInvoiceVerification(request); System.out.println(response.toString()); } catch (ConnectionException e) { e.printStackTrace(); } catch (RequestTimeoutException e) { e.printStackTrace(); } catch (ServiceResponseException e) { e.printStackTrace(); System.out.println(e.getHttpStatusCode()); System.out.println(e.getRequestId()); System.out.println(e.getErrorCode()); System.out.println(e.getErrorMsg()); } } } |
传入发票的代码、号码、发票日期、校验码后六位进行发票真伪核验
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
# coding: utf-8 from huaweicloudsdkcore.auth.credentials import BasicCredentials from huaweicloudsdkocr.v1.region.ocr_region import OcrRegion from huaweicloudsdkcore.exceptions import exceptions from huaweicloudsdkocr.v1 import * if __name__ == "__main__": # The AK and SK used for authentication are hard-coded or stored in plaintext, which has great security risks. It is recommended that the AK and SK be stored in ciphertext in configuration files or environment variables and decrypted during use to ensure security. # In this example, AK and SK are stored in environment variables for authentication. Before running this example, set environment variables CLOUD_SDK_AK and CLOUD_SDK_SK in the local environment ak = os.getenv("CLOUD_SDK_AK") sk = os.getenv("CLOUD_SDK_SK") credentials = BasicCredentials(ak, sk) \ client = OcrClient.new_builder() \ .with_credentials(credentials) \ .with_region(OcrRegion.value_of("<YOUR REGION>")) \ .build() try: request = RecognizeInvoiceVerificationRequest() request.body = InvoiceVerificationRequestBody( check_code="000000", issue_date="2020-08-09", number="12528000", code="031001900000" ) response = client.recognize_invoice_verification(request) print(response) except exceptions.ClientRequestException as e: print(e.status_code) print(e.request_id) print(e.error_code) print(e.error_msg) |
传入发票的代码、号码、发票日期、校验码后六位进行发票真伪核验
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
package main import ( "fmt" "github.com/huaweicloud/huaweicloud-sdk-go-v3/core/auth/basic" ocr "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/ocr/v1" "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/ocr/v1/model" region "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/ocr/v1/region" ) func main() { // The AK and SK used for authentication are hard-coded or stored in plaintext, which has great security risks. It is recommended that the AK and SK be stored in ciphertext in configuration files or environment variables and decrypted during use to ensure security. // In this example, AK and SK are stored in environment variables for authentication. Before running this example, set environment variables CLOUD_SDK_AK and CLOUD_SDK_SK in the local environment ak := os.Getenv("CLOUD_SDK_AK") sk := os.Getenv("CLOUD_SDK_SK") auth := basic.NewCredentialsBuilder(). WithAk(ak). WithSk(sk). Build() client := ocr.NewOcrClient( ocr.OcrClientBuilder(). WithRegion(region.ValueOf("<YOUR REGION>")). WithCredential(auth). Build()) request := &model.RecognizeInvoiceVerificationRequest{} checkCodeInvoiceVerificationRequestBody:= "000000" request.Body = &model.InvoiceVerificationRequestBody{ CheckCode: &checkCodeInvoiceVerificationRequestBody, IssueDate: "2020-08-09", Number: "12528000", Code: "031001900000", } response, err := client.RecognizeInvoiceVerification(request) if err == nil { fmt.Printf("%+v\n", response) } else { fmt.Println(err) } } |
更多编程语言的SDK代码示例,请参见API Explorer的代码示例页签,可生成自动对应的SDK代码示例。
状态码
状态码 |
描述 |
---|---|
200 |
成功响应示例(增值税普通发票) |
400 |
失败响应示例 |
状态码请参见状态码。
错误码
错误码请参见错误码。