Appearance
发票实时同步接口文档
1. 概述
通过接口编号 S000621
,可实时获取多种进项发票与凭证数据,适用于已兼容全电税务数字账户的系统。该接口通过电子税务局获取以下信息: 接口:ip:port/invoice/S000621
- 未勾选发票、缴款书、完税凭证
- 当期已勾选发票、缴款书、完税凭证
- 不抵扣已勾选发票、完税凭证
- 未到期发票、海关缴款书
- 往期抵扣类发票、缴款书、完税凭证
- 出口退税已认证类
2. 请求数据格式
json
{
"appid": "xxx",
"serviceid": "S000621",
"jtnsrsbh": "xxxxxxx",
"nsrsbh": "xxxxxxx",
"content": "",
"signature": "xxxxxxxxxxxxxxxxx",
"signType": "0"
}
content说明
发票勾选状态查询参数对照表(rzzt)
字段说明
参数 | 参数类型 | 参数说明 | 是否必填 | 备注 |
---|---|---|---|---|
page | Integer | 第几页 | 否 | 默认1 |
pageSize | Integer | 每页数量 | 否 | 默认系统根据不同省份给不同数量,建议100 |
rzzt | String | 状态 | 是 | 详见状态码说明表格 |
skssq | String | 税款所属期 | 否 | 格式yyyyMM |
rq_q | String | 日期起 | 否 | 格式yyyy-MM-dd,rzzt为11、17、15时为勾选日期,其它为开票日期 |
rq_z | String | 日期止 | 否 | 格式yyyy-MM-dd |
iszip | String | 是否压缩 | 否 | 0否,1是,默认0,解密方法详见第5节 |
adapter | String | 是否适配 | 否 | 针对rzzt=40专用,默认0(否) |
znxpz | String | 是否转内销发票 | 否 | N否,Y是,默认N,仅支持rzzt=12 |
fpdm | String | 税控发票代码 | 否 | rzzt=10或11时可用,默认为空 |
fphm | String | 税控发票号码 | 否 | rzzt=10或11时可用,默认为空 |
qdfphm | String | 数电发票号码 | 否 | rzzt=10或11时可用,默认为空 |
fpztdm | String | 发票状态代码 | 否 | rzzt=10或11时可用,默认0,2,7,8(0正常,2红冲,7部分红冲,8全额红冲) |
fxdjdm | String | 风险等级代码 | 否 | rzzt=10或11时可用,默认01,02,03(01正常,02疑点发票,03异常凭证) |
fplxdm | String | 发票类型代码 | 否 | rzzt=10或11时可用,默认81,82,85,86,03,01,04,08,10,83,87,61,51,14,8208 |
gxrq_q | String | 勾选日期起 | 否 | rzzt=11时可用,格式yyyy-MM-dd |
gxrq_z | String | 勾选日期止 | 否 | rzzt=11时可用,格式yyyy-MM-dd |
content 参数示例
json
{
"rq_q": "2018-07-28",
"rzzt": "11",
"pageSize": 100,
"page": 1,
"rq_z": "2018-08-23"
}
content 字段说明
参数 | 类型 | 必填 | 说明 |
---|---|---|---|
page | Integer | 否 | 页码,默认1 |
pageSize | Integer | 否 | 每页记录数,建议100 |
rzzt | String | 是 | 发票认证状态代码 |
skssq | String | 否 | 税款所属期 yyyyMM |
rq_q / rq_z | String | 否 | 起止日期 yyyy-MM-dd |
iszip | String | 否 | 是否压缩 0否1是 |
adapter | String | 否 | rzzt=40专用适配 |
znxpz | String | 否 | 是否转内销发票(rzzt=12) |
fpdm / fphm / qdfphm | String | 否 | 发票代码/号码 |
fpztdm / fplxdm / fxdjdm | String | 否 | 状态、类型、风险等级代码 |
gxrq_q / gxrq_z | String | 否 | 勾选日期范围(rzzt=11时可用) |
3. 请求方式
POST
4. 返回数据格式
json
{
"uuid": "",
"code": "0000",
"msg": "请求成功",
"sfjf": "Y",
"jf_num": 1,
"content": base64
}
content解密:
{
"pageSize": 100,
"currentPage": 1,
"count":201,
"InvoiceList": [
{
"billingDate": "2018-06-21",//开票日期
"deductible": "0",//是否认证(0-未认证,1-已认证)
"deductibleDate": "",/认证日期(YYYY-MM-DD)
"deductiblePeriod": "",//认证属期(YYYYMM)
"deductibleType": "",//认证方式(1-勾选,2-扫描)
"deductibleMode": "",//认证模式(1-抵扣,2-退税)
"invoiceCode": "5200171130",//发票代码
"invoiceNumber": "01539905",//发票号码
"invoiceType": "01",//发票类型
"purchaserName": "北京*********有限公司",//购方名称
"purchaserTaxNo": "911*********15B",//购方税号
"salesTaxName": "*******有限公司",//销方名称
"salesTaxNo": "9152**********936",//销方税号
"state": "0",//发票状态
"totalAmount": 28155.34,//未税金额
"totalTax": 844.66,//税额
"validTax": 844.66,
"checkStatus": "1",
"checkDate": “”,
"managementStatus": "0",
"abnormalType":"",
"checkCode":"",
"ylzd4":"不抵扣类型",
"ylzd5":"全电纸质发票的全电发票号码",
"tdyslxDm":"业务类型, 08 通行费,12 自产农产品,16 自小规模处采购农产品,空字符串或null-无业务类型"
}
],
"skssq": "202201" //需要所属期的同步才会返回值
}
字段说明
字段(ID) | 名称 | 类型 | 必须 | 说明 |
---|---|---|---|---|
pageSize | 每页数量 | number(8) | 是 | 查询每页返回的记录数量 |
currentPage | 当前页数 | number(8) | 是 | 当前页码 |
count | 发票总张数 | number(8) | 是 | 总记录数 |
InvoiceList | 发票数据 | list | 是 | 发票信息列表 |
billingDate | 开票日期 | char(10) | 是 | 格式:YYYY-MM-DD,缴款书发票表示填发日期 |
deductible | 是否认证 | char(1) | 是 | 0-未认证,1-已认证 |
deductibleDate | 认证日期 | char(10) | 否 | 已认证时填写,格式:YYYY-MM-DD |
deductibleMode | 认证模式 | char(1) | 否 | 1-抵扣,2-退税,4-不抵扣勾选 |
deductiblePeriod | 认证属期 | char(4) | 否 | 格式:YYYYMM |
deductibleType | 认证方式 | char(1) | 否 | 1-勾选,2-扫描 |
invoiceCode | 发票代码 | char(15) | 否 | 缴款书或全电发票时为空 |
invoiceNumber | 发票号码 | char(30) | 是 | 发票或缴款书号码 |
invoiceType | 发票类型 | char(2) | 是 | 示例:01增值税专票,10增值税普票,17海关缴款书等,详见下方类型表 |
purchaserName | 购方名称 | char(200) | 是 | 发票购方企业或个人名称 |
purchaserTaxNo | 购方税号 | char(20) | 是 | 购方纳税人识别号 |
salesTaxName | 销方名称 | char(200) | 否 | 发票销方名称 |
salesTaxNo | 销方税号 | char(20) | 否 | 销方纳税人识别号 |
state | 发票状态 | char(1) | 是 | 0正常,1作废,2红冲,3失控,4异常,7部分红冲,8全额红冲,80红字发票待确认 |
totalAmount | 未税金额 | number(18,2) | 否 | 增值税发票必填,缴款书为空 |
totalTax | 税额 | number(18,2) | 是 | 发票税额 |
validTax | 有效税额 | number(18,2) | 是 | 可用于抵扣的税额 |
checkStatus | 勾选状态 | char(1) | 否 | 0-未勾选,1-已勾选 |
checkDate | 勾选日期 | char(10) | 否 | 格式:YYYY-MM-DD |
managementStatus | 管理状态 | char(1) | 是 | 0正常,1疑点,2异常,3红字锁定,4禁止勾选退税,5机动车高风险,6机动车低风险 |
abnormalType | 异常类别 | char(1) | 否 | 0状态异常,1用途变更,2管理状态异常 |
checkCode | 校验码 | char(20) | 否 | 发票校验码 |
ylzd2 | 是否录入不符项 | char(2) | 否 | 0-否,1-是 |
ylzd5 | 全电发票号码 | varchar(50) | 否 | 全电纸质发票的关联全电发票号 |
ylzd4 | 不抵扣类型 | varchar(50) | 否 | 1-非应税项目,2-免税项目,3-福利消费,4-非正常损失,5-其他 |
tdyslxDm | 业务类型 | char(2) | 否 | 示例:08通行费,12自产农产品,16采购农产品,06不动产等 |
ylzd3 | 转内销证明编号 | varchar(50) | 否 | 转内销相关凭证编号 |
发票类型代码说明(部分):
- 01:增值税专用发票
- 10:增值税普通发票
- 08:电子专票
- 09:全电发票(专票)
- 90:全电发票(普票)
- 17:海关缴款书
- 18:完税凭证
- 85 / 86:纸质专用 / 普通发票
- 51 / 61:铁路 / 航空数电票
- 83 / 87:机动车销售类发票
5. rzzt=40 适配返回格式(adapter=1)
json
adapter=1时:
{
"pageSize": "100",
"currentPage": "1",
"InvoiceList": {
"202002": {
"FP": [
{
"abnormalType": "",
"billingDate": "2020-01-16 00:00:00",
"checkDate": "2020-02-28 22:01:30",
"checkStatus": "1",
"checkTime": "2020-02-28 22:01:30",
"deductible": "1",
"deductibleDate": "2020-02-28 22:01:30",
"deductibleMode": "1",
"deductiblePeriod": "202002",
"deductibleType": "1",
"id": 0,
"invoiceCode": "1100193***",
"invoiceNumber": "06374***",
"invoiceType": "01",
"managementStatus": "0",
"purchaserName": "商贸有限公司",
"purchaserTaxNo": "91310115797033****",
"salesTaxName": "(中国)有限公司",
"salesTaxNo": "91110000625907****",
"source": "1",
"state": "0",
"totalAmount": 5763.7,
"totalTax": 749.28,
"validTax": 749.28,
"ylzd5": ""
}
],
"HGJKS": [
{
"abnormalType": "",
"billingDate": "2019-11-28 00:00:00",
"checkDate": "2020-02-24 15:19:28",
"checkStatus": "1",
"checkTime": "2020-02-24 15:19:28",
"deductible": "1",
"deductibleDate": "2020-02-24 15:19:28",
"deductibleMode": "1",
"deductiblePeriod": "202002",
"deductibleType": "1",
"id": 35100,
"invoiceCode": "",
"invoiceNumber": "53042019104106***8-L02",
"invoiceType": "17",
"managementStatus": "0",
"purchaserName": "贸有限公司",
"purchaserTaxNo": "91310115797033***",
"source": "1",
"state": "0",
"totalTax": 433138.8,
"tq_bj": "0",
"validTax": 433138.8,
"xg_sj": "2023-06-06 17:50:44"
}
]
},
"202306": {}
}
}
6. 解密方法(Java示例)
- Base64 解码 → 2. ZIP 解压
java
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
/**
*
* @ClassName: ZipUtil
* @Description: TODO(这里用一句话描述这个类的作用)
* @author lipenghui
* @email 511930751@qq.com
* @date 2023年6月6日
*
*/
public class ZipUtil {
public static void main(String[] args) {
System.out.println(unzipDecode("JCSK2023",true));
}
/**
* 解密(压缩解密)
* (先base64解密,在解压)
* @param zipStr
* @param iszip 是否是压缩文件, false表示只做base64操作
* @return
*/
public static String unzipDecode(String zipStr,boolean iszip) {
String unzipStr="";
try{
byte[] unzip=new sun.misc.BASE64Decoder().decodeBuffer(zipStr);
if(iszip){
unzipStr=decompress(unzip);
}
else{
unzipStr= new String(unzip,"UTF-8");
}
}
catch(Exception e){
// logger.error("压缩解密失败:"+zipStr);
e.printStackTrace();
}
return unzipStr;
}
/**
* 解压
* @param compressed
* @return
*/
private static String decompress(byte[] compressed) {
if (compressed == null)
return null;
ByteArrayOutputStream out = null;
ByteArrayInputStream in = null;
ZipInputStream zin = null;
String decompressed;
try {
out = new ByteArrayOutputStream();
in = new ByteArrayInputStream(compressed);
zin = new ZipInputStream(in);
ZipEntry entry = zin.getNextEntry();
byte[] buffer = new byte[1024];
int offset = -1;
while ((offset = zin.read(buffer)) != -1) {
out.write(buffer, 0, offset);
}
decompressed = out.toString("UTF-8");
} catch (IOException e) {
decompressed = null;
} finally {
if (zin != null) {
try {
zin.close();
} catch (IOException e) {
}
}
if (in != null) {
try {
in.close();
} catch (IOException e) {
}
}
if (out != null) {
try {
out.close();
} catch (IOException e) {
}
}
}
return decompressed;
}
}