电子税务平台Api接口-发票查验-发票验真-发票核验-发票查验真伪
随着数字化办公和财税电子化管理日益普及,发票的真实性查验已经成为企业财务、税务审计等业务流程中重要的一环。而不符合规定、虚假的发票,不得作为财务凭证,任何企业和个人有权拒收。发票查验接口即可实现发票真实性查验的功能。如对查验结果有疑议,可持发票原件至当地税务机关进行鉴定。
开发者可通过编程方式将发票查验接口集成到自己的系统中,输入发票号码、发票代码、开票金额和开票日期或上传发票版式文件(pdf、ofd或xml),即可实现在线实时查询发票信息,辨别发票真伪等功能。
1、支持多种发票类型
增值税专用发票
普通发票
机动车销售发票
二手车销售发票
通行费发票
航空运输电子客票行程单
铁路电子客票
财政发票
区块链发票
通用电子发票
2、可查验的时间范围
可查验最近5年内开具的发票;
当日开具的发票当日可进行查验;
3、实现方式
接入发票查验接口a.cnhue.cn/MHAomyC即可实现发票查验功能
输入参数
| 名称 | 类型 | 必须 | 说明 |
|---|---|---|---|
| appId | String | 是 | 用户唯一标识 |
| timestamp | Long | 是 | 当前时间戳 |
| sign | String | 是 | 签名,详见签名算法说明 |
| fpdm | String | 否 | 发票代码 非全电发票必填 |
| fphm | String | 是 | 发票号码 |
| kprq | String | 是 | 开票日期 格式YYYYMMDD |
| jym | String | 否 | 校验码后 6 位, 增值税普通发票、增值税电子普通发票、增值税普通发票(卷式)、增值税电子普通发票(通行费)必填 |
| je | String | 否 | 增值税专用发票、增值税电子专用发票、机动车销售统一发票输入不含税金额;二手车销售统一发票输入车价合计;全电发票输入价税合计 |
签名算法
sign = sha256(appId + appSecret + timestamp)
用 appId、 appSecret,当前时间时间戳 timestamp,按上述顺序拼接成字符串,再进行 sha256 哈希得到。如下:
String appId = "xyzxy2121zxyz";
String timestamp = "1555378976238";
String appSecret = "efcefcef1121cefcefc1212121";
String str = appId + appSecret + timestamp;
String sign = sha256(str);
响应示例
以增值税专用发票为例
{
"code": 200, // 返回码,详见code返回码说明
"msg": "成功", //code对应的描述
"taskNo": "12552230716560623515", // 本次唯一请求号
"charge": true, // 计费标志
"data": {
"fplx": "01", // 发票类型,详见发票类型说明
"times": 4, // 查验次数(第几次)
"xfsbh":"1522***********K01451", //销方识别号
"gfmc":"东方****有限公司", //购方名称
"gmfyhzh":"工行杭州景江苑支行 12******************36", //购买方银行账号
"xhqdBz":"N", //清单标志:发票明细中是否有清单行(Y清单 N非清单)
"dkXsfmc":"马*弟<", //代开销售方名称
"dq":"内蒙古自治区", //地区
"tspzDm": "", // 特殊票种代码,02农产品收购发票 08成品油发票
"xsfdzdh":"乌兰浩特市 1584****535", //销售方地址电话
"se":240, //税额
"kprq":"2022-01-04 00:00:00", //开票日期
"bz":"代开企业税号:15222*****71610 代开企业名称:马*弟<br/>房屋坐落地址:乌兰浩特市爱国小区*号楼", //备注
"kjlx":"2", //开具类型
"fpztDm":"0", //发票状态代码
"sbbh":"661816407119", //设备编号
"gfsbh":"91330********66XE", //购方识别号
"fpdm":"150*****60", //发票代码
"fphm":"00****89", //发票号码
"jym":"69591030500952264929", //校验码
"dkXsfsbh":"152**************610", //代开销售方识别号
"gmfdzdh":"杭州市滨江区****66号 0571-8*****34", //购买方地址电话
"xsfyhzh":"31522***********07111", //销售方银行账号
"jshj":16800, //价税合计
"jshjcn":"壹万陆仟捌佰元整", //价税合计(中文大写)
"je":16560, //金额
"xfmc":"国家税务总局乌兰浩特市税务局第一税务分局", //销方名称
"txfbz":"Y",//如果是通行费,则有该字段,Y表示该通行费可抵扣,N表示不可以抵扣 //通行费标识
"tspzDm": "86",//特殊票种,02-农产品收购;03-稀土矿产品发票;04-稀土产成品发票;05-石脑油;06-通行费可抵扣;07-通行费(不可抵扣);08-成品油发票;12-机动车; 76-报废产品收购;77-报废产品收购; 83-建筑服务; 84-货物运输服务; 85-不动产销售; 86-不动产经营租赁服务; 89-旅客运输服务; 92-自产农产品销售; 93-拖拉机按减征税; 96-农产品收购;其它为空;
"hwxx":[ //货物信息
{
"ggxh":"", //规格型号
"jldw":"套", //计量单位
"dj":"16560.00", //单价
"mxxh":1, //明细序号
"se":240, //税额
"ysse":"240", //原始税额
"mc":"房屋租赁(20220101-20221231)", //名称
"sl":"1", //数量
"je":16560, //金额
"slv":0.015, //税率
"ysslv":"1.5%", //原始税率
"spbm":"" //商品编码
}
]
}
}
示例(java)
import com.anq.core.utils.HttpUtil;
import com.anq.core.utils.JsonUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.digest.DigestUtils;
import org.junit.Test;
import java.util.HashMap;
import java.util.Map;
@Slf4j
public class Examples {
String appId = "聚美智数分配的appId";
String appSecret = "聚美智数分配的appSecret";
String apiUrl = "";
@Test
public void examples() {
long timestamp = System.currentTimeMillis();
String sign = DigestUtils.sha256Hex(appId + appSecret + timestamp); // 生成sign
Map<String, Object> params = new HashMap<String, Object>();
params.put("appId", appId); // 聚美智数分配的appId
params.put("timestamp", timestamp);
params.put("sign", sign);
params.put("productCode", "invoice_validate_v2");// 固定值
params.put("fpdm", ""); // 发票代码 ,发票代码 非全电发票必填
params.put("fphm", ""); // 发票号码
params.put("kprq", ""); // 开票日期 ,格式YYYYMMDD
params.put("jym", ""); // 校验码后6位 ,增值税普通发票、增值税电子普通发票、增值税普通发票(卷式)、增值税电子普通发票(通行费)必填
params.put("je", ""); // 金额 ,增值税专用发票、增值税电子专用发票、机动车销售统一发票输入**不含税金额**; 二手车销售统一发票输入**车价合计**; 全电发票输入**价税合计**
// HttpUtil可从这里下载 https://file.jumdata.com/support/HttpUtil.java
String resultJson = HttpUtil.postForm(apiUrl, null, params);
log.info(resultJson);
// JumeiOpenApiResponse 可从这里下载 https://file.jumdata.com/support/JumeiOpenApiResponse.java
// JsonUtil可从这里下载 https://file.jumdata.com/support/JsonUtil.java
JumeiOpenApiResponse jumeiOpenApiResponse = JsonUtil.toObject(resultJson, JumeiOpenApiResponse.class)
if(jumeiOpenApiResponse.getCode() == 200){
//TODO
}else{
//TODO
}
}
}
浙公网安备 33010602011771号