全电发票开票API接口文档与乐企接口

2024-03-25 16:20

本文主要是介绍全电发票开票API接口文档与乐企接口,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  什么是数电票、全电发票? 

      全面数字化的电子发票(简称全电发票、数电票)是与纸质发票具有同等法律效力的全新发票,不以纸质形式存在、不用介质支撑、无须申请领用、发票验旧及申请增版增量。纸质发票的票面信息全面数字化,多个票种集成归并为电子发票单一票种,全国统一赋码、开具金额总额度管理、自动流转交付。以下简称为全电发票。

  1. 所有接口通用的求格式

HTTP请求URL

https://fpkj.market.alicloudapi.com/kpgl/fpkj

请求方式

POST

接口请求头部信息ContentType

application/x-www-form-urlencoded;charset=UTF-8

HTTP请求参数格式

DATA

HTTP返回参数格式

JSON

2、全电发票开具接口 

接口地址:

https://fpkj.market.alicloudapi.com/kpgl/fpkj

参数

token=&data=[发票报文json的base64]&spid=

明:(注意:data有[])下面

字段

描述

data

发票报文json的base64,同时需要对base64用[]括号起来

spid

税盘id

发票报文JSON如下(注意:报文节点全大写):

[{
    "XTLSH": "单据号",
    "KHMC": "客户名称",
    "KHSH": "税号",
    "KHDZ": "地址",
    "KHKHYHZH": "客户银行账号",
    "FPZL": "发票种类",
    "BZ": "备注",
    "KPR": "开票人",
    "SKR": "收款人",
    "FHR": "复核人",
    "QYKHYHZH": "企业开户银行账号",
    "QYDZDH": "企业地址电话",
    "YFPHM": "红冲原发票号",
    "XXBBH": "信息表编号",
    "QDBZ": "清单标志",
    "KHYJ": "客户邮件",
    "KHSJ": "客户手机号",
"JDC": "机动车标识",
"DBTS": "代办退税标识",
    "ITEM": [{
        "CPMC": "产品名称1",
        "CPXH": "产品型号",
        "CPDW": "产品单位",
        "SL": "税率",
        "CPSL": "数量",
        "BHSJE": "不含税金额",
        "SE": "税额",
        "FLBM": "分类编码",
        "XSYH": "税率优惠",
        "LSLBZ": "零税率标识",
"YHSM": "优惠说明",
        "KCJE":"0"
    }, {
        "CPMC": "产品名称2",
        "CPXH": "产品型号",
        "CPDW": "产品单位",
        "SL": "税率",
        "CPSL": "数量",
        "BHSJE": "不含税金额",
        "SE": "税额",
        "FLBM": "分类编码",
        "XSYH": "税率优惠",
"LSLBZ": "零税率标识",
"YHSM": "优惠说明",
        "KCJE":"0"
    }]
}]

字段

是否必需(否的节点,可以不带此节点)

描述

说明

XTLSH

单据号(相当于订单号)

唯一字段

KHMC

客户名称

KHSH

客户税号

KHDZ

客户地址

KHKHYHZH

开户银行账号

FPZL

发票种类

 020 全电专票 021 全电普票

BZ

备注

KPR

开票人

SKR

收款人

FHR

复核人

QYKHYHZH

销方银行账号

QYDZDH

销方地址电话

YFPHM

条件是

原发票号(原发票代码+原发票号码)

红字发票必传,普票和电票必有,注意:含(代码)总共18位或20位。

XXBBH

条件是

信息表编号

红字专票必传,普票电票不需要传。

QDBZ

清单标志

默认为0

KHYJ

客户邮件

自动发邮件

KHSJ

客户手机

JDC

机动车标识

1为开具机动车专票

DBTS

代办退税标识

1为开具代办退税发票

ITEM信息

CPMC

产品名称

如果是折扣行,必需与正数行一致的名称

CPXH

产品型号

如果是折扣行,此值为空

CPDW

产品单位

如果是折扣行,此值为空

SL

税率

CPSL

产品数量

红冲时为负,红冲时,不能有正数金额。

BHSJE

不含税金额

红冲时为负

SE

税额

红冲时为负

FLBM

分类编码

必需到未级编码

XSYH

税收优惠

有优惠1 无优惠0

LSLBZ

零税率标识

SL=0时需要设置

1、免税(同时XSYH需设置成1),2、不征税(同时XSYH需设置成1),3、其它或0税率

Sl<>0时,值为空

YHSM

优惠政策说明

KCJE

扣除金额

差额开票时有用

{

"Reulst": "1",

"Message": "",

"SucessList": [{

"xtlsh": "001",

"fpzl": "",

"fpdm": "1233456789012",

"fphm": "12345678",

"kprq": "2023-01-12T11:20:33",

"skm": "税控码",

"jym": "校验码",

"ewm": "二维码",

"url": "",

"kpjg": "",

"kpfk": ""

}],

"ErrList": [{

"XTLSH": "",

"ErrMsg": ""

}]

}

注意:

Result=0时,说明数据肯定是有异常或流程有异常,此时需要关注下Message这个值。

