请求开具发票接口
填写发票销方、购方、明细等信息并发起开票请求。
1.请求参数:
请求URL:
参数名 | 类型 | 必须 | 示例值 | 说明 |
---|---|---|---|---|
appid | String | true | uwkahf@jfs92 | 合作伙伴AppId |
timestamp | String | true | 1633618722 | 当前时间戳 |
sign | String | true | 999de41d862efaa6f1084ead3b3ba480 | 如何计算生成见示例代码 |
tax_num | String | true | 4214132412414 | 销售方税号 |
sale_name | String | true | 上海XXX科技有限公司 | 销售方企业全称 |
request_data | Json | true | 见示例代码 | 开票业务报文 |
2. 请求示例代码(Java)
@Test
public void NNBillingNEW() throws Exception {
// 销售方公司全名
String saleName = "上海XXX科技有限公司";
// 销售方公司税号
String saleTaxNum = "xxxxxxxxxx";
// 回调地址,需要公网能访问
String notifyUrl = "http://youdomain.com/fc/nuonuo/notify";
BillingNewRequest billingNewRequest = new BillingNewRequest();
Order order =new Order();
// 以下入参是必须或是重要
order.setBuyerName("上海xxxxxx科技有限公司");
order.setBuyerTaxNum("91310000MA7EFBKaa3");
order.setSalerTel("0571-77777777");
order.setSalerAddress("杭州市西湖区文三路200号");
// 生成订单号,按规则年月日小时分秒+6位流水号
String orderNo = Utils.generateOrderNumber();
order.setOrderNo(orderNo);
order.setInvoiceDate("2023-12-13 12:30:00");
order.setClerk("张三");
// 清单标志:非清单:0;清单:1,默认:0,电票固定为0
order.setListFlag("0");
// 买方的推送邮箱(pushMode为0或2时,此项为必填,同时受企业资质是否必填控制)
order.setEmail("xxxxxxxxxxx@163.com");
// 推送方式:-1,不推送;0,邮箱;1,手机(默认);2,邮箱、手机
order.setPushMode("0");
order.setInvoiceType("1");
// 回调地址
order.setCallBackUrl(notifyUrl);
// 全电就是代表全电账号,电子税务局是用账号来开发票的,税盘的是税盘本来就有的分机号,税局发行的上面有
order.setExtensionNumber("923");
// 发票种类, bs:电子发票(增值税专用发票)-即数电专票(电子)
order.setInvoiceLine("bs");
order.setRemark("我是发票备注处的内容");
// 销方税号
order.setSalerTaxNum(saleTaxNum);
// 发票明细
InvoiceDetail invoiceDetail= new InvoiceDetail();
invoiceDetail.setSpecType("120x80");
invoiceDetail.setDField1("");
invoiceDetail.setTaxExcludedAmount("100");
invoiceDetail.setInvoiceLineProperty("0");
invoiceDetail.setFavouredPolicyName("0");
invoiceDetail.setDField3("");
invoiceDetail.setDField2("");
invoiceDetail.setDField5("");
invoiceDetail.setNum("1");
invoiceDetail.setDField4("");
invoiceDetail.setWithTaxFlag("0");
invoiceDetail.setTax("13");
invoiceDetail.setFavouredPolicyFlag("0");
invoiceDetail.setTaxRate("0.13");
invoiceDetail.setUnit("张");
invoiceDetail.setDeduction("0");
invoiceDetail.setPrice("100");
invoiceDetail.setZeroRateFlag("0");
invoiceDetail.setImmediateTaxReturnType("");
invoiceDetail.setGoodsCode("1090511030000000000");
invoiceDetail.setSelfCode("130005426000000000");
invoiceDetail.setGoodsName("EM蓝板");
invoiceDetail.setTaxIncludedAmount("113");
List<InvoiceDetail> invoiceDetails = new ArrayList<InvoiceDetail>();
invoiceDetails.add(invoiceDetail);
order.setInvoiceDetail(invoiceDetails);
billingNewRequest.setOrder(order);
String content = JSON.toJSONString(billingNewRequest);
//业务参数
Map<String, String> data = new HashMap<String, String>();
data.put("appid", Config.AppId);
Long timestamp = System.currentTimeMillis() / 1000;
data.put("timestamp", timestamp.toString());
data.put("tax_num", saleTaxNum);
data.put("sale_name", saleName);
data.put("request_data",content);
// 签名
data.put("sign", Utils.Sign(data,Config.AppSecret));
// 调用服务API
String resp = doHttpRequest(Config.NN_BILLING_NEW, data);
BillingNewResponse billingNewResponse = JSON.parseObject(resp, BillingNewResponse.class);
System.out.println("code:" + billingNewResponse.getCode());
}
2.1 请求参数说明
请求入参request_data是json格式的业务报文字段,其中包含的字段含义说明如下。
名称 | 类型 | 是否必须 | 示例值 | 最大长度 | 描述 |
---|---|---|---|---|---|
order | Object | Y | 请求体 | ||
buyerName | String | Y | 企业名称/个人 | 100 | 购方名称 |
buyerTaxNum | String | N | 339901999999198 | 20 | 购方税号(企业要填,个人可为空;数电专票、二手车销售统一发票时必填) |
buyerTel | String | N | 0571-88888888 | 50 | 购方电话(购方地址+电话总共不超100字符;二手车销售统一发票时必填) |
buyerAddress | String | N | 杭州市 | 80 | 购方地址(购方地址+电话总共不超100字符;二手车销售统一发票时必填) |
buyerAccount | String | N | 中国工商银行 111111111111 | 100 | 购方银行开户行及账号 |
salerTaxNum | String | Y | 339901999999199 | 20 | 销方税号(使用沙箱环境请求时消息体参数salerTaxNum和消息头参数userTax填写339902999999789113) |
salerTel | String | Y | 0571-77777777 | 20 | 销方电话(在诺税通saas工作台配置过的可以不传,以传入的为准) |
salerAddress | String | Y | 80 | 销方地址(在诺税通saas工作台配置过的可以不传,以传入的为准) | |
salerAccount | String | N | 100 | 销方银行开户行及账号(二手车销售统一发票时必填) | |
showBankAccountType | String | N | 0 | 2 | 不传默认为0:都不显示;传1:备注仅显示销方开户行及账号;传2:备注仅显示购方开户行及账号;传3:购销方开户行及账号都显示(此字段仅在数电普票和数电专票下生效) |
orderNo | String | Y | 201701053332079312313 | 20 | 订单号(每个企业唯一) |
invoiceDate | String | Y | 2022-01-13 12:30:00 | 20 | 订单时间 |
invoiceCode | String | N | 12 | 冲红时填写的对应蓝票发票代码(红票必填 10位或12 位, 11位的时候请左补 0) | |
invoiceNum | String | N | 8 | 冲红时填写的对应蓝票发票号码(红票必填,不满8位请左补0) | |
redReason | String | N | 1 | 1 | 冲红原因:1:销货退回;2:开票有误;3:服务中止;4:发生销售折让(开具红票时且票种为p,c,e,f,r需要传–成品油发票除外;不传时默认为 1) |
billInfoNo | String | N | 1403011904008472 | 24 | 红字信息表编号.专票冲红时此项必填,且必须在备注中注明“开具红字增值税专用发票信息表编号ZZZZZZZZZZZZZZZZ”字样,其 中“Z”为开具红字增值税专用发票所需要的长度为16位信息表编号(建议16位,最长可支持24位)。 |
departmentId | String | N | 9F7E9439CA8B4C60A2FFF3EA3290B088 | 32 | 部门门店id(诺诺系统中的id) |
clerkId | String | N | 32 | 开票员id(诺诺系统中的id) | |
remark | String | N | 备注信息 | 230 | 冲红时,在备注中注明“对应正数发票代码:XXXXXXXXX号码:YYYYYYYY”文案,其中“X”为发票代码,“Y”为发票号码,可以不填,接口会自动添加该文案;机动车发票蓝票时备注只能为空;数电票时最长为200字符 |
checker | String | N | 王五 | 20 | 复核人(数电电票时若有值,会显示在生成的PDF/OFD备注栏中) |
payee | String | N | 李四 | 20 | 收款人(数电电票时若有值,会显示在生成的PDF/OFD备注栏中) |
showCheckerType | String | N | 0 | 2 | 数电电票是否展示收款人和复核人,0:不显示 1:显示 |
clerk | String | Y | 张三 | 20 | 开票员(数电票时需要传入和开票登录账号对应的开票员姓名) |
listFlag | String | N | 0 | 1 | 清单标志:非清单:0;清单:1,默认:0,电票固定为0 |
listName | String | N | 详见销货清单 | 92 | 清单项目名称:对应发票票面项目名称(listFlag为1时,必填,默认为“详见销货清单”) |
pushMode | String | N | 1 | 2 | 推送方式:-1,不推送;0,邮箱;1,手机(默认);2,邮箱、手机 |
buyerPhone | String | Y | 15858585858 | 20 | 购方手机(pushMode为1或2时,此项为必填,同时受企业资质是否必填控制) |
String | Y | test@xx.com | 50 | 推送邮箱(pushMode为0或2时,此项为必填,同时受企业资质是否必填控制) | |
ccPhone | String | N | 18399887766,18399882211 | 100 | 抄送手机,多个时用英文逗号隔开,最多支持5个,必须在phone字段有值时,才支持传入 |
ccEmail | String | N | nuonuowang@qq.com,hahaha@qq.com | 250 | 抄送邮箱,多个时用英文逗号隔开,最多支持5个,必须在email字段有值时,才支持传入 |
invoiceType | String | Y | 1 | 1 | 开票类型:1:蓝票;2:红票 (数电票冲红请对接数电快捷冲红接口) |
invoiceLine | String | N | p | 2 | 发票种类:p,普通发票(电票)(默认);c,普通发票(纸票);s,专用发票;e,收购发票(电票);f,收购发票(纸质);r,普通发票(卷式);b,增值税电子专用发票;j,机动车销售统一发票;u,二手车销售统一发票;bs:电子发票(增值税专用发票)-即数电专票(电子),pc:电子发票(普通发票)-即数电普票(电子),es:数电纸质发票(增值税专用发票)-即数电专票(纸质);ec:数电纸质发票(普通发票)-即数电普票(纸质) |
paperInvoiceType | String | N | 12 | 数电纸票类型(数电纸票时才需要传):(票种为ec时,默认04;票种为es时,默认为1130); 04 2016版增值税普通发票(二联折叠票), 05 2016版增值税普通发票(五联折叠票), 000008101200 2008版增值税普票(二联),000008101500 2008版增值税普票(五联),1130 增值税专用发票(中文三联无金额限制版), 1140 增值税专用发票(中文四联无金额限制版), 1160 增值税专用发票(中文六联无金额限制版), 1170 增值税专用发票(中文七联无金额限制版) | |
specificFactor | String | N | 0 | 2 | 特定要素:0普通发票(默认)、1 成品油 、2 稀土(仅支持s、bs票种且编码必须为稀土产品目录中的商品)、3 建筑服务、4 货物运输服务、5 不动产销售、6 不动产经营租赁服务、9 旅客运输服务、12 自产农产品销售、16 农产品收购、31 建安发票 、 32 房地产销售发票、33 二手车发票反向开具、 34 电子烟、 35 矿产品 |
forceFlag | String | N | 0 | 2 | 是否强制开具标识:0 否、1 是 (发票种类为u,且特定要素为 33-二手车发票反向开具时才需要填; 默认为 0;若为1时,则不校验卖方自然人身份证号的合规性) |
proxyInvoiceFlag | String | N | 0 | 1 | 代开标志:0非代开;1代开。代开蓝票时备注要求填写文案:代开企业税号:,代开企业名称:;代开红票时备注要求填写文案:对应正数发票代码:号码:代开企业税号:代开企业名称: |
taxRebateProxy | String | N | 0 | 1 | 代办退税标记:0否(默认),1是;仅代办退税资质企业可传1 |
invoiceDifferenceType | String | N | 02 | 2 | 数电发票差额征税开具方式:01 全额开票,02 差额开票;非数电发票开具差额时,不传 |
callBackUrl | String | N | http:127.0.0.1/invoice/callback/ | 回传发票信息地址(开票完成、开票失败) | |
extensionNumber | String | N | 0 | 5 | 分机号(只能为空或者数字) |
terminalNumber | String | N | 4 | 终端号(开票终端号,只能 为空或数字) | |
machineCode | String | N | 123456789123 | 12 | 机器编号(12位盘号) |
vehicleFlag | String | N | 1 | 1 | 是否机动车类专票 0-否 1-是 |
hiddenBmbbbh | String | N | 0 | 1 | 是否隐藏编码表版本号 0-否 1-是(默认0,在企业资质中也配置为是隐藏的时候,并且此字段传1的时候代开发票 税率显示***) |
nextInvoiceCode | String | N | 12 | 指定发票代码(票种为c普纸、f收购纸票时允许指定卷开具) 非必填 | |
nextInvoiceNum | String | N | 8 | 发票起始号码,当指定代码有值时,发票起始号码必填 | |
invoiceNumEnd | String | N | 8 | 发票终止号码,当指定代码有值时,发票终止号码必填 | |
surveyAnswerType | String | N | 1 | 3%、1%税率开具理由(企业为小规模/点下户时才需要),对应值:1-开具发票为2022年3月31日前发生纳税义务的业务; 2-前期已开具相应征收率发票,发生销售折让、中止或者退回等情形需要开具红字发票,或者开票有误需要重新开具; 3-因为实际经营业务需要,放弃享受免征增值税政策 | |
buyerManagerName | String | N | 张三 | 16 | 购买方经办人姓名(数电票特有字段) |
managerCardType | String | N | 201 | 40 | 经办人证件类型:101-组织机构代码证, 102-营业执照, 103-税务登记证, 199-其他单位证件, 201-居民身份证, 202-军官证, 203-武警警官证, 204-士兵证, 205-军队离退休干部证, 206-残疾人证, 207-残疾军人证(1-8级), 208-外国护照, 210-港澳居民来往内地通行证, 212-中华人民共和国往来港澳通行证, 213-台湾居民来往大陆通行证, 214-大陆居民往来台湾通行证, 215-外国人居留证, 216-外交官证 299-其他个人证件(数电发票特有) |
managerCardNo | String | N | 20 | 经办人证件号码(数电票特有字段) | |
bField1 | String | N | 255 | 业务方自定义字段1,本应用只作保存 | |
bField2 | String | N | 255 | 业务方自定义字段2,本应用只作保存 | |
bField3 | String | N | 255 | 业务方自定义字段3,本应用只作保存 | |
naturalPersonFlag | String | N | 0 | 1 | 购买方自然人标志:0-否(默认),1-是;仅在开具数电普票(电子)时使用,如受票方(发票抬头)为自然人,并要求能将发票归集在个人票夹中展示,需提供姓名及身份证号(自然人纳税人识别号),此参数传入1;如受票方(发票抬头)为个体工商户,需提供社会统一信用代码或纳税人识别号,此参数传入0 |
certificateType | String | N | 201 | 数电农产品收购发票销售方证件类型,数电农产品收购必传,对应buyerTaxNum字段。103 税务登记证,201 居民身份证,208 外国护照,210 港澳居民来往内地通行证,213 台湾居民来往大陆通行证,215 外国人居留证,219 香港永久性居民身份证,220 台湾身份证,221 澳门特别行政区永久性居民身份证,233 外国人永久居留身份证(外国人永久居留证),299 其他个人证件 | |
taxNumVerifyFlag | String | N | 1 | 对购方税号校验( 0-不校验 1-校验,仅对数电票有效,未传时则取企业配置的值;注:若开启校验,当购方税号未能在电子税局中找到时 则会开票失败) | |
naturalPersonVerifyFlag | String | N | 1 | 对购方名称校验( 0-不校验 1-校验,仅对数电普票(电子)有效,未传时则取企业配置的值;若开启校验,当开具非自然人标记的数电普票(电子)时,将限制对于“购买方名称长度小于等于4位”的发票的开具) | |
+invoiceDetail | Array | Y | 100 | 发票明细,支持填写商品明细最大2000行(包含折扣行、被折扣行) | |
— goodsName | String | Y | 电脑 | 90 | 商品名称(如invoiceLineProperty =1,则此商品行为折扣行,折扣行不允许多行折扣,折扣行必须紧邻被折扣行,商品名称必须与被折扣行一致) |
— goodsCode | String | N | 1090511030000000000 | 19 | 商品编码(商品税收分类编码开发者自行填写) |
— selfCode | String | N | 130005426000000000 | 16 | 自行编码(可不填) |
— withTaxFlag | String | Y | 1 | 1 | 单价含税标志:0:不含税,1:含税 |
— price | String | N | 16 | 单价(精确到小数点后8位),当单价(price)为空时,数量(num)也必须为空;(price)为空时,含税金额(taxIncludedAmount)、不含税金额(taxExcludedAmount)、税额(tax)都不能为空 | |
— num | String | N | 16 | 数量(精确到小数点后8位,开具红票时数量为负数) | |
— unit | String | N | 台 | 20 | 单位 |
— specType | String | N | y460 | 40 | 规格型号 |
— tax | String | N | 0.12 | 16 | 税额(精确到小数点后2位),[不含税金额] * [税率] = [税额];税额允许误差为 0.06。红票为负。不含税金额、税额、含税金额任何一个不传时,会根据传入的单价,数量进行计算,可能和实际数值存在误差,建议都传入 |
— taxRate | String | Y | 0.13 | 10 | 税率,注:1、纸票清单红票存在为null的情况;2、二手车发票税率为null或者0 |
— taxExcludedAmount | String | N | 0.88 | 16 | 不含税金额(精确到小数点后2位)。红票为负。不含税金额、税额、含税金额任何一个不传时,会根据传入的单价,数量进行计算,可能和实际数值存在误差,建议都传入 |
— taxIncludedAmount | String | N | 1 | 16 | 含税金额(精确到小数点后2位),[不含税金额] + [税额] = [含税金额],红票为负。不含税金额、税额、含税金额任何一个不传时,会根据传入的单价,数量进行计算,可能和实际数值存在误差,建议都传入 |
— invoiceLineProperty | String | N | 0 | 1 | 发票行性质:0,正常行;1,折扣行;2,被折扣行,红票只有正常行 |
— favouredPolicyFlag | String | N | 0 | 2 | 优惠政策标识:0,不使用;1,使用; 数电票时: 01:简易征收 02:稀土产品 03:免税 04:不征税 05:先征后退 06:100%先征后退 07:50%先征后退 08:按3%简易征收 09:按5%简易征收 10:按5%简易征收减按1.5%计征 11:即征即退30% 12:即征即退50% 13:即征即退70% 14:即征即退100% 15:超税负3%即征即退 16:超税负8%即征即退 17:超税负12%即征即退 18:超税负6%即征即退 |
— immediateTaxReturnType | String | N | 01 | 2 | 即征即退类型标识:01-软件产品,02-资源综合利用产品 03-管道运输服务,04-有形动产融资租赁服务,05-有形动产融资性售后回租服务,06-新型墙体材料,07-风力发电产品,08-光伏发电产品,09-动漫软件产品,10-飞机维修劳务,11-黄金,12-铂金。已在税局进行增值税即征即退备案的企业,再开具商编属于即征即退类型范围内的商品时必传,可用于次月退税。非备案客户忽略。红票、折扣行不支持传入。 |
— favouredPolicyName | String | N | 0 | 50 | 增值税特殊管理(优惠政策名称),当favouredPolicyFlag为1时,此项必填 (数电票时为空) |
— deduction | String | N | 0 | 16 | 扣除额,差额征收时填写,目前只支持填写一项。 注意:当传0、空或字段不传时,都表示非差额征税;传0.00才表示差额征税:0.00 (数电票暂不支持) |
— zeroRateFlag | String | N | 0 | 1 | 零税率标识:空,非零税率;1,免税;2,不征税;3,普通零税率;1、当税率为:0%,且增值税特殊管理:为“免税”, 零税率标识:需传“1” 2、当税率为:0%,且增值税特殊管理:为”不征税” 零税率标识:需传“2” 3、当税率为:0%,且增值税特殊管理:为空 零税率标识:需传“3” (数电票时为空) |
— dField1 | String | Y | 255 | 业务方明细自定义字段1,本应用只作保存 | |
— dField2 | String | Y | 255 | 业务方明细自定义字段2,本应用只作保存 | |
— dField3 | String | Y | 255 | 业务方明细自定义字段3,本应用只作保存 | |
— dField4 | String | Y | 255 | 业务方明细自定义字段4,本应用只作保存 | |
— dField5 | String | Y | 255 | 业务方明细自定义字段5,本应用只作保存 | |
3. 返回结果
本次接口只是提交开票申请,开票结果不是实时返回,而是税务局侧开票完成后,再异步通知返回。
注意:若相同使用订单号相同的开票申请,而之前开票又是成功情况下,则接口直接返回开票结果(发票pdf下载地址和发票号)。
3.1 首次开票成功
,返回结果如下
{
"code": 0,
"invoice_serial_num": "23122512180201522056",
"message": "开票提交成功"
}
开票提交成功后,平台将通知税务局生成发票结果(如发票号,pdf下载地址等), 并通过通步通知将结果回调给开发者, 见文档: https://doc.fw199.com/docs/h7b/nuonuo-billingnew-notify
3.1 重复提交开票成功返回
如果是相同的订单号重复提交,并且之前已经开具成功,则返回如下:
{
"code": 100,
"invoice_down_url": "https://inv.jss.com.cn/fp2/7B_nQ3OJ3-2NJfvYvIWK2y_iM4Na41Laty9izcQPzmyeu448MWu7sx-Otdv0m4azSYGjYKCnv7aZHLA6uC88-w.pdf",
"invoice_no": "20882312250039010320",
"message": "发票已经生成,不需要重复提交"
}
如果code返回100时,说明开票已经成功,返回字段会包含发票下载地址invoice_down_url和发票号invoice_no。
3.1 开票失败时返回
比如开票提交的数据不对,逻辑上有问题,开票请求没有被受理,则返回code为其他值(注意:code不是0或100),不一定只是code为3是失败,或存在其他值。
{
"code": 3,
"message": "NN返回错误:第1条明细中(不含税金额+税额)不等于含税金额",
"trace_id": ""
}
4 返回参数说明
参数接口 | 参数类型 | 例子 | 说明 |
---|---|---|---|
code | int | 0 | 0或100表示成功,其他值为失败 |
message | String | 开票提交成功 | 成功或失败时的提示消息 |
invoice_serial_num | String | 23122512180201522056 | 请求流水号 |
invoice_down_url | String | https://inv.jss.com.cn/fp2/7B_nQ3OJ3-2NJfvYvIWK2y_iM4Na41Laty9izcQPzmyeu448MWu7sx-Otdv0m4azSYGjYKCnv7aZHLA6uC88-w.pdf | 发票PDF下载地址 |
invoice_no | String | 20882312250039010320 | 电子发票上面的发票号 |
文档更新时间: 2024-01-22 12:03 作者:admin