awesome-node-checkout 1.0.1 → 1.1.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.
Files changed (63) hide show
  1. package/CHANGELOG.md +37 -0
  2. package/README.md +44 -10
  3. package/dist/abstract/base-payment-provider.abstract.d.ts +30 -0
  4. package/dist/abstract/base-payment-provider.abstract.d.ts.map +1 -0
  5. package/dist/abstract/base-payment-provider.abstract.js +28 -0
  6. package/dist/abstract/base-payment-provider.abstract.js.map +1 -0
  7. package/dist/adapters/express/index.d.ts +65 -0
  8. package/dist/adapters/express/index.d.ts.map +1 -0
  9. package/dist/adapters/express/index.js +176 -0
  10. package/dist/adapters/express/index.js.map +1 -0
  11. package/dist/checkout-configurator.d.ts +66 -0
  12. package/dist/checkout-configurator.d.ts.map +1 -0
  13. package/dist/checkout-configurator.js +148 -0
  14. package/dist/checkout-configurator.js.map +1 -0
  15. package/dist/events/checkout-event-bus.d.ts +29 -0
  16. package/dist/events/checkout-event-bus.d.ts.map +1 -0
  17. package/dist/events/checkout-event-bus.js +37 -0
  18. package/dist/events/checkout-event-bus.js.map +1 -0
  19. package/dist/index.d.ts +19 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +25 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/interfaces/payment-provider.interface.d.ts +33 -0
  24. package/dist/interfaces/payment-provider.interface.d.ts.map +1 -0
  25. package/dist/interfaces/payment-provider.interface.js +3 -0
  26. package/dist/interfaces/payment-provider.interface.js.map +1 -0
  27. package/dist/interfaces/transaction-store.interface.d.ts +24 -0
  28. package/dist/interfaces/transaction-store.interface.d.ts.map +1 -0
  29. package/dist/interfaces/transaction-store.interface.js +3 -0
  30. package/dist/interfaces/transaction-store.interface.js.map +1 -0
  31. package/dist/models/checkout-config.model.d.ts +12 -0
  32. package/dist/models/checkout-config.model.d.ts.map +1 -0
  33. package/dist/models/checkout-config.model.js +3 -0
  34. package/dist/models/checkout-config.model.js.map +1 -0
  35. package/dist/models/errors.d.ts +7 -0
  36. package/dist/models/errors.d.ts.map +1 -0
  37. package/dist/models/errors.js +17 -0
  38. package/dist/models/errors.js.map +1 -0
  39. package/dist/models/payment-request.model.d.ts +21 -0
  40. package/dist/models/payment-request.model.d.ts.map +1 -0
  41. package/dist/models/payment-request.model.js +3 -0
  42. package/dist/models/payment-request.model.js.map +1 -0
  43. package/dist/models/payment-result.model.d.ts +23 -0
  44. package/dist/models/payment-result.model.d.ts.map +1 -0
  45. package/dist/models/payment-result.model.js +3 -0
  46. package/dist/models/payment-result.model.js.map +1 -0
  47. package/dist/providers/nexi/nexi.provider.d.ts +64 -0
  48. package/dist/providers/nexi/nexi.provider.d.ts.map +1 -0
  49. package/dist/providers/nexi/nexi.provider.js +227 -0
  50. package/dist/providers/nexi/nexi.provider.js.map +1 -0
  51. package/dist/providers/paypal/paypal.provider.d.ts +33 -0
  52. package/dist/providers/paypal/paypal.provider.d.ts.map +1 -0
  53. package/dist/providers/paypal/paypal.provider.js +167 -0
  54. package/dist/providers/paypal/paypal.provider.js.map +1 -0
  55. package/dist/providers/satispay/satispay.provider.d.ts +79 -0
  56. package/dist/providers/satispay/satispay.provider.d.ts.map +1 -0
  57. package/dist/providers/satispay/satispay.provider.js +301 -0
  58. package/dist/providers/satispay/satispay.provider.js.map +1 -0
  59. package/dist/stores/in-memory-transaction.store.d.ts +17 -0
  60. package/dist/stores/in-memory-transaction.store.d.ts.map +1 -0
  61. package/dist/stores/in-memory-transaction.store.js +30 -0
  62. package/dist/stores/in-memory-transaction.store.js.map +1 -0
  63. package/package.json +12 -3