Result=1时,不代表一定是开票成功,当离线开票或税盘不在线时可能代表接收成功,如果是批量开票时,还需要关注下ErrList这个值,此时有可能是部份成功,部份不成功。

唯一能确定开票成功开票的情况: SucessList列表并且发票号不是为空的情况,如果Result=1并且SucessList列表中返回的发票号码是空的,需要用异步获取开票结果进行获取开票状态。

--------------以上是全电接口--------------分割线--------------以下是乐企开票接口--------------


3.1 乐企录入发票信息接口的字段说明与校验规则
    依据发票开具的要求,录入发票信息,并依据发票开具规则对发票信息进行业务逻辑校验,主要包括合规性校验、数值校验。 
    合规性校验主要对输入参数的类型、长度、是否必填、码值进行校验。以下任意一项不满足要
求时,阻断发票开具。校验规则如下:
● 发票号码,必填,长度20位,由数字组成,前2位为年份后2位。
● 蓝字发票标志,必填,取值范围为“0”、“1”.
● 平台编号,必填,最大长度20位。
● 服务器地址,必填,长度20位。
● mac地址,必填,长度20位。
● CPU序列号,选填,长度20位。
● 主板序列号,选填,长度20位。
● 发票票种,必填,取值范围为“01”、“02”。
● 购买方自然人标志,选填,取值范围为“Y”、“N”。
● 特定要素,选填,必须为空。
● 区域代码,必填,最大长度20位。
● 收购发票类型代码,选填,必须为空。
● 差额征税类型代码,选填,取值范围为“空”、“01”、“02”。
● 出口业务适用政策代码,选填,取值范围为“空”、“01”、“02”、“03”。
● 增值税即征即退代码,选填,取值范围为“空”、“01”、“02”、“03”、“04”、
“05”、“06”、“07”、“08”、“09”、“10”、“11”、“12”。
● 销售方纳税人识别号,必填,最大长度20位,由数字和大写字母组成。
● 销售方名称,必填,最大长度300位。
● 销售方地址,选填,最大长度300位。
● 销售方电话,选填,最大长度60位。
● 销售方开户行,选填,最大长度120位。
● 销售方账号,选填,最大长度50位。
● 购买方纳税人识别号,选填,最大长度 20位(开具数电专票时,必填)。
● 购买方名称,必填,最大长度300位。
● 购买方地址,选填,最大长度300位。
● 购买方电话,选填,最大长度60位。
● 购买方开户行名称,选填,最大长度120位。
● 购买方开户行银行账号,选填,最大长度100位。
● 经办人,选填,最大长度150位。
● 经办人身份证件号码,选填,最大长度 30位。
● 经办人联系电话,选填,最大长度60位。
● 合计金额,必填,最大长度18位,最多2位小数。
● 合计税额,必填,最大长度18位,最多2位小数。
● 价税合计,必填,最大长度18位,最多2位小数。
● 收款银行名称,选填,最大长度120位。
● 收款银行账号,选填,最大长度100位。
● 结算方式,选填,取值范围为“01”、“02”、“03”、“04”、“05”、“99”。
● 应税行为发生地,选填,最大长度11位。
● 开票人,必填,最大长度300位,必须与申请接入时配置的开票员一致。
● 开票人证件号码,必填,最大长度30位,必须是开票人证件类型对应的证件号码,并且与平台
维护的信息一致。
● 开票人证件类型,必填,最大长度4位,取值范围为“100”,“ 101”,“ 102”,“
103”,“ 199”,“ 200”,“ 201”,“ 202”,“ 203”,“ 204”,“ 205”,“ 206”,“
207”,“ 208”,“ 209”,“ 210”,“ 211”,“ 212”,“ 213”,“ 214”,“ 215”,“
216”,“ 217”,“ 218”,“ 219”,“ 220”,“ 221”,“ 222”,“ 223”,“ 224”,“
225”,“ 220”,“ 227”,“ 228”,“ 229”,“ 230”,“ 231”,“ 232”,“ 233”,“
234”,“ 235”,“ 236”,“ 237”,“ 238”,“ 239”,“ 240”,“ 241”,“ 291”,“
299”。
● 对应蓝字发票号码,选填,长度20位。
● 红字确认信息单编号,选填,最大长度20位。
● 红字确认单uuid,选填,最大长度32位。
● 备注,选填,最大长度450位。
● 开票日期,必填,格式必须是“yyyy-MM-dd HH:mm:ss”。
● 是否展示销售方银行账号标签,选填,最大长度1位。
● 是否展示购买方银行账号标签,选填,最大长度1位。
● 收款人姓名,选填,最大长度150位。
● 复核人姓名,选填,最大程度75位。
● 明细序号,必填,最大长度8位。
● 对应蓝字发票明细序号,选填,最大长度8位。
● 货物或应税劳务、服务名称,必填,最大长度300位。
● 商品服务简称,必填,最大长度120位。
● 项目名称,必填,最大长度600位。
● 规格型号,选填,最大长度150位。
● 单位,选填,最大长度300位。
● 数量,选填(如“单价”非空,则必填),最大长度25位。
● 单价,选填(如“数量”非空,则必填),最大长度25位。
● 金额,必填,最大长度18位,最多2位小数。
● 增值税税率/征收率,必填,最大长度16位,最多6位小数。必须在可用税率信息中存在。
● 税额,必填,最大长度18位,最多2位小数。
● 含税金额,必填,最大长度18位,最多2位小数。
● 扣除额,选填,最大长度18位,最多2位小数。
● 商品和服务税收分类合并编码,必填,最大长度19位。必须在商品编码信息中存在。
● 发票行性质,必填,取值范围为“00”、“01”、“02”。
● 优惠政策标识,选填,不为空时取值范围为“01”、“02”、“03”、“04”、“05”、
“06”、“07”、“08”、“09”、“10”、“11”、“12”、“13”、“14”、“15”、“16”、
“17”、“18”。
● 附加要素名称,选填,最大长度200位。
● 附加要素类型,选填,最大长度200位。
● 附加要素值,选填,最大长度200位

 
3.2 数电票上传接口说明
   给企业提供上传开具的数电预发票功能,上传成功后给企业返回信息。
