航天信息金税盘接口 js 调用

背景

最近项目要求与单机版的金税盘接口进行对接,在这里简单记录一下自己的开发经验,希望可以帮助到有需要的人

PS:接口使用 js 对接,仅支持 ie 浏览器。

前置条件

在进行开发时候需要有一些前置条件

  1. ie 浏览器

    • 开启 activeX 控件

      设置 –> Internet 选项 –> 安全 –> 自定义级别

      activeX 相关设置勾上

      可参考:

    • 管理员身份运行调试

      如果开票软件安装到本地 C盘 需要使用管理员打开 ie 浏览器,然后再进行调试

  2. 金税盘安装

    • 要确保金税盘安装准确安装了TaxCardX.dll

通用 js代码

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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
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
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
/** 航信金税盘相关function */
var goldTax = {
/**
* 使用前先判断是否是ie浏览器
* @return true/false
*/
isIE: function () {
if(!!window.ActiveXObject || "ActiveXObject" in window)
return true;
else
return false;
},
/**
* 开启金税盘
* @param certPassword 单机版为证书口令 服务器版为地址 留空则读取开票BIN文件下cert.txt
* @return
* <pre>
* {
* 'success': true/false, // 成功或者失败
* 'code': -1/其他, // 错误码,-1 为系统错误
* 'msg': 'xxx', // 错误信息
* 'data': {} // 接口返回相关数据
* }
* </pre>
*/
openCard: function (certPassword) {
var result = {
'success': false,
'code': -1,
'msg': '',
'data': {}
};
try {
goldTax.card = new ActiveXObject("TaxCardX.GoldTax");
// 单机版为证书口令 服务器版为地址 留空则读取开票BIN文件下cert.txt
if(typeof certPassword != 'undefined') {
goldTax.card.CertPassword = certPassword;
}
// 开启金税盘
goldTax.card.OpenCard();
result.code = goldTax.card.RetCode;
result.msg = goldTax.card.RetMsg;
// 1011 开启成功
if (result.code == 1011) {
result.success = true;
result.data = {
RetCode: goldTax.card.RetCode, /* RetCode - 状态码, 1011 开启成功 */
RetMsg: goldTax.card.RetMsg, /* RetMsg 状态信息 */
InvLimit: goldTax.card.InvLimit, /* InvLimit – 开票限额, 金税卡发票开具价税合计限额 */
TaxCode: goldTax.card.TaxCode, /* TaxCode 本单位税号 */
TaxClock: goldTax.card.TaxClock, /* TaxClock – 金税卡时钟 */
MachineNo: goldTax.card.MachineNo, /* MachineNo – 开票机号码,主开票机为 0 */
IsInvEmpty: goldTax.card.IsInvEmpty, /* IsInvEmpty – 有票标志,0为金税卡中无可开发票,1为有票 */
IsRepReached: goldTax.card.IsRepReached, /* IsRepReached – 抄税标志,0为未到抄税期,1为已到抄税期 */
IsLockReached: goldTax.card.IsLockReached, /* IsLockReached – 锁死标志,0为未到锁死期,1为已到锁死期 */
};
} else {
result.success = false;
}
} catch (e) {
result.success = false;
result.code = -1;
result.msg = 'ActiveX Error, ' + e.description;
}
return result;
},
/**
* 关闭金税盘
* @return
* <pre>
* {
* 'success': true/false, // 成功或者失败
* 'code': -1/其他, // 错误码,-1 为系统错误
* 'msg': 'xxx' // 错误信息
* }
* </pre>
*/
closeCard: function() {
var result = {
'success': false,
'code': -1,
'msg': ''
};
if (typeof goldTax.card != 'undefined') {
try {
goldTax.card.closeCard();
result.code = goldTax.card.RetCode;
result.msg = goldTax.card.RetMsg;
// RetCode 9000 调用成功,其他失败
if (result.code == 9000) {
result.success = true;
} else {
result.success = false;
}
} catch (e) {
result.success = false;
result.code = -1;
result.msg = 'ActiveX Error, ' + e.description;
}
return result;
}
},
/**
* 查询库存发票
* @param invKind 发票种类
* @return
* <pre>
* {
* 'success': true/false, // 成功或者失败
* 'code': -1/其他, // 错误码,-1 为系统错误
* 'msg': 'xxx', // 错误信息
* 'data': {} // 接口返回相关数据
* }
* </pre>
*/
invoiceInventory: function(invKind) {
var result = {
'success': false,
'code': -1,
'msg': '',
'data': {}
};
try {
if (typeof goldTax.card != 'undefined') {
goldTax.card.InfoKind = invKind;
goldTax.card.GetInfo();
result.code = goldTax.card.RetCode;
result.msg = goldTax.card.RetMsg;
// RetCode 3011 读取成功,其他失败
if (result.code == 3011) {
result.success = true;
result.data = {
RetCode: goldTax.card.RetCode, /* RetCode - 状态码, 3011 读取成功,其他失败 */
RetMsg: goldTax.card.RetMsg, /* RetMsg 状态信息 */
InfoTypeCode: goldTax.card.InfoTypeCode, /* 要开具发票的十位代码。为空或全为0时,表示无可用发票 */
InfoNumber: goldTax.card.InfoNumber, /* 要开具发票的号码 */
InvStock: goldTax.card.InvStock, /* 剩余的可用发票份数 */
TaxClock: goldTax.card.TaxClock /* 金税盘时钟 */
};
} else {
result.success = false;
}
} else {
result.success = false;
result.code = -1;
result.msg = 'Please Open Card First';
}
} catch (e) {
result.success = false;
result.code = -1;
result.msg = 'ActiveX Error, ' + e.description;
}
return result;
},
/**
* 发票校验
* @param o 传入发票信息
* @return
* <pre>
* {
* 'success': true/false, // 成功或者失败
* 'code': -1/其他, // 错误码,-1 为系统错误
* 'msg': 'xxx', // 错误信息
* 'data': {} // 接口返回相关数据
* }
* </pre>
*/
invoiceVeriferify: function(o) {
return goldTax.inner.invoice(1, o);
},
/**
* 发票开具
* @param o 传入发票信息
* @return
* <pre>
* {
* 'success': true/false, // 成功或者失败
* 'code': -1/其他, // 错误码,-1 为系统错误
* 'msg': 'xxx', // 错误信息
* 'data': {} // 接口返回相关数据
* }
* </pre>
*/
invoicing: function(o) {
return goldTax.inner.invoice(0, o);
},
/**
* 发票打印
* @param o 传入发票信息
* @return
* <pre>
* {
* 'success': true/false, // 成功或者失败
* 'code': -1/其他, // 错误码,-1 为系统错误
* 'msg': 'xxx' // 错误信息
* }
* </pre>
*/
printInv: function(o) {
var result = {
'success': false,
'code': -1,
'msg': ''
};
try {
if (typeof goldTax.card != 'undefined') {
goldTax.card.InfoKind = o.InfoKind; /* 发票种类(0:专用发票 2:普通发票 11:货物运输业增值税专用发票 12:机动车销售统一发票) */
goldTax.card.InfoTypeCode = o.InfoTypeCode; /* 要打印发票的十位代码 */
goldTax.card.InfoNumber = o.InfoNumber; /* 要打印发票的号码 */
goldTax.card.GoodsListFlag = o.GoodsListFlag; /* 销货清单标志,0 – 打印发票,1 – 打印销货清单 */
goldTax.card.InfoShowPrtDlg = o.InfoShowPrtDlg; /* 打印时是否显示边距确认对话框,0 – 不出现,1 – 出现 */
// 调用接口
goldTax.card.PrintInv();
result.code = goldTax.card.RetCode;
result.msg = goldTax.card.RetMsg;
// RetCode 5011 打印成功,5001 – 未找到发票或清单,5012 – 未打印,5013 – 打印失败
if (result.code == 5011) {
result.success = true;
} else {
result.success = false;
}
} else {
result.success = false;
result.code = -1;
result.msg = 'Please Open Card First';
}
} catch (e) {
result.success = false;
result.code = -1;
result.msg = 'ActiveX Error, ' + e.description;
}
return result;
},
/**
* 已开发票作废
* @param o 传入发票信息
* @return
* <pre>
* {
* 'success': true/false, // 成功或者失败
* 'code': -1/其他, // 错误码,-1 为系统错误
* 'msg': 'xxx' // 错误信息
* }
* </pre>
*/
cancelInv: function(o) {
var result = {
'success': false,
'code': -1,
'msg': ''
};
try {
if (typeof goldTax.card != 'undefined') {
goldTax.card.InfoKind = o.InfoKind; /* 发票种类(0:专用发票 2:普通发票 11:货物运输业增值税专用发票 12:机动车销售统一发票) */
goldTax.card.InfoTypeCode = o.InfoTypeCode; /* 要作废发票的十位或十二位代码 */
goldTax.card.InfoNumber = o.InfoNumber; /* 要作废发票的号码 */
// 调用接口
goldTax.card.CancelInv();
result.code = goldTax.card.RetCode;
result.msg = goldTax.card.RetMsg;
// RetCode 6011 打印成功,6001 – 当月发票库未找到该发票,6002 – 该发票已经作废,6012 – 作废失败,6013 – 作废失败(异常)
if (result.code == 6011) {
result.success = true;
} else {
result.success = false;
}
} else {
result.success = false;
result.code = -1;
result.msg = 'Please Open Card First';
}
} catch (e) {
result.success = false;
result.code = -1;
result.msg = 'ActiveX Error, ' + e.description;
}
return result;
},
// 内部方法
inner: {
/**
* invoice 接口
* @param checkEWM 默认为0(0: 发票开具, 1: 发票校验, 2: 空白作废)
* @param o 传入发票信息
* @return
* <pre>
* {
* 'success': true/false, // 成功或者失败
* 'code': -1/其他, // 错误码,-1 为系统错误
* 'msg': 'xxx', // 错误信息
* 'data': {} // 接口返回相关数据
* }
* </pre>
*/
invoice: function(checkEWM, o) {
var result = {
'success': false,
'code': -1,
'msg': '',
'data': {}
};
try {
if (typeof goldTax.card != 'undefined') {
// CheckEWM值默认为0(为1时用于发票校验。
// 注意:一旦CheckEWM值置1用于发票校验之后,
//如果要再进行发票开具必须手动将CheckEWM值置为0,否则Invoice()方法的功能将一直处于发票校验状态)
goldTax.card.CheckEWM = checkEWM;
goldTax.card.InvInfoInit(); /* 初始化发票抬头信息 */
goldTax.card.InfoKind = o.InfoKind; /* 增值税普通发票2 专票0 */
goldTax.card.InfoClientName = o.InfoClientName; /* 购方名称 */
goldTax.card.InfoClientTaxCode = o.InfoClientTaxCode; /* 购方税号 */
goldTax.card.InfoClientBankAccount = o.InfoClientBankAccount; /* 购方开户行及账号 */
goldTax.card.InfoClientAddressPhone = o.InfoClientAddressPhone; /* 购方地址电话 */
goldTax.card.InfoSellerBankAccount = o.InfoSellerBankAccount; /* 销方开户行及账号 */
goldTax.card.InfoSellerAddressPhone = o.InfoSellerAddressPhone; /* 销方地址电话 */
// 如果是多商品多税率 税率应该放到下面商品信息循环里
if (typeof o.InfoTaxRate != 'undefined' && o.InfoTaxRate) {
goldTax.card.InfoTaxRate = o.InfoTaxRate; /* 税率,(已授权的税率, 17% 传17) */
}
goldTax.card.InfoNotes = o.InfoNotes; /* 备注 */
goldTax.card.InfoInvoicer = o.InfoInvoicer; /* 开票人 */
// 复核人,可为空
if (typeof o.InfoChecker != 'undefined' && o.InfoChecker) {
goldTax.card.InfoChecker = o.InfoChecker;
}
// 收款人,可为空
if (typeof o.InfoCashier != 'undefined' && o.InfoCashier) {
goldTax.card.InfoCashier = o.InfoCashier;
}
// 如不为空,则开具销货清单,此为发票上商品名称栏的清单信息,应为“(详见销货清单)”字样
if (typeof o.InfoListName != 'undefined' && o.InfoListName) {
goldTax.card.InfoListName = o.InfoListName;
}
// 清空商品明细列表
goldTax.card.ClearInvList();
// 遍历行
$.each(o.InvList, function(i, v) {
goldTax.card.InvListInit(); /* 初始化发票明细信息各项属性 */
goldTax.card.ListGoodsName = v.ListGoodsName; /* 商品或劳务名称 */
goldTax.card.ListTaxItem = v.ListTaxItem; /* 税目,4位数字,商品所属类别 */
goldTax.card.ListStandard = v.ListStandard; /* 规格型号 */
// 计量单位,如计量单位为空,则忽略数量和单价
if (typeof v.ListUnit != 'undefined' && v.ListUnit) {
goldTax.card.ListUnit = v.ListUnit;
}
// 建议传入数量和含税单价或含税金额 由接口计算带小数的税额 规避误差
goldTax.card.ListNumber = v.ListNumber; // 数量
goldTax.card.ListPrice = v.ListPrice; // 单价
// 金额,可以不传(为0),由接口软件计算,如传入则应符合计算关系
if (typeof v.ListAmount != 'undefined' && v.ListAmount ) {
goldTax.card.ListAmount = v.ListAmount;
}
goldTax.card.ListPriceKind = v.ListPriceKind; /* 含税价标志,单价和金额的种类, 0为不含税价,1为含税价 */
// 税额可以不传(为0),由接口软件计算,如传入则应符合计算关系
if (typeof v.ListTaxAmount != 'undefined' && v.ListTaxAmount) {
goldTax.card.ListTaxAmount = v.ListTaxAmount;
}
// 添加一行
goldTax.card.AddInvList();
});
// 调用接口
goldTax.card.Invoice();
result.code = goldTax.card.RetCode;
result.msg = goldTax.card.RetMsg;
// RetCode 4011 开票成功,其他失败
if (result.code == 4011) {
result.success = true;
result.data = {
RetCode: goldTax.card.RetCode, /* RetCode - 状态码, 3011 读取成功,其他失败 */
RetMsg: goldTax.card.RetMsg, /* RetMsg 状态信息 */
InfoAmount: goldTax.card.InfoAmount , /* 合计不含税金额 */
InfoTaxAmount: goldTax.card.InfoTaxAmount, /* 合计税额 */
InfoInvDate: goldTax.card.InfoInvDate, /* 开票日期 */
InfMonth: goldTax.card.InfMonth, /* 所属月份 */
InfoTypeCode: goldTax.card.InfoTypeCode, /* 发票十位代码 */
InfoNumber: goldTax.card.InfoNumber, /* 发票号码 */
GoodsListFlag: goldTax.card.GoodsListFlag /* 销货清单标志,0 – 无销货清单,1 – 有销货清单 */
};
} else {
result.success = false;
}
} else {
result.success = false;
result.code = -1;
result.msg = 'Please Open Card First';
}
} catch (e) {
result.success = false;
result.code = -1;
result.msg = 'ActiveX Error, ' + e.description;
}
return result;
}
}
};

相关资料

CSDN 需要积分下载 金税 防伪税控 组件接口 开发文档 代码案例

没有积分的 戳这里

显示 Gitment 评论
0%