@@ -0,0 +1,301 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.SatispayProvider = void 0;
37
+ const crypto = __importStar(require("crypto"));
38
+ const base_payment_provider_abstract_1 = require("../../abstract/base-payment-provider.abstract");
39
+ const in_memory_transaction_store_1 = require("../../stores/in-memory-transaction.store");
40
+ /**
41
+ * Satispay Business API provider.
42
+ * Flow: `webhook` — creates a MATCH_CODE payment, user pays via Satispay app,
43
+ * Satispay calls the `callback_url` webhook, which is correlated to the order
44
+ * via the `ITransactionStore`. The redirect is then verified via `handleRedirect`.
45
+ */
46
+ class SatispayProvider extends base_payment_provider_abstract_1.BasePaymentProvider {
47
+ constructor(config) {
48
+ super();
49
+ this.config = config;
50
+ this.name = 'satispay';
51
+ this.flow = 'webhook';
52
+ this.apiUrl =
53
+ config.environment === 'production'
54
+ ? 'https://authservices.satispay.com/g_business/v1'
55
+ : 'https://staging.authservices.satispay.com/g_business/v1';
56
+ this.transactionStore = config.transactionStore ?? new in_memory_transaction_store_1.InMemoryTransactionStore();
57
+ if (!config.webhookPublicKey) {
58
+ console.warn('[SatispayProvider] webhookPublicKey is not configured: ' +
59
+ 'incoming webhook signatures will NOT be verified. ' +
60
+ 'Anyone who knows the webhook URL can send fake payment notifications. ' +
61
+ 'Set webhookPublicKey in SatispayProviderConfig before deploying to production.');
62
+ }
63
+ }
64
+ // ---------------------------------------------------------------------------
65
+ // Authentication
66
+ // ---------------------------------------------------------------------------
67
+ buildSignatureHeaders(method, path, host, body) {
68
+ const bodyString = body ? JSON.stringify(body) : '';
69
+ const digest = 'SHA-256=' + crypto.createHash('sha256').update(bodyString).digest('base64');
70
+ const date = new Date().toUTCString();
71
+ const requestTarget = `${method.toLowerCase()} ${path}`;
72
+ const message = `(request-target): ${requestTarget}\n` +
73
+ `host: ${host}\n` +
74
+ `date: ${date}\n` +
75
+ `digest: ${digest}`;
76
+ const sign = crypto.createSign('RSA-SHA256');
77
+ sign.update(message);
78
+ const signature = sign.sign(this.config.privateKey, 'base64');
79
+ const authorization = `Signature keyId="${this.config.keyId}", algorithm="rsa-sha256", ` +
80
+ `headers="(request-target) host date digest", signature="${signature}"`;
81
+ return {
82
+ 'Content-Type': 'application/json',
83
+ 'Host': host,
84
+ 'Date': date,
85
+ 'Digest': digest,
86
+ 'Authorization': authorization,
87
+ };
88
+ }
89
+ /**
90
+ * Verifies the HTTP Signature in an inbound Satispay webhook request.
91
+ * Satispay signs webhooks with their own RSA private key; we verify using
92
+ * the corresponding public key supplied in `config.webhookPublicKey`.
93
+ *
94
+ * Returns `true` if the signature is valid, `false` otherwise.
95
+ * If no `webhookPublicKey` is configured the check is skipped and `true`
96
+ * is returned — callers should treat this as an unverified state.
97
+ */
98
+ verifyWebhookSignature(body, headers) {
99
+ if (!this.config.webhookPublicKey) {
100
+ return true; // verification skipped — no public key configured
101
+ }
102
+ try {
103
+ const authHeader = headers['authorization'] ?? headers['Authorization'];
104
+ if (!authHeader)
105
+ return false;
106
+ // Parse the Signature params from the Authorization header.
107
+ // Format: Signature keyId="...", algorithm="...", headers="...", signature="..."
108
+ // Use indexOf-based parsing to avoid ReDoS-prone regexes on untrusted input.
109
+ const sigParams = {};
110
+ const schemePrefix = 'Signature ';
111
+ const paramStr = authHeader.startsWith(schemePrefix)
112
+ ? authHeader.slice(schemePrefix.length)
113
+ : authHeader;
114
+ for (const part of paramStr.split(',')) {
115
+ const eqIdx = part.indexOf('="');
116
+ if (eqIdx === -1)
117
+ continue;
118
+ const key = part.slice(0, eqIdx).trim();
119
+ const valueStart = eqIdx + 2;
120
+ const valueEnd = part.lastIndexOf('"');
121
+ if (valueEnd <= valueStart)
122
+ continue;
123
+ const value = part.slice(valueStart, valueEnd);
124
+ if (key)
125
+ sigParams[key] = value;
126
+ }
127
+ const { signature, headers: signedHeaders = '(request-target) host date digest' } = sigParams;
128
+ if (!signature)
129
+ return false;
130
+ // Reconstruct the signed message from the incoming headers
131
+ const headerNames = signedHeaders.split(' ');
132
+ const bodyString = body ? JSON.stringify(body) : '';
133
+ const digest = 'SHA-256=' + crypto.createHash('sha256').update(bodyString).digest('base64');
134
+ const parts = [];
135
+ for (const name of headerNames) {
136
+ if (name === 'digest') {
137
+ parts.push(`digest: ${digest}`);
138
+ }
139
+ else {
140
+ const value = headers[name] ??
141
+ headers[name.toLowerCase()] ??
142
+ headers[name.toUpperCase()];
143
+ if (value === undefined)
144
+ return false;
145
+ parts.push(`${name}: ${value}`);
146
+ }
147
+ }
148
+ const message = parts.join('\n');
149
+ const verify = crypto.createVerify('RSA-SHA256');
150
+ verify.update(message);
151
+ return verify.verify(this.config.webhookPublicKey, signature, 'base64');
152
+ }
153
+ catch {
154
+ return false;
155
+ }
156
+ }
157
+ async request(method, url, body) {
158
+ const parsed = new URL(url);
159
+ const headers = this.buildSignatureHeaders(method, parsed.pathname, parsed.host, body);
160
+ const response = await fetch(url, {
161
+ method,
162
+ headers,
163
+ body: body ? JSON.stringify(body) : undefined,
164
+ });
165
+ const text = await response.text();
166
+ if (!response.ok) {
167
+ throw new Error(`Satispay API ${response.status}: ${text}`);
168
+ }
169
+ return JSON.parse(text);
170
+ }
171
+ // ---------------------------------------------------------------------------
172
+ // IPaymentProvider implementation
173
+ // ---------------------------------------------------------------------------
174
+ async createPayment(request) {
175
+ try {
176
+ const orderId = request.orderId ?? `ORD-${Date.now()}`;
177
+ const baseUrl = this.config.serverUrl ?? '';
178
+ // Satispay replaces {uuid} at runtime with the actual payment ID
179
+ const callbackUrl = `${baseUrl}/checkout/satispay/webhook?order_id=${orderId}&payment_id={uuid}`;
180
+ const body = {
181
+ flow: 'MATCH_CODE',
182
+ amount_unit: Math.round(request.amount * 100),
183
+ currency: request.currency,
184
+ external_code: orderId,
185
+ callback_url: callbackUrl,
186
+ redirect_url: request.returnUrl,
187
+ metadata: request.metadata,
188
+ };
189
+ const payment = await this.request('POST', `${this.apiUrl}/payments`, body);
190
+ // Persist the mapping orderId → paymentId for later webhook correlation
191
+ await this.transactionStore.save(orderId, {
192
+ provider: 'satispay',
193
+ orderId,
194
+ paymentId: payment['id'],
195
+ createdAt: new Date().toISOString(),
196
+ });
197
+ return {
198
+ success: true,
199
+ paymentId: payment['id'],
200
+ approvalUrl: (payment['redirect_url'] ?? payment['url_checkout']),
201
+ status: payment['status'],
202
+ raw: payment,
203
+ };
204
+ }
205
+ catch (error) {
206
+ return this.errorResult(error, 'Failed to create Satispay payment');
207
+ }
208
+ }
209
+ /** For Satispay, execute is equivalent to a status check */
210
+ async executePayment(paymentId) {
211
+ return this.getPaymentDetails(paymentId);
212
+ }
213
+ async getPaymentDetails(paymentId) {
214
+ try {
215
+ const payment = await this.request('GET', `${this.apiUrl}/payments/${paymentId}`);
216
+ return {
217
+ success: true,
218
+ paymentId: payment['id'],
219
+ status: payment['status'],
220
+ raw: payment,
221
+ };
222
+ }
223
+ catch (error) {
224
+ return this.errorResult(error, 'Failed to get Satispay payment details');
225
+ }
226
+ }
227
+ async refundPayment(paymentId, amount) {
228
+ try {
229
+ const body = amount ? { amount_unit: Math.round(amount * 100) } : {};
230
+ const refund = await this.request('POST', `${this.apiUrl}/payments/${paymentId}/refunds`, body);
231
+ return {
232
+ success: true,
233
+ paymentId: refund['id'],
234
+ status: refund['status'],
235
+ raw: refund,
236
+ };
237
+ }
238
+ catch (error) {
239
+ return this.errorResult(error, 'Failed to refund Satispay payment');
240
+ }
241
+ }
242
+ /**
243
+ * Handles the async webhook notification from Satispay.
244
+ * Satispay calls this URL with `payment_id` (the Satispay payment UUID).
245
+ * The HTTP Signature in the Authorization header is verified against
246
+ * `config.webhookPublicKey` (when configured) before processing.
247
+ * We then confirm the payment status via an authenticated API call.
248
+ */
249
+ async handleWebhook(body, headers) {
250
+ if (!this.verifyWebhookSignature(body, headers)) {
251
+ return { success: false, error: 'Webhook signature verification failed' };
252
+ }
253
+ const paymentId = body['payment_id'] ?? body['id'];
254
+ if (!paymentId) {
255
+ return { success: false, error: 'Missing payment_id in webhook body' };
256
+ }
257
+ try {
258
+ const payment = await this.request('GET', `${this.apiUrl}/payments/${paymentId}`);
259
+ return {
260
+ success: payment['status'] === 'ACCEPTED',
261
+ paymentId: payment['id'],
262
+ status: payment['status'],
263
+ raw: payment,
264
+ };
265
+ }
266
+ catch (error) {
267
+ const msg = error instanceof Error ? error.message : 'Webhook handling failed';
268
+ return { success: false, paymentId, error: msg };
269
+ }
270
+ }
271
+ /**
272
+ * Handles the redirect back to the merchant app after the Satispay flow.
273
+ * Looks up the transaction by `order_id` in the store, then verifies status.
274
+ */
275
+ async handleRedirect(query) {
276
+ const orderId = query['order_id'];
277
+ if (!orderId) {
278
+ return { success: false, error: 'Missing order_id in redirect query' };
279
+ }
280
+ const transaction = await this.transactionStore.get(orderId);
281
+ if (!transaction?.paymentId) {
282
+ return {
283
+ success: false,
284
+ error: `Transaction not found for order '${orderId}'. ` +
285
+ 'Ensure the webhook was received before the redirect.',
286
+ };
287
+ }
288
+ const details = await this.getPaymentDetails(transaction.paymentId);
289
+ if (details.success && details.status === 'ACCEPTED') {
290
+ await this.transactionStore.delete(orderId);
291
+ }
292
+ return {
293
+ success: details.success && details.status === 'ACCEPTED',
294
+ paymentId: details.paymentId,
295
+ status: details.status,
296
+ raw: details.raw,
297
+ };
298
+ }
299
+ }
300
+ exports.SatispayProvider = SatispayProvider;
301
+ //# sourceMappingURL=satispay.provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"satispay.provider.js","sourceRoot":"","sources":["../../../src/providers/satispay/satispay.provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { ITransactionStore, TransactionData } from '../interfaces/transaction-store.interface';
2
+ /**
3
+ * Built-in in-memory transaction store.
4
+ * Suitable for development and single-process deployments.
5
+ *
6
+ * For production multi-instance deployments, implement `ITransactionStore`
7
+ * backed by Redis, PostgreSQL, MongoDB, etc.
8
+ */
9
+ export declare class InMemoryTransactionStore implements ITransactionStore {
10
+ private readonly store;
11
+ save(key: string, data: TransactionData): Promise<void>;
12
+ get(key: string): Promise<TransactionData | null>;
13
+ delete(key: string): Promise<void>;
14
+ /** Returns the number of stored transactions (useful for testing) */
15
+ get size(): number;
16
+ }
17
+ //# sourceMappingURL=in-memory-transaction.store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"in-memory-transaction.store.d.ts","sourceRoot":"","sources":["../../src/stores/in-memory-transaction.store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,2CAA2C,CAAC;AAE/F;;;;;;GAMG;AACH,qBAAa,wBAAyB,YAAW,iBAAiB;IAChE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA2C;IAE3D,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvD,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAIjD,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxC,qEAAqE;IACrE,IAAI,IAAI,IAAI,MAAM,CAEjB;CACF"}
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.InMemoryTransactionStore = void 0;
4
+ /**
5
+ * Built-in in-memory transaction store.
6
+ * Suitable for development and single-process deployments.
7
+ *
8
+ * For production multi-instance deployments, implement `ITransactionStore`
9
+ * backed by Redis, PostgreSQL, MongoDB, etc.
10
+ */
11
+ class InMemoryTransactionStore {
12
+ constructor() {
13
+ this.store = new Map();
14
+ }
15
+ async save(key, data) {
16
+ this.store.set(key, { ...data });
17
+ }
18
+ async get(key) {
19
+ return this.store.get(key) ?? null;
20
+ }
21
+ async delete(key) {
22
+ this.store.delete(key);
23
+ }
24
+ /** Returns the number of stored transactions (useful for testing) */
25
+ get size() {
26
+ return this.store.size;
27
+ }
28
+ }
29
+ exports.InMemoryTransactionStore = InMemoryTransactionStore;
30
+ //# sourceMappingURL=in-memory-transaction.store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"in-memory-transaction.store.js","sourceRoot":"","sources":["../../src/stores/in-memory-transaction.store.ts"],"names":[],"mappings":";;;AAEA;;;;;;GAMG;AACH,MAAa,wBAAwB;IAArC;QACmB,UAAK,GAAiC,IAAI,GAAG,EAAE,CAAC;IAkBnE,CAAC;IAhBC,KAAK,CAAC,IAAI,CAAC,GAAW,EAAE,IAAqB;QAC3C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAED,qEAAqE;IACrE,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;IACzB,CAAC;CACF;AAnBD,4DAmBC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "awesome-node-checkout",
3
- "version": "1.0.1",
3
+ "version": "1.1.0",
4
4
  "description": "Framework-agnostic payment checkout library for Node.js",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -18,6 +18,7 @@
18
18
  "files": [
19
19
  "dist",
20
20
  "README.md",
21
+ "CHANGELOG.md",
21
22
  "LICENSE"
22
23
  ],
23
24
  "keywords": [
@@ -31,7 +32,15 @@
31
32
  "typescript",
32
33
  "framework-agnostic"
33
34
  ],
34
- "author": "",
35
+ "author": "Nicola Brecciaroli <nicola.brecciaroli@gmail.com>",
36
+ "repository": {
37
+ "type": "git",
38
+ "url": "https://github.com/nik2208/awesome-node-checkout.git"
39
+ },
40
+ "bugs": {
41
+ "url": "https://github.com/nik2208/awesome-node-checkout/issues"
42
+ },
43
+ "homepage": "https://github.com/nik2208/awesome-node-checkout#readme",
35
44
  "license": "MIT",
36
45
  "devDependencies": {
37
46
  "@types/express": "^5.0.0",
@@ -45,4 +54,4 @@
45
54
  "dependencies": {
46
55
  "@paypal/paypal-server-sdk": "^2.2.0"
47
56
  }
48
- }
57
+ }