税务局端接收到企业上传的数电票后,依次校验企业是具备开票条件、发票信息是否合规、是
否超过发票额度、数电票号码是否合法、发票是否属于直连单位,当校验不通过时,不接收企业上
传的数电票,返回具体错误信息。每次上传最大票量为100张数电票。

请求参数说明:

序号数据项标识数据项名称字段类型长度必须说明
1fphm发票号码varchar20
2lzfpbz蓝字发票标志varchar10:蓝字发票
1:红字发票
3ptbh平台编号varchar20直连单位ID
4fppz发票票种varchar201:数电专
02:数电普
5gmfzrrbz购买方自然人标志varchar1Y:购买方是自
然人
N:购买方非自
然人
6tdys特定要素varchar2空:非特定要素
01:成品油发票
02:稀土发票
0 3 : 建 筑 服 务 发

0 4 : 货 物 运 输 服
务发票
5 gmfzrrbz 购买方自然人标志 varchar 1 否
Y:购买方是自
然人
N:购买方非自
然人
6 tdys 特定要素 varchar 2 否
空:非特定要素
01:成品油发票
02:稀土发票
0 3 : 建 筑 服 务 发

0 4 : 货 物 运 输 服
务发票
7qyDm区域代码varchar20
8cezslxDm差额征税类型代码varchar2空:非差额发票
01:全额开票
02:差额开票
9sgfplxDm收购发票类型代码varchar2空:非收购发票
01:农产品收购
发票
02:光伏收购发

0 3 : 二 手 车 收 购
发票
10ckywsyzcDm出口业务适用政策代 码varchar2空:非出口业务
01:退税政策
02:免税政策
03:征税政策
11zzsjzjtDm增值税即征即退代码varchar2空:非增
01:软件产品发票
02:资源综合利用产品发票
03:管道运输服务发票
04:有形动产融资租赁服务
05:有形动产融资性售后回租服务发票
06:新型墙体材料发票
07:风力发电产品发票
08:光伏发电产品发票
09:动漫软件产品发票
10:飞机维修劳务发票
11:黄金发票
12:铂金发票
12xsfnsrsbh(销售方)统一社
会信用代码/纳税人
识别号/身份证件号
varchar20
13xsfmc(销售方)名称varchar300
14xsfdz销售方地址varchar300
15xsfdh销售方电话varchar60
16xsfkhh销售方开户行varchar120
17xsfzh销售方账号varchar50
18gmfnsrsbh(购买方)统一社
会信用代码/纳税人
识别号/身份证件号
varchar20开具数电专票时
,必填
19gmfmc(购买方)名称varchar300
20gmfdz购买方地址varchar300
21gmfdh购买方电话varchar60
22gmfkhh购买方开户行varchar120
23gmfzh购买方账号varchar50
24gmfjbr购买方经办人姓名varchar150
25jbrsfzjhm购买方经办人证件 号码varchar30
26gmfjbrlxdh购买方经办人联系 电话varchar60
27hjje合计金额number18,2
28hjse合计税额number18,2
29jshj价税合计number18,2
30skyhmc收款银行名称varchar120
31skyhzh收款银行账号varchar100
32jsfs结算方式varchar201:现金
02:银行转账
03:票据
04:第三方支付
05:预付卡
99:其他
33ysxwfsd应税行为发生地varchar11
34kpr开票人varchar300
35kprzjhm开票人证件号码varchar30
32jsfs结算方式varchar201:现金
02:银行转账
03:票据
04:第三方支付
05:预付卡
99:其他
33ysxwfsd应税行为发生地varchar11
34kpr开票人varchar300
35kprzjhm开票人证件号码varchar30
36kprzjlx开票人证件类型varchar4201:居民身份证
202:军官证
203:武警警官证
204:士兵证205:军队离退休干部证
206:残疾人证
207:残疾军人证(1-8级)
208:外国护照
209:港澳同胞回乡证
210:港澳居民来往内地通行证
211:台胞证
212:中华人民共和国往来港澳通行证
213:台湾居民来往大陆通行证
214:大陆居民往来台湾通行证
215:外国人居留证
216:外交官证
217:使(领事)馆证
218:海员证
219:香港永久性居民身份证
220:台湾身份证
221:澳门特别行政区永久性居民身份证
222:外国人身份证件
223:高校毕业生自主创业证
224:就业失业登记证
225:退休证
220:离休证
227:中国护照
37dylzfphm对应蓝字发票号码varchar20是否蓝字发票标
志为1时,此节点
有内容
红 票 开 具 时 必 传

