@networksolution/sia-vpos-node 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,608 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.VposClient = void 0;
4
+ exports.generateTimestamp = generateTimestamp;
5
+ exports.generateReqRefNum = generateReqRefNum;
6
+ const mac_1 = require("./mac");
7
+ const xml_1 = require("./xml");
8
+ // ─── Defaults ────────────────────────────────────────────────────────────────
9
+ const API_URLS = {
10
+ production: 'https://virtualpos.sia.eu/vpos/apibo/apiBOXML-UTF8.app',
11
+ test: 'https://virtualpostest.sia.eu/vpos/apibo/apiBOXML-UTF8.app',
12
+ };
13
+ const DEFAULT_RELEASE = '02';
14
+ const DEFAULT_CURRENCY = '978'; // EUR
15
+ const DEFAULT_EXPONENT = '2';
16
+ /**
17
+ * Resolve the environment from config or VPOS_ENV env variable.
18
+ * Priority: config.apiUrl > config.environment > VPOS_ENV > 'test' (default)
19
+ */
20
+ function resolveApiUrl(config) {
21
+ if (config.apiUrl)
22
+ return config.apiUrl;
23
+ const env = config.environment
24
+ || (typeof process !== 'undefined' && process.env?.VPOS_ENV)
25
+ || 'test';
26
+ return API_URLS[env] || API_URLS.test;
27
+ }
28
+ // ─── Helpers ─────────────────────────────────────────────────────────────────
29
+ /**
30
+ * Generate timestamp in yyyy-MM-ddTHH:mm:ss.SSS format
31
+ */
32
+ function generateTimestamp(date) {
33
+ const d = date || new Date();
34
+ const pad = (n, len = 2) => String(n).padStart(len, '0');
35
+ return [
36
+ d.getFullYear(), '-', pad(d.getMonth() + 1), '-', pad(d.getDate()),
37
+ 'T',
38
+ pad(d.getHours()), ':', pad(d.getMinutes()), ':', pad(d.getSeconds()),
39
+ '.', pad(d.getMilliseconds(), 3),
40
+ ].join('');
41
+ }
42
+ /**
43
+ * Generate ReqRefNum: first 8 digits = yyyyMMdd, remaining 24 = random numeric
44
+ * Total: 32 chars numeric
45
+ */
46
+ function generateReqRefNum(date) {
47
+ const d = date || new Date();
48
+ const pad = (n, len = 2) => String(n).padStart(len, '0');
49
+ const datePrefix = `${d.getFullYear()}${pad(d.getMonth() + 1)}${pad(d.getDate())}`;
50
+ let random = '';
51
+ for (let i = 0; i < 24; i++) {
52
+ random += Math.floor(Math.random() * 10).toString();
53
+ }
54
+ return datePrefix + random;
55
+ }
56
+ // ─── Main Client ─────────────────────────────────────────────────────────────
57
+ class VposClient {
58
+ constructor(config) {
59
+ const environment = config.environment
60
+ || (typeof process !== 'undefined' && process.env?.VPOS_ENV)
61
+ || 'test';
62
+ this.config = {
63
+ shopId: config.shopId,
64
+ operatorId: config.operatorId,
65
+ secretKey: config.secretKey,
66
+ hashAlgorithm: config.hashAlgorithm || 'hmac-sha256',
67
+ apiUrl: resolveApiUrl(config),
68
+ environment,
69
+ release: config.release || DEFAULT_RELEASE,
70
+ };
71
+ }
72
+ /** Returns true if using the test environment */
73
+ get isTest() {
74
+ return this.config.environment === 'test';
75
+ }
76
+ /** Returns true if using the production environment */
77
+ get isProduction() {
78
+ return this.config.environment === 'production';
79
+ }
80
+ /** Returns the current API URL */
81
+ get apiUrl() {
82
+ return this.config.apiUrl;
83
+ }
84
+ // ── Internal: send XML request to VPOS ──────────────────────────────────────
85
+ async sendRequest(xml) {
86
+ const body = `data=${encodeURIComponent(xml)}`;
87
+ const response = await fetch(this.config.apiUrl, {
88
+ method: 'POST',
89
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
90
+ body,
91
+ });
92
+ if (!response.ok) {
93
+ throw new Error(`SIA VPOS HTTP error: ${response.status} ${response.statusText}`);
94
+ }
95
+ return response.text();
96
+ }
97
+ // ══════════════════════════════════════════════════════════════════════════════
98
+ // AUTHORIZATION (Hosted Payment Page - server-to-server)
99
+ // ══════════════════════════════════════════════════════════════════════════════
100
+ async authorize(data) {
101
+ const timestamp = generateTimestamp();
102
+ const reqRefNum = generateReqRefNum();
103
+ const currency = data.currency || DEFAULT_CURRENCY;
104
+ const exponent = data.exponent || DEFAULT_EXPONENT;
105
+ // MAC fields per spec 4.2.10 — order is critical!
106
+ const macFields = [
107
+ ['OPERATION', 'AUTHORIZATION'],
108
+ ['TIMESTAMP', timestamp],
109
+ ['SHOPID', this.config.shopId],
110
+ ['ORDERID', data.orderId],
111
+ ['OPERATORID', this.config.operatorId],
112
+ ['REQREFNUM', reqRefNum],
113
+ ['PAN', data.pan],
114
+ ['CVV2', data.cvv2],
115
+ ['EXPDATE', data.expDate],
116
+ ['AMOUNT', data.amount],
117
+ ['CURRENCY', currency],
118
+ ['EXPONENT', exponent],
119
+ ['ACCOUNTINGMODE', data.accountingMode],
120
+ ['NETWORK', data.network],
121
+ ['EMAILCH', data.emailCH],
122
+ ['USERID', data.userId],
123
+ ['ACQUIRER', data.acquirer],
124
+ ['IPADDRESS', data.ipAddress],
125
+ ['OPDESCR', data.opDescr],
126
+ ['USRAUTHFLAG', data.usrAuthFlag],
127
+ ['OPTIONS', data.options],
128
+ ['ANTIFRAUD', data.antifraud],
129
+ ['PRODUCTREF', data.productRef],
130
+ ['NAME', data.name],
131
+ ['SURNAME', data.surname],
132
+ ['TAXID', data.taxId],
133
+ ['TRECURR', data.tRecurr],
134
+ ['CRECURR', data.cRecurr],
135
+ ['INSTALLMENTSNUMBER', data.installmentsNumber],
136
+ ];
137
+ const mac = (0, mac_1.generateMAC)(macFields, this.config.secretKey, this.config.hashAlgorithm);
138
+ // Build inner Data XML
139
+ const dataXml = [
140
+ '<AuthorizationRequest>',
141
+ (0, xml_1.buildHeaderXml)(this.config.shopId, this.config.operatorId, reqRefNum),
142
+ (0, xml_1.el)('OrderID', data.orderId),
143
+ (0, xml_1.el)('Pan', data.pan),
144
+ (0, xml_1.el)('CVV2', data.cvv2),
145
+ (0, xml_1.el)('CreatePanAlias', data.createPanAlias),
146
+ (0, xml_1.el)('ExpDate', data.expDate),
147
+ (0, xml_1.el)('Amount', data.amount),
148
+ (0, xml_1.el)('Currency', currency),
149
+ (0, xml_1.el)('Exponent', exponent),
150
+ (0, xml_1.el)('AccountingMode', data.accountingMode),
151
+ (0, xml_1.el)('Network', data.network),
152
+ (0, xml_1.el)('EmailCH', data.emailCH),
153
+ (0, xml_1.el)('Userid', data.userId),
154
+ (0, xml_1.el)('OpDescr', data.opDescr),
155
+ (0, xml_1.el)('IpAddress', data.ipAddress),
156
+ (0, xml_1.el)('UsrAuthFlag', data.usrAuthFlag),
157
+ (0, xml_1.el)('Options', data.options),
158
+ (0, xml_1.el)('Antifraud', data.antifraud),
159
+ (0, xml_1.el)('ProductRef', data.productRef),
160
+ (0, xml_1.el)('Name', data.name),
161
+ (0, xml_1.el)('Surname', data.surname),
162
+ (0, xml_1.el)('TaxID', data.taxId),
163
+ (0, xml_1.el)('TRecurr', data.tRecurr),
164
+ (0, xml_1.el)('CRecurr', data.cRecurr),
165
+ (0, xml_1.el)('InstallmentsNumber', data.installmentsNumber),
166
+ '</AuthorizationRequest>',
167
+ ].filter(Boolean).join('\n');
168
+ const xml = (0, xml_1.buildBPWXmlRequest)({
169
+ release: this.config.release,
170
+ operation: 'AUTHORIZATION',
171
+ timestamp,
172
+ mac,
173
+ dataXml,
174
+ });
175
+ const responseXml = await this.sendRequest(xml);
176
+ const parsed = (0, xml_1.parseBPWXmlResponse)(responseXml);
177
+ return {
178
+ ...parsed,
179
+ authorization: parsed.data ? (0, xml_1.parseAuthorization)(parsed.data) : undefined,
180
+ panAliasData: parsed.data ? (0, xml_1.parsePanAliasData)(parsed.data) : undefined,
181
+ };
182
+ }
183
+ // ══════════════════════════════════════════════════════════════════════════════
184
+ // PAY-BY-LINK: CREATELINK
185
+ // ══════════════════════════════════════════════════════════════════════════════
186
+ async createLink(data) {
187
+ const timestamp = generateTimestamp();
188
+ const reqRefNum = generateReqRefNum();
189
+ const currency = data.linkCurrency || DEFAULT_CURRENCY;
190
+ const exponent = data.linkExponent || DEFAULT_EXPONENT;
191
+ // MAC fields per spec 4.2.23 — order is critical!
192
+ const macFields = [
193
+ ['OPERATION', 'CREATELINK'],
194
+ ['TIMESTAMP', timestamp],
195
+ ['REQREFNUM', reqRefNum],
196
+ ['SHOPID', this.config.shopId],
197
+ ['OPERATORID', this.config.operatorId],
198
+ ['SENDMAIL', data.sendMail],
199
+ ['LINKEXPIRATIONDATE', data.linkExpirationDate],
200
+ ['LINKAMOUNT', data.linkAmount],
201
+ ['LINKCURRENCY', currency],
202
+ ['LINKEXPONENT', exponent],
203
+ ['LINKORDERID', data.linkOrderId],
204
+ ['LINKURLDONE', data.linkUrlDone],
205
+ ['LINKURLMS', data.linkUrlMs],
206
+ ['LINKACCOUNTINGMODE', data.linkAccountingMode],
207
+ ['LINKAUTHORMODE', data.linkAuthorMode],
208
+ ['LINKLANG', data.linkLang],
209
+ ['LINKSHOPEMAIL', data.linkShopEmail],
210
+ ['LINKOPTIONS', data.linkOptions],
211
+ ['LINKCOMMIS', data.linkCommis],
212
+ ['LINKEMAIL', data.linkEmail],
213
+ ['LINKNAME', data.linkName],
214
+ ['LINKSURNAME', data.linkSurname],
215
+ ['LINKORDDESCR', data.linkOrdDescr],
216
+ ['LINKOPDESCR', data.linkOpDescr],
217
+ ['LINKPHONENUMBER', data.linkPhoneNumber],
218
+ ['LINKREMAININGDURATION', data.linkRemainingDuration],
219
+ ['LINKUSERID', data.linkUserId],
220
+ ['LINKPRODUCTREF', data.linkProductRef],
221
+ ['LINKTRECURR', data.linkTRecurr],
222
+ ['LINKCRECURR', data.linkCRecurr],
223
+ ['THREEDSDATA', data.threeDsData],
224
+ ['OPTIONS', data.options],
225
+ ];
226
+ const mac = (0, mac_1.generateMAC)(macFields, this.config.secretKey, this.config.hashAlgorithm);
227
+ const dataXml = [
228
+ '<CreateLinkRequest>',
229
+ (0, xml_1.buildHeaderXml)(this.config.shopId, this.config.operatorId, reqRefNum),
230
+ (0, xml_1.el)('Sendmail', data.sendMail),
231
+ (0, xml_1.el)('LinkExpirationDate', data.linkExpirationDate),
232
+ (0, xml_1.el)('LinkAmount', data.linkAmount),
233
+ (0, xml_1.el)('LinkCurrency', currency),
234
+ (0, xml_1.el)('LinkExponent', exponent),
235
+ (0, xml_1.el)('LinkOrderId', data.linkOrderId),
236
+ (0, xml_1.el)('LinkUrlDone', data.linkUrlDone),
237
+ (0, xml_1.el)('LinkUrlMs', data.linkUrlMs),
238
+ (0, xml_1.el)('LinkAccountingMode', data.linkAccountingMode),
239
+ (0, xml_1.el)('LinkAuthorMode', data.linkAuthorMode),
240
+ (0, xml_1.el)('LinkLang', data.linkLang),
241
+ (0, xml_1.el)('LinkShopEmail', data.linkShopEmail),
242
+ (0, xml_1.el)('LinkOptions', data.linkOptions),
243
+ (0, xml_1.el)('LinkCommis', data.linkCommis),
244
+ (0, xml_1.el)('LinkEmail', data.linkEmail),
245
+ (0, xml_1.el)('LinkName', data.linkName),
246
+ (0, xml_1.el)('LinkSurname', data.linkSurname),
247
+ (0, xml_1.el)('LinkOrdDescr', data.linkOrdDescr),
248
+ (0, xml_1.el)('LinkOpDescr', data.linkOpDescr),
249
+ (0, xml_1.el)('LinkPhoneNumber', data.linkPhoneNumber),
250
+ (0, xml_1.el)('LinkRemainingDuration', data.linkRemainingDuration),
251
+ (0, xml_1.el)('LinkUserId', data.linkUserId),
252
+ (0, xml_1.el)('LinkProductRef', data.linkProductRef),
253
+ (0, xml_1.el)('LinkTRecurr', data.linkTRecurr),
254
+ (0, xml_1.el)('LinkCRecurr', data.linkCRecurr),
255
+ (0, xml_1.el)('ThreeDsData', data.threeDsData),
256
+ '</CreateLinkRequest>',
257
+ ].filter(Boolean).join('\n');
258
+ const xml = (0, xml_1.buildBPWXmlRequest)({
259
+ release: this.config.release,
260
+ operation: 'CREATELINK',
261
+ timestamp,
262
+ mac,
263
+ dataXml,
264
+ });
265
+ const responseXml = await this.sendRequest(xml);
266
+ const parsed = (0, xml_1.parseBPWXmlResponse)(responseXml);
267
+ return {
268
+ ...parsed,
269
+ linkCreated: parsed.data ? (0, xml_1.parseLinkCreated)(parsed.data) : undefined,
270
+ };
271
+ }
272
+ // ══════════════════════════════════════════════════════════════════════════════
273
+ // PAY-BY-LINK: LISTLINK
274
+ // ══════════════════════════════════════════════════════════════════════════════
275
+ async listLinks(data) {
276
+ const timestamp = generateTimestamp();
277
+ const reqRefNum = generateReqRefNum();
278
+ // MAC fields per spec 4.2.24
279
+ const macFields = [
280
+ ['OPERATION', 'LISTLINK'],
281
+ ['TIMESTAMP', timestamp],
282
+ ['REQREFNUM', reqRefNum],
283
+ ['SHOPID', this.config.shopId],
284
+ ['OPERATORID', this.config.operatorId],
285
+ ['STARTDATE', data.startDate],
286
+ ['ENDDATE', data.endDate],
287
+ ['LINKSTATUS', data.linkStatus],
288
+ ['ORDERID', data.orderId],
289
+ ['TOKEN', data.token],
290
+ ['OPTIONS', data.options],
291
+ ];
292
+ const mac = (0, mac_1.generateMAC)(macFields, this.config.secretKey, this.config.hashAlgorithm);
293
+ const dataXml = [
294
+ '<ListLinkRequest>',
295
+ (0, xml_1.buildHeaderXml)(this.config.shopId, this.config.operatorId, reqRefNum),
296
+ (0, xml_1.el)('StartDate', data.startDate),
297
+ (0, xml_1.el)('EndDate', data.endDate),
298
+ (0, xml_1.el)('LinkStatus', data.linkStatus),
299
+ (0, xml_1.el)('OrderId', data.orderId),
300
+ (0, xml_1.el)('Token', data.token),
301
+ '</ListLinkRequest>',
302
+ ].filter(Boolean).join('\n');
303
+ const xml = (0, xml_1.buildBPWXmlRequest)({
304
+ release: this.config.release,
305
+ operation: 'LISTLINK',
306
+ timestamp,
307
+ mac,
308
+ dataXml,
309
+ });
310
+ const responseXml = await this.sendRequest(xml);
311
+ const parsed = (0, xml_1.parseBPWXmlResponse)(responseXml);
312
+ return {
313
+ ...parsed,
314
+ links: parsed.data ? (0, xml_1.parseLinkCreatedList)(parsed.data) : [],
315
+ };
316
+ }
317
+ // ══════════════════════════════════════════════════════════════════════════════
318
+ // PAY-BY-LINK: REVOKELINK
319
+ // ══════════════════════════════════════════════════════════════════════════════
320
+ async revokeLink(data) {
321
+ const timestamp = generateTimestamp();
322
+ const reqRefNum = generateReqRefNum();
323
+ // MAC fields per spec 4.2.25
324
+ const macFields = [
325
+ ['OPERATION', 'REVOKELINK'],
326
+ ['TIMESTAMP', timestamp],
327
+ ['REQREFNUM', reqRefNum],
328
+ ['SHOPID', this.config.shopId],
329
+ ['OPERATORID', this.config.operatorId],
330
+ ['TOKEN', data.token],
331
+ ['OPTIONS', data.options],
332
+ ];
333
+ const mac = (0, mac_1.generateMAC)(macFields, this.config.secretKey, this.config.hashAlgorithm);
334
+ const dataXml = [
335
+ '<RevokeLinkRequest>',
336
+ (0, xml_1.buildHeaderXml)(this.config.shopId, this.config.operatorId, reqRefNum),
337
+ (0, xml_1.el)('Token', data.token),
338
+ '</RevokeLinkRequest>',
339
+ ].filter(Boolean).join('\n');
340
+ const xml = (0, xml_1.buildBPWXmlRequest)({
341
+ release: this.config.release,
342
+ operation: 'REVOKELINK',
343
+ timestamp,
344
+ mac,
345
+ dataXml,
346
+ });
347
+ const responseXml = await this.sendRequest(xml);
348
+ return (0, xml_1.parseBPWXmlResponse)(responseXml);
349
+ }
350
+ // ══════════════════════════════════════════════════════════════════════════════
351
+ // ACCOUNTING (Booking / Capture)
352
+ // ══════════════════════════════════════════════════════════════════════════════
353
+ async accounting(data) {
354
+ const timestamp = generateTimestamp();
355
+ const reqRefNum = generateReqRefNum();
356
+ const currency = data.currency || DEFAULT_CURRENCY;
357
+ const exponent = data.exponent || DEFAULT_EXPONENT;
358
+ // MAC fields per spec 4.2.2
359
+ const macFields = [
360
+ ['OPERATION', 'ACCOUNTING'],
361
+ ['TIMESTAMP', timestamp],
362
+ ['SHOPID', this.config.shopId],
363
+ ['OPERATORID', this.config.operatorId],
364
+ ['REQREFNUM', reqRefNum],
365
+ ['TRANSACTIONID', data.transactionId],
366
+ ['ORDERID', data.orderId],
367
+ ['AMOUNT', data.amount],
368
+ ['CURRENCY', currency],
369
+ ['EXPONENT', exponent],
370
+ ['OPDESCR', data.opDescr],
371
+ ['OPTIONS', data.options],
372
+ ];
373
+ const mac = (0, mac_1.generateMAC)(macFields, this.config.secretKey, this.config.hashAlgorithm);
374
+ const dataXml = [
375
+ '<Accounting>',
376
+ (0, xml_1.buildHeaderXml)(this.config.shopId, this.config.operatorId, reqRefNum),
377
+ (0, xml_1.el)('TransactionID', data.transactionId),
378
+ (0, xml_1.el)('OrderID', data.orderId),
379
+ (0, xml_1.el)('Amount', data.amount),
380
+ (0, xml_1.el)('Currency', currency),
381
+ (0, xml_1.el)('Exponent', exponent),
382
+ (0, xml_1.el)('OpDescr', data.opDescr),
383
+ '</Accounting>',
384
+ ].filter(Boolean).join('\n');
385
+ const xml = (0, xml_1.buildBPWXmlRequest)({
386
+ release: this.config.release,
387
+ operation: 'ACCOUNTING',
388
+ timestamp,
389
+ mac,
390
+ dataXml,
391
+ });
392
+ const responseXml = await this.sendRequest(xml);
393
+ const parsed = (0, xml_1.parseBPWXmlResponse)(responseXml);
394
+ return {
395
+ ...parsed,
396
+ operation: parsed.data ? (0, xml_1.parseOperation)(parsed.data) : undefined,
397
+ };
398
+ }
399
+ // ══════════════════════════════════════════════════════════════════════════════
400
+ // REVERSEACCOUNTING (Cancel Booking)
401
+ // ══════════════════════════════════════════════════════════════════════════════
402
+ async reverseAccounting(data) {
403
+ const timestamp = generateTimestamp();
404
+ const reqRefNum = generateReqRefNum();
405
+ // MAC fields per spec 4.2.3
406
+ const macFields = [
407
+ ['OPERATION', 'REVERSEACCOUNTING'],
408
+ ['TIMESTAMP', timestamp],
409
+ ['SHOPID', this.config.shopId],
410
+ ['OPERATORID', this.config.operatorId],
411
+ ['REQREFNUM', reqRefNum],
412
+ ['TRANSACTIONID', data.transactionId],
413
+ ['ORDERID', data.orderId],
414
+ ['OPTIONS', data.options],
415
+ ];
416
+ const mac = (0, mac_1.generateMAC)(macFields, this.config.secretKey, this.config.hashAlgorithm);
417
+ const dataXml = [
418
+ '<ReverseAccounting>',
419
+ (0, xml_1.buildHeaderXml)(this.config.shopId, this.config.operatorId, reqRefNum),
420
+ (0, xml_1.el)('TransactionID', data.transactionId),
421
+ (0, xml_1.el)('OrderID', data.orderId),
422
+ '</ReverseAccounting>',
423
+ ].filter(Boolean).join('\n');
424
+ const xml = (0, xml_1.buildBPWXmlRequest)({
425
+ release: this.config.release,
426
+ operation: 'REVERSEACCOUNTING',
427
+ timestamp,
428
+ mac,
429
+ dataXml,
430
+ });
431
+ const responseXml = await this.sendRequest(xml);
432
+ const parsed = (0, xml_1.parseBPWXmlResponse)(responseXml);
433
+ return {
434
+ ...parsed,
435
+ operation: parsed.data ? (0, xml_1.parseOperation)(parsed.data) : undefined,
436
+ };
437
+ }
438
+ // ══════════════════════════════════════════════════════════════════════════════
439
+ // REFUND (Payment Reversal)
440
+ // ══════════════════════════════════════════════════════════════════════════════
441
+ async refund(data) {
442
+ const timestamp = generateTimestamp();
443
+ const reqRefNum = generateReqRefNum();
444
+ const currency = data.currency || DEFAULT_CURRENCY;
445
+ const exponent = data.exponent || DEFAULT_EXPONENT;
446
+ // MAC fields per spec 4.2.1
447
+ const macFields = [
448
+ ['OPERATION', 'REFUND'],
449
+ ['TIMESTAMP', timestamp],
450
+ ['SHOPID', this.config.shopId],
451
+ ['OPERATORID', this.config.operatorId],
452
+ ['REQREFNUM', reqRefNum],
453
+ ['TRANSACTIONID', data.transactionId],
454
+ ['ORDERID', data.orderId],
455
+ ['AMOUNT', data.amount],
456
+ ['CURRENCY', currency],
457
+ ['EXPONENT', exponent],
458
+ ['OPDESCR', data.opDescr],
459
+ ['OPTIONS', data.options],
460
+ ];
461
+ const mac = (0, mac_1.generateMAC)(macFields, this.config.secretKey, this.config.hashAlgorithm);
462
+ const dataXml = [
463
+ '<Refund>',
464
+ (0, xml_1.buildHeaderXml)(this.config.shopId, this.config.operatorId, reqRefNum),
465
+ (0, xml_1.el)('TransactionID', data.transactionId),
466
+ (0, xml_1.el)('OrderID', data.orderId),
467
+ (0, xml_1.el)('Amount', data.amount),
468
+ (0, xml_1.el)('Currency', currency),
469
+ (0, xml_1.el)('Exponent', exponent),
470
+ (0, xml_1.el)('OpDescr', data.opDescr),
471
+ '</Refund>',
472
+ ].filter(Boolean).join('\n');
473
+ const xml = (0, xml_1.buildBPWXmlRequest)({
474
+ release: this.config.release,
475
+ operation: 'REFUND',
476
+ timestamp,
477
+ mac,
478
+ dataXml,
479
+ });
480
+ const responseXml = await this.sendRequest(xml);
481
+ const parsed = (0, xml_1.parseBPWXmlResponse)(responseXml);
482
+ return {
483
+ ...parsed,
484
+ operation: parsed.data ? (0, xml_1.parseOperation)(parsed.data) : undefined,
485
+ };
486
+ }
487
+ // ══════════════════════════════════════════════════════════════════════════════
488
+ // ORDERSTATUS
489
+ // ══════════════════════════════════════════════════════════════════════════════
490
+ async orderStatus(data) {
491
+ const timestamp = generateTimestamp();
492
+ const reqRefNum = generateReqRefNum();
493
+ // MAC fields per spec 4.2.6
494
+ const macFields = [
495
+ ['OPERATION', 'ORDERSTATUS'],
496
+ ['TIMESTAMP', timestamp],
497
+ ['SHOPID', this.config.shopId],
498
+ ['OPERATORID', this.config.operatorId],
499
+ ['REQREFNUM', reqRefNum],
500
+ ['ORDERID', data.orderId],
501
+ ['PRODUCTREF', data.productRef],
502
+ ['OPTIONS', data.options],
503
+ ];
504
+ const mac = (0, mac_1.generateMAC)(macFields, this.config.secretKey, this.config.hashAlgorithm);
505
+ const dataXml = [
506
+ '<OrderStatus>',
507
+ (0, xml_1.buildHeaderXml)(this.config.shopId, this.config.operatorId, reqRefNum),
508
+ (0, xml_1.el)('OrderID', data.orderId),
509
+ (0, xml_1.el)('ProductRef', data.productRef),
510
+ '</OrderStatus>',
511
+ ].filter(Boolean).join('\n');
512
+ const xml = (0, xml_1.buildBPWXmlRequest)({
513
+ release: this.config.release,
514
+ operation: 'ORDERSTATUS',
515
+ timestamp,
516
+ mac,
517
+ dataXml,
518
+ });
519
+ const responseXml = await this.sendRequest(xml);
520
+ const parsed = (0, xml_1.parseBPWXmlResponse)(responseXml);
521
+ return {
522
+ ...parsed,
523
+ authorization: parsed.data ? (0, xml_1.parseAuthorization)(parsed.data) : undefined,
524
+ panAliasData: parsed.data ? (0, xml_1.parsePanAliasData)(parsed.data) : undefined,
525
+ };
526
+ }
527
+ // ══════════════════════════════════════════════════════════════════════════════
528
+ // WEBHOOK VERIFICATION
529
+ // ══════════════════════════════════════════════════════════════════════════════
530
+ /**
531
+ * Verify the MAC of a BPWXmlResponse received from SIA (webhook/URLMS notification).
532
+ * Verifies the root-level MAC (Timestamp + Result) per spec 4.2.7.
533
+ */
534
+ verifyResponseMAC(responseXml) {
535
+ const parsed = (0, xml_1.parseBPWXmlResponse)(responseXml);
536
+ return (0, mac_1.verifyMAC)([
537
+ ['', parsed.timestamp], // just values, no keys for response MAC
538
+ ['', parsed.result],
539
+ ], this.config.secretKey, parsed.mac, this.config.hashAlgorithm);
540
+ }
541
+ /**
542
+ * Verify the root-level response MAC (spec 4.2.7).
543
+ * MAC = Hash(timestamp&result&secretstring) for SHA-1/MD5
544
+ * MAC = HMAC(timestamp&result, secretkey) for HMAC-256
545
+ */
546
+ verifyBPWResponseMAC(timestamp, result, receivedMac) {
547
+ if (!receivedMac || receivedMac === 'NULL')
548
+ return false;
549
+ const text = `${timestamp}&${result}`;
550
+ const computed = (0, mac_1.computeHash)(text, this.config.secretKey, this.config.hashAlgorithm);
551
+ return computed.toLowerCase() === receivedMac.toLowerCase();
552
+ }
553
+ /**
554
+ * Verify the Authorization element MAC (spec 4.2.9).
555
+ * Use this for verifying authorization data in webhook responses.
556
+ */
557
+ verifyAuthorizationMAC(auth) {
558
+ const fields = [
559
+ ['', auth.authorizationType],
560
+ ['', auth.transactionId],
561
+ ['', auth.network],
562
+ ['', auth.orderId],
563
+ ['', auth.transactionAmount],
564
+ ['', auth.authorizedAmount],
565
+ ['', auth.currency],
566
+ ['', auth.accountedAmount],
567
+ ['', auth.refundedAmount],
568
+ ['', auth.transactionResult],
569
+ ['', auth.timestamp],
570
+ ['', auth.authorizationNumber],
571
+ ['', auth.acquirerBIN],
572
+ ['', auth.merchantId],
573
+ ['', auth.transactionStatus],
574
+ ['', auth.responseCodeISO],
575
+ ['', auth.panTail],
576
+ ['', auth.panExpiryDate],
577
+ ['', auth.paymentTypePP],
578
+ ['', auth.rrn],
579
+ ['', auth.cardType],
580
+ ['', auth.cardholderInfo],
581
+ ];
582
+ // For Authorization response MAC, the format is just values joined by &
583
+ const parts = [];
584
+ for (const [, value] of fields) {
585
+ if (value === undefined || value === null || value === '')
586
+ continue;
587
+ parts.push(value);
588
+ }
589
+ const text = parts.join('&');
590
+ const computed = (0, mac_1.computeHash)(text, this.config.secretKey, this.config.hashAlgorithm);
591
+ return computed.toLowerCase() === auth.mac.toLowerCase();
592
+ }
593
+ /**
594
+ * Parse a webhook/notification XML response and return structured data.
595
+ */
596
+ parseWebhook(responseXml) {
597
+ const parsed = (0, xml_1.parseBPWXmlResponse)(responseXml);
598
+ return {
599
+ ...parsed,
600
+ authorization: parsed.data ? (0, xml_1.parseAuthorization)(parsed.data) : undefined,
601
+ panAliasData: parsed.data ? (0, xml_1.parsePanAliasData)(parsed.data) : undefined,
602
+ operation: parsed.data ? (0, xml_1.parseOperation)(parsed.data) : undefined,
603
+ linkCreated: parsed.data ? (0, xml_1.parseLinkCreated)(parsed.data) : undefined,
604
+ };
605
+ }
606
+ }
607
+ exports.VposClient = VposClient;
608
+ //# sourceMappingURL=vpos-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vpos-client.js","sourceRoot":"","sources":["../src/vpos-client.ts"],"names":[],"mappings":"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"}