如 果 红 冲 的 是 税
控 发 票 , 对 应 蓝
字 发 票 号 码 的 填
写 规 则 为 税 控 发
票的发票代码+发
票号码。
38hzqrxxdbh红字确认信息单编 号varchar20是否蓝字发票标
志为1时,此节点
有内容
红票开具时必传
39hzqrduuid红字确认单uuidvarchar32是否蓝字发票标
志为1时,此节点
有内容红票开具
时必传
40bz备注varchar450
41ip服务器地址varchar20需 自 行 采 集 开 票 申请设备
42macdzmac地址char20需 自 行 采 集 开 票
申请设备
43cpuidCPU序列号char20
44zbxlh主板序列号varchar20
45kprq开票日期datetime格式:
y y y y - M M - d d
HH:mm:ss
46sfzsxsfyhzhbq是否展示销售方银 行账号标签varchar1Y:展示 N:不展示
47sfzsgmfyhzhbq是否展示购买方银 行账号标签varchar1Y:展示 N:不展示
48skrxm收款人姓名varchar150
49fhrxm复核人姓名varchar75
50mxxh明细序号Number8
51dylzfpmxxh对应蓝字发票明细 序号Number8红票必传
52xmmc项目名称varchar600
53hwhyslwfwmc货物或应税劳务、服 务名称varchar300拼 装 规 则 : “* 商 品 服 务简 称
(spfwjc)*”+
“ 项 目 名 称
(xmmc)”
54spfwjc商品服务简称varchar120
55ggxh规格型号varchar150
56dw单位varchar300
57sl数量varchar25如“单价”栏次
非空,则本栏次
必须非空
58dj单价varchar25如“数量”栏次
非空,则本栏次
必须非空
59je金额number18,2
60slv增值税税率/征收率number16,6
61se税额number18,2
62hsje含税金额number18,2
63kce扣除额number18,2
64sphfwssflhbbm商品和服务税收分类 合并编码varchar19
65fphxz发票行性质varchar200:正常行
01:折扣行
02:被折扣行
66yhzcbs优惠政策标识varchar201:简易征收
02:稀土产品
03:免税
04:不征税
05:先征后退
0 6 : 1 0 0 % 先 征
后退
07:50%先征后
退
0 8 : 按 3 % 简 易
征收
0 9 : 按 5 % 简 易
征收
1 0 : 按 5 % 简
67fjysmc附加要素名称String200
68fjyslx附加要素类型String200
69fjysz附加要素值String200


数电票上传接口报文如下:
[
    {
        "fphm": "发票号码",
        "lzfpbz": "蓝字发票标志",
        "ptbh": "平台编号",
        "fppz": "发票票种",
        "gmfzrrbz": "购买方自然人标志",
        "tdys": "特定要素",
        "qyDm": "区域代码",
        "cezslxDm": "差额征税类型代码",
        "sgfplxDm": "收购发票类型代码",
        "ckywsyzcDm": "出口业务适用政策代码",
        "zzsjzjtDm": "增值税即征即退代码",
        "xsfnsrsbh": "(销售方)统一社会信用代码/纳税人识别号/身份证件号码",
        "xsfmc": "(销售方)名称",
        "xsfdz": "销售方地址",
        "xsfdh": "销售方电话",
        "xsfkhh": "销售方开户行",
        "xsfzh": "销售方账号",
        "gmfnsrsbh": "(购买方)统一社会信用代码/纳税人识别号/身份证件号码",
        "gmfmc": "(购买方)名称",
        "gmfdz": "购买方地址",
        "gmfdh": "购买方电话",
        "gmfkhh": "购买方开户行名称",
        "gmfzh": "购买方开户行银行账号",
        "gmfjbr": "经办人",
        "jbrsfzjhm": "经办人身份证件号码",
        "gmfjbrlxdh": "经办人联系电话",
        "hjje": "合计金额",
        "hjse": "合计税额",
        "jshj": "价税合计",
        "skyhmc": "收款银行名称",
        "skyhzh": "收款银行账号",
        "jsfs": "结算方式",
        "ysxwfsd": "应税行为发生地",
        "kpr": "开票人",
        "kprzjhm": "开票人证件号码",
        "kprzjlx": "开票人证件类型",
        "dylzfphm": "对应蓝字发票号码",
        "hzqrxxdbh": "红字确认信息单编号",
        "hzqrduuid": "红字确认单uuid",
        "bz": "备注",
        "ip": "服务器地址",
        "macdz": "mac地址",
        "cpuid": "CPU序列号",
        "zbxlh": "主板序列号",
        "kprq": "开票日期",
        "sfzsxsfyhzhbq": "是否展示销售方银行账号标签",
        "sfzsgmfyhzhbq": "是否展示购买方银行账号标签",
        "skrxm": "收款人姓名",
        "fhrxm": "复核人姓名",
        "fpmxList": [
            {
                "mxxh": "明细序号",
                "dylzfpmxxh": "对应蓝字发票明细序号",
                "hwhyslwfwmc": "货物或应税劳务、服务名称",
                "spfwjc": "商品服务简称",
                "xmmc": "项目名称",
                "ggxh": "规格型号",
                "dw": "单位",
                "sl": "数量",
                "dj": "单价",
                "je": "金额",
                "slv": "增值税税率/征收率",
                "se": "税额",
                "hsje": "含税金额",
                "kce": "扣除额",
                "sphfwssflhbbm": "商品和服务税收分类合并编码",
                "fphxz": "发票行性质",
                "yhzcbs": "优惠政策标识"
            }
        ],
        "fjysList": [
            {
                "fjysmc": "附加要素名称",
                "fjyslx": "附加要素类型",
                "fjysz": "附加要素值"
            }
        ]
    }
]

以下是c#代码示例 ,和报文的SM4加解密算法

using System;
using System.Text;
using System.Text.RegularExpressions;
using Org.BouncyCastle.Asn1.GM;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Crypto.Digests;
using Org.BouncyCastle.Crypto.Engines;
using Org.BouncyCastle.Crypto.Generators;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Crypto.Signers;
using Org.BouncyCastle.Math;
using Org.BouncyCastle.Security;
using Org.BouncyCastle.Utilities.Encoders;static void Main(){       //https://lq.chinatax.gov.cn:84/access/sandbox/v2/invoke/能力编码/服务编码/  string url = "https://lq.chinatax.gov.cn:84/access/sandbox/v2/invoke/" + "202007" + "/QDFPSC";string nsrsbh = "91440101MA59LCK170";string key = "a95826561dfd68992ec1e6e43fce4737";//乐企秘钥string jrdybm = "5d2cff003e37f7ef28d1";//接入单位idstring sydwbm = "5d2cff003e37f7ef28d1";//使用单位idstring ylbm = "102301";//用例编码 string param=[{"fphm": "发票号码","lzfpbz": "蓝字发票标志","ptbh": "平台编号","fppz": "发票票种","gmfzrrbz": "购买方自然人标志","tdys": "特定要素","qyDm": "区域代码","cezslxDm": "差额征税类型代码","sgfplxDm": "收购发票类型代码","ckywsyzcDm": "出口业务适用政策代码","zzsjzjtDm": "增值税即征即退代码","xsfnsrsbh": "(销售方)统一社会信用代码/纳税人识别号/身份证件号码","xsfmc": "(销售方)名称","xsfdz": "销售方地址","xsfdh": "销售方电话","xsfkhh": "销售方开户行","xsfzh": "销售方账号","gmfnsrsbh": "(购买方)统一社会信用代码/纳税人识别号/身份证件号码","gmfmc": "(购买方)名称","gmfdz": "购买方地址","gmfdh": "购买方电话","gmfkhh": "购买方开户行名称","gmfzh": "购买方开户行银行账号","gmfjbr": "经办人","jbrsfzjhm": "经办人身份证件号码","gmfjbrlxdh": "经办人联系电话","hjje": "合计金额","hjse": "合计税额","jshj": "价税合计","skyhmc": "收款银行名称","skyhzh": "收款银行账号","jsfs": "结算方式","ysxwfsd": "应税行为发生地","kpr": "开票人","kprzjhm": "开票人证件号码","kprzjlx": "开票人证件类型","dylzfphm": "对应蓝字发票号码","hzqrxxdbh": "红字确认信息单编号","hzqrduuid": "红字确认单uuid","bz": "备注","ip": "服务器地址","macdz": "mac地址","cpuid": "CPU序列号","zbxlh": "主板序列号","kprq": "开票日期","sfzsxsfyhzhbq": "是否展示销售方银行账号标签","sfzsgmfyhzhbq": "是否展示购买方银行账号标签","skrxm": "收款人姓名","fhrxm": "复核人姓名","fpmxList": [{"mxxh": "明细序号","dylzfpmxxh": "对应蓝字发票明细序号","hwhyslwfwmc": "货物或应税劳务、服务名称","spfwjc": "商品服务简称","xmmc": "项目名称","ggxh": "规格型号","dw": "单位","sl": "数量","dj": "单价","je": "金额","slv": "增值税税率/征收率","se": "税额","hsje": "含税金额","kce": "扣除额","sphfwssflhbbm": "商品和服务税收分类合并编码","fphxz": "发票行性质","yhzcbs": "优惠政策标识"}],"fjysList": [{"fjysmc": "附加要素名称","fjyslx": "附加要素类型","fjysz": "附加要素值"}]}
]   ;string bodySm4 = Sm4Encrypt(param, key);string jg = HttpPostByJsonStringLqApi(url, jrdybm, sydwbm,"", ylbm, "application/json;charset=UTF-8", bodySm4);JObject Api_jg = JObject.Parse(jg);if ((Api_jg == null) || (Api_jg["httpStatusCode"] == null) || (Api_jg["httpStatusCode"].ToString() != "200")){TextBox1.AppendText("失败=" + message + "\r\n");}if (Api_jg["body"] == null){TextBox1.AppendText("失败,body is null=" + message + "\r\n");}  JObject body_jg = JObject.Parse(Api_jg["body"].ToString());if ((body_jg == null) || (body_jg["Response"] == null)){TextBox1.AppendText("失败,Data is null=" + message + "\r\n");return;}if ((body_jg["Response"]["Data"] == null) && (body_jg["Response"]["Error"] != null)){TextBox1.AppendText("失败:" + body_jg["Response"]["Error"].ToString() + "\r\n");return;} string Datasm4 = body_jg["Response"]["Data"].ToString(); bodySm4 = Sm4Decrypt(Datasm4, key);TextBox1.AppendText("响应乐企解密报文=" + bodySm4 + "\r\n");} /// <summary>/// SM4加密 采用SM4/ECB/PKCS5Padding/// </summary>/// <param name="plaintext">字符串内容</param>/// <param name="sm4Key">sm4秘钥</param>/// <returns></returns>public static string Sm4Encrypt(string plaintext, string sm4Key){byte[] sourceData = Encoding.UTF8.GetBytes(plaintext);byte[] keyBytes = Hex.Decode(sm4Key);// Encoding.UTF8.GetBytes(sm4Key);return Sm4Encrypt(sourceData, keyBytes);}/// <summary>/// SM4加密 采用SM4/ECB/PKCS5Padding/// </summary>/// <param name="sourceData">源数据</param>  /// <param name="keyBytes">sm4秘钥</param>/// <returns>Base64字符串</returns>public static string Sm4Encrypt(byte[] sourceData, byte[] keyBytes){KeyParameter key = ParameterUtilities.CreateKeyParameter("SM4", keyBytes);IBufferedCipher inCipher = CipherUtilities.GetCipher("SM4/ECB/PKCS5Padding");inCipher.Init(true, key);byte[] cipher = inCipher.DoFinal(sourceData);string str = Convert.ToBase64String(cipher);return str;}public string HttpPostLqApi(string Url, string JsonStrSm4, string jrdwptbh, string sydwptbh, string ylbm){System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;// 解决,未能创建 SSL/TLS 安全通道ServicePointManager.ServerCertificateValidationCallback += RemoteCertificateValidate;//验证服务器证书回调自动验证HttpWebRequest webrequest = (HttpWebRequest)HttpWebRequest.Create(Url);byte[] bytes = System.Text.Encoding.GetEncoding("UTF-8").GetBytes(JsonStrSm4);webrequest.ContentType = "application/json;charset=UTF-8";webrequest.Headers.Add("jrdwptbh", jrdwptbh);webrequest.Headers.Add("sydwptbh", sydwptbh);webrequest.Accept = "application/json";webrequest.Headers.Add("sxcsbz", "1");//沙箱测试标志 ,仅适用于能力开通后 或能力审核中时进行 沙箱调用,能力未提交 审核前不要加上此参 数//if (ylbm != "") webrequest.Headers.Add("ylbm", ylbm);webrequest.Headers.Add("ylbm", ylbm);webrequest.Referer = Url;webrequest.Method = "POST";webrequest.ContentLength = bytes.Length;webrequest.Timeout = 60 * 1000;using (Stream requestStream = webrequest.GetRequestStream()){requestStream.Write(bytes, 0, bytes.Length);requestStream.Close();}HttpWebResponse webreponse = null;try{webreponse = (HttpWebResponse)webrequest.GetResponse();}catch (WebException ex){webreponse = (HttpWebResponse)ex.Response;};Stream responseStream = webreponse.GetResponseStream();string resp = string.Empty;using (StreamReader reader = new StreamReader(responseStream)){resp = reader.ReadToEnd();}return resp;}

以下Java的调用示例,和报文的SM4加解密算法


import static channel.Channel.*;public class JDKPMain {static String key = "乐企";//乐企秘钥static String jrdybm = "";//接入单位idstatic String sydwbm = "";//使用单位idstatic String ylbm ="" ;//用例编码static String nsrsbh = "";//纳税人识别号public static void main(String[] args) {CXNSRJBXX();}/*** 查询纳税人基本信息*/private static void CXNSRJBXX() {String url = "https://lq.chinatax.gov.cn:84/access/v2/invoke/202007/CXNSRJBXX";String param = "{\"nsrsbh\":\""+nsrsbh+"\"}";request(url, param, key, jrdybm, sydwbm, ylbm);}}package channel;import com.alibaba.fastjson.JSON;
import org.apache.http.HttpEntity;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.X509Certificate;
import java.util.Map;public class Channel {public static String request(String url, String param, String key, String jrdybm, String sydwbm) {return request(url,param,key,jrdybm,sydwbm,null);}public static String request(String url, String param, String key, String jrdybm, String sydwbm, String ylbm) {param = param.replace("\n","");param = param.replace("{  ","{");param = param.replace(",  ",",");param = param.replace(",  ",",");param = param.replace("[  ","[");param = param.replace("{  ","{");
//        System.out.println("\n请求乐企服务地址:" + url);System.out.println("\n");System.out.println("请求乐企原始报文:" + param);String encParam = SM4Util.encryptEcb(key, param);System.out.println("请求乐企加密报文:" + encParam);String result = postLeqi(url, encParam, jrdybm, sydwbm, ylbm);System.out.println("响应乐企原始报文:" + result);Map<String, Object> resultDTO = JSON.parseObject(result, Map.class);Map<String, Object> body = JSON.parseObject((String) resultDTO.get("body"), Map.class);Map<String, Object> response = (Map<String, Object>) body.get("Response");String data = (String) response.get("Data");String resultMsg = SM4Util.decryptEcb(key, data);System.out.println("响应乐企解密报文:" + resultMsg);return resultMsg;}public static String postLeqi(String url, String reqDTO, String jrdybm,String sydwbm, String ylbm) {try {SSLContext ctx = null;try {ctx = SSLContext.getInstance("SSL");} catch (NoSuchAlgorithmException e) {throw new RuntimeException(e);}X509TrustManager tm = new X509TrustManager() {@Overridepublic X509Certificate[] getAcceptedIssuers() {return null;}@Overridepublic void checkClientTrusted(X509Certificate[] arg0, String arg1) {}@Overridepublic void checkServerTrusted(X509Certificate[] arg0,String arg1) {}};ctx.init(null, new TrustManager[]{tm}, null);SSLConnectionSocketFactory ssf = new SSLConnectionSocketFactory(ctx, NoopHostnameVerifier.INSTANCE);HttpClient httpClient = HttpClientBuilder.create().setSSLSocketFactory(ssf).disableCookieManagement().build();HttpPost httpPost = new HttpPost(url);httpPost.addHeader("Content-Type", "application/json;charset=UTF-8");httpPost.addHeader("Accept", "application/json");httpPost.addHeader("jrdwptbh", jrdybm);httpPost.addHeader("sydwptbh", sydwbm);if (ylbm != null) {httpPost.addHeader("ylbm", ylbm);}StringEntity stringEntity = new StringEntity(reqDTO, StandardCharsets.UTF_8);httpPost.setEntity(stringEntity);CloseableHttpResponse response = (CloseableHttpResponse) httpClient.execute(httpPost);HttpEntity responseEntity = response.getEntity();return EntityUtils.toString(responseEntity);} catch (KeyManagementException | IOException e) {throw new RuntimeException(e);}}
}package channel;import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.pqc.math.linearalgebra.ByteUtils;
import org.bouncycastle.util.encoders.Hex;import javax.crypto.*;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.security.*;
import java.util.Base64;public class SM4Util {private SM4Util() {}static {Security.addProvider(new BouncyCastleProvider());}private static final Charset ENCODING = StandardCharsets.UTF_8;public static final String ALGORITHM_NAME = "SM4";// 加密算法/分组加密模式/分组填充方式// PKCS5Padding-以8个字节为一组进行分组加密// 定义分组加密模式使用:PKCS5Paddingpublic static final String ALGORITHM_NAME_ECB_PADDING = "SM4/ECB/PKCS5Padding";// 128-32位16进制;256-64位16进制public static final int DEFAULT_KEY_SIZE = 128;/*** 自动生成密钥(16进制字符串,长度32)*/public static String generateKey() {return Hex.toHexString(generateKey(DEFAULT_KEY_SIZE));}/*** @param keySize 密钥长度*/public static byte[] generateKey(int keySize) {try {KeyGenerator kg = KeyGenerator.getInstance(ALGORITHM_NAME, BouncyCastleProvider.PROVIDER_NAME);kg.init(keySize, new SecureRandom());return kg.generateKey().getEncoded();} catch (NoSuchAlgorithmException | NoSuchProviderException e) {throw new RuntimeException(e);}}/*** 生成ECB暗号** @param algorithmName 算法名称* @param mode          模式* @param key           密码*/private static Cipher generateEcbCipher(String algorithmName, int mode, byte[] key) {try {Cipher cipher = Cipher.getInstance(algorithmName, BouncyCastleProvider.PROVIDER_NAME);Key sm4Key = new SecretKeySpec(key, ALGORITHM_NAME);cipher.init(mode, sm4Key);return cipher;} catch (NoSuchAlgorithmException | InvalidKeyException | NoSuchPaddingException | NoSuchProviderException e) {throw new RuntimeException(e);}}/*** sm4加密 ,加密模式:ECB** @param hexKey   16进制密钥(忽略大小写)* @param paramStr 待加密字符串* @return 返回Base64后加密字符串*/public static String encryptEcb(String hexKey, String paramStr) {try {// 16进制字符串-->byte[]@SuppressWarnings("deprecation")byte[] keyData = ByteUtils.fromHexString(hexKey);// String-->byte[]byte[] srcData = paramStr.getBytes(ENCODING);// 加密后的数组byte[] cipherArray = encryptEcbPadding(keyData, srcData);// byte[]-->hexStringreturn Base64.getEncoder().encodeToString(cipherArray);} catch (Exception e) {throw new RuntimeException(e);}}/*** 加密模式为ECB** @param key  2进制密钥* @param data 2进制原文* @return 二进制密文*/public static byte[] encryptEcbPadding(byte[] key, byte[] data) {Cipher cipher = generateEcbCipher(ALGORITHM_NAME_ECB_PADDING, Cipher.ENCRYPT_MODE, key);try {return cipher.doFinal(data);} catch (IllegalBlockSizeException | BadPaddingException e) {throw new RuntimeException(e);}}/*** sm4解密 ,解密模式:采用ECB** @param hexKey     16进制密钥* @param cipherText 16进制的加密字符串(忽略大小写)* @return 解密后的字符串*/public static String decryptEcb(String hexKey, String cipherText) {try {// hexString-->byte[]@SuppressWarnings("deprecation")byte[] keyData = ByteUtils.fromHexString(hexKey);// hexString-->byte[]byte[] cipherData = Base64.getDecoder().decode(cipherText);// 解密byte[] srcData = decryptEcbPadding(keyData, cipherData);// 接收解密后的字符串 byte[]-->Stringreturn new String(srcData, ENCODING);} catch (Exception e) {throw new RuntimeException(e);}}/*** sm4解密** @param key        2进制密钥* @param cipherText 2进制密文* @return 解密后的2进制原文*/public static byte[] decryptEcbPadding(byte[] key, byte[] cipherText) {Cipher cipher = generateEcbCipher(ALGORITHM_NAME_ECB_PADDING, Cipher.DECRYPT_MODE, key);try {return cipher.doFinal(cipherText);} catch (IllegalBlockSizeException | BadPaddingException e) {throw new RuntimeException(e);}}}// 

 使用乐企接口需要邀请,申请,审核等审批的流程。

这篇关于全电发票开票API接口文档与乐企接口的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/845555

相关文章

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

Java 后端接口入参 - 联合前端VUE 使用AES完成入参出参加密解密

加密效果: 解密后的数据就是正常数据: 后端:使用的是spring-cloud框架,在gateway模块进行操作 <dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>30.0-jre</version></dependency> 编写一个AES加密

【LabVIEW学习篇 - 21】:DLL与API的调用

文章目录 DLL与API调用DLLAPIDLL的调用 DLL与API调用 LabVIEW虽然已经足够强大,但不同的语言在不同领域都有着自己的优势,为了强强联合,LabVIEW提供了强大的外部程序接口能力,包括DLL、CIN(C语言接口)、ActiveX、.NET、MATLAB等等。通过DLL可以使用户很方便地调用C、C++、C#、VB等编程语言写的程序以及windows自带的大

如何更优雅地对接第三方API

如何更优雅地对接第三方API 本文所有示例完整代码地址:https://github.com/yu-linfeng/BlogRepositories/tree/master/repositories/third 我们在日常开发过程中,有不少场景会对接第三方的API,例如第三方账号登录,第三方服务等等。第三方服务会提供API或者SDK,我依稀记得早些年Maven还没那么广泛使用,通常要对接第三方

java线程深度解析(一)——java new 接口?匿名内部类给你答案

http://blog.csdn.net/daybreak1209/article/details/51305477 一、内部类 1、内部类初识 一般,一个类里主要包含类的方法和属性,但在Java中还提出在类中继续定义类(内部类)的概念。 内部类的定义:类的内部定义类 先来看一个实例 [html]  view plain copy pu

Java基础回顾系列-第五天-高级编程之API类库

Java基础回顾系列-第五天-高级编程之API类库 Java基础类库StringBufferStringBuilderStringCharSequence接口AutoCloseable接口RuntimeSystemCleaner对象克隆 数字操作类Math数学计算类Random随机数生成类BigInteger/BigDecimal大数字操作类 日期操作类DateSimpleDateForma

模拟实现vector中的常见接口

insert void insert(iterator pos, const T& x){if (_finish == _endofstorage){int n = pos - _start;size_t newcapacity = capacity() == 0 ? 2 : capacity() * 2;reserve(newcapacity);pos = _start + n;//防止迭代

Python脚本:TXT文档行数统计

count = 0 #计数变量file_dirs = input('请输入您要统计的文件根路径:')filename = open(file_dirs,'r') #以只读方式打开文件file_contents = filename.read() #读取文档内容到file_contentsfor file_content in file_contents:

Restful API 原理以及实现

先说说API 再说啥是RESRFUL API之前,咱先说说啥是API吧。API大家应该都知道吧,简称接口嘛。随着现在移动互联网的火爆,手机软件,也就是APP几乎快爆棚了。几乎任何一个网站或者应用都会出一款iOS或者Android APP,相比网页版的体验,APP确实各方面性能要好很多。 那么现在问题来了。比如QQ空间网站,如果我想获取一个用户发的说说列表。 QQ空间网站里面需要这个功能。