awesome-node-checkout 1.2.5 → 2.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.
- package/CHANGELOG.md +53 -0
- package/README.md +81 -23
- package/dist/adapters/express/index.d.ts +35 -2
- package/dist/adapters/express/index.d.ts.map +1 -1
- package/dist/adapters/express/index.js +77 -34
- package/dist/adapters/express/index.js.map +1 -1
- package/dist/checkout-configurator.d.ts +18 -1
- package/dist/checkout-configurator.d.ts.map +1 -1
- package/dist/checkout-configurator.js +58 -72
- package/dist/checkout-configurator.js.map +1 -1
- package/dist/events/checkout-event-bus.d.ts +20 -1
- package/dist/events/checkout-event-bus.d.ts.map +1 -1
- package/dist/events/checkout-event-bus.js +18 -9
- package/dist/events/checkout-event-bus.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/models/errors.d.ts +1 -1
- package/dist/models/errors.d.ts.map +1 -1
- package/dist/models/errors.js.map +1 -1
- package/dist/models/payment-result.model.d.ts +14 -1
- package/dist/models/payment-result.model.d.ts.map +1 -1
- package/dist/providers/nexi/nexi.provider.d.ts +3 -0
- package/dist/providers/nexi/nexi.provider.d.ts.map +1 -1
- package/dist/providers/nexi/nexi.provider.js +45 -5
- package/dist/providers/nexi/nexi.provider.js.map +1 -1
- package/dist/providers/paypal/paypal.provider.d.ts.map +1 -1
- package/dist/providers/paypal/paypal.provider.js +15 -2
- package/dist/providers/paypal/paypal.provider.js.map +1 -1
- package/dist/providers/satispay/satispay.provider.d.ts.map +1 -1
- package/dist/providers/satispay/satispay.provider.js +43 -4
- package/dist/providers/satispay/satispay.provider.js.map +1 -1
- package/dist/utils/ids.d.ts +10 -0
- package/dist/utils/ids.d.ts.map +1 -0
- package/dist/utils/ids.js +16 -0
- package/dist/utils/ids.js.map +1 -0
- package/dist/utils/money.d.ts +20 -0
- package/dist/utils/money.d.ts.map +1 -0
- package/dist/utils/money.js +68 -0
- package/dist/utils/money.js.map +1 -0
- package/dist/utils/parsing.util.d.ts +14 -4
- package/dist/utils/parsing.util.d.ts.map +1 -1
- package/dist/utils/parsing.util.js +32 -6
- package/dist/utils/parsing.util.js.map +1 -1
- package/package.json +1 -1
|
@@ -48,9 +48,26 @@ export declare class CheckoutConfigurator {
|
|
|
48
48
|
getProvider(name: string): IPaymentProvider;
|
|
49
49
|
/** Returns the names of all registered providers */
|
|
50
50
|
getRegisteredProviders(): string[];
|
|
51
|
+
/**
|
|
52
|
+
* Normalizes a callback / redirect / execute outcome according to the single meaning of
|
|
53
|
+
* `verified` ("the outcome was authenticated by a signature/MAC or by an authenticated
|
|
54
|
+
* read from the provider API"):
|
|
55
|
+
* - `verified` is `true` only when the provider explicitly set it to `true` (fail closed);
|
|
56
|
+
* - an unverified outcome never reports `success: true`, and carries no `paymentId` / `orderId`;
|
|
57
|
+
* - a verified outcome takes `orderId` from the local paymentId -> orderId map (keyed on the
|
|
58
|
+
* provider-authenticated `paymentId`) or from the provider's own `orderId`, never from the
|
|
59
|
+
* request query or from unsigned body fields, whatever name the provider is registered under.
|
|
60
|
+
*/
|
|
61
|
+
private normalizeOutcome;
|
|
51
62
|
/** Create a new payment via the specified provider */
|
|
52
63
|
createPayment(providerName: string, request: PaymentRequest): Promise<PaymentResult>;
|
|
53
|
-
/**
|
|
64
|
+
/**
|
|
65
|
+
* Execute/capture a previously created payment.
|
|
66
|
+
* The result and the emitted event are keyed on the `paymentId` authenticated by the
|
|
67
|
+
* provider (e.g. the MAC-covered Nexi `codTrans`), never on the caller's argument.
|
|
68
|
+
* When a non-empty `paymentId` argument differs from the authenticated one, the call fails
|
|
69
|
+
* with `success: false`, `verified: false`, error `'Payment id does not match the outcome'`.
|
|
70
|
+
*/
|
|
54
71
|
executePayment(providerName: string, paymentId: string, data?: Record<string, string>): Promise<PaymentResult>;
|
|
55
72
|
/** Retrieve the current status and details of a payment */
|
|
56
73
|
getPaymentDetails(providerName: string, paymentId: string): Promise<PaymentResult>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkout-configurator.d.ts","sourceRoot":"","sources":["../src/checkout-configurator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC7E,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAEhE,OAAO,EAAE,gBAAgB,EAA2C,MAAM,6BAA6B,CAAC;AAExG;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,oBAAoB;IAQnB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAPnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA4C;IACtE,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAkC;IAEhE,wDAAwD;IACxD,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAA0B;gBAE9B,MAAM,GAAE,cAAmB;IAExD,0FAA0F;IAC1F,OAAO,CAAC,eAAe;IAUvB,8EAA8E;YAChE,IAAI;IASlB;;;OAGG;IACH,gBAAgB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI;IAalD;;;OAGG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB;IAY3C,oDAAoD;IACpD,sBAAsB,IAAI,MAAM,EAAE;IAIlC,sDAAsD;IAChD,aAAa,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"checkout-configurator.d.ts","sourceRoot":"","sources":["../src/checkout-configurator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC7E,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAEhE,OAAO,EAAE,gBAAgB,EAA2C,MAAM,6BAA6B,CAAC;AAExG;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,oBAAoB;IAQnB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAPnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA4C;IACtE,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAkC;IAEhE,wDAAwD;IACxD,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAA0B;gBAE9B,MAAM,GAAE,cAAmB;IAExD,0FAA0F;IAC1F,OAAO,CAAC,eAAe;IAUvB,8EAA8E;YAChE,IAAI;IASlB;;;OAGG;IACH,gBAAgB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI;IAalD;;;OAGG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB;IAY3C,oDAAoD;IACpD,sBAAsB,IAAI,MAAM,EAAE;IAIlC;;;;;;;;;OASG;IACH,OAAO,CAAC,gBAAgB;IAiBxB,sDAAsD;IAChD,aAAa,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;IAoB1F;;;;;;OAMG;IACG,cAAc,CAClB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,EACjB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC5B,OAAO,CAAC,aAAa,CAAC;IA8BzB,2DAA2D;IACrD,iBAAiB,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAKxF,qCAAqC;IAC/B,aAAa,CACjB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,aAAa,CAAC;IAmBzB;;;OAGG;IACG,aAAa,CACjB,YAAY,EAAE,MAAM,EACpB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,EACpC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC9B,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,GACtE,OAAO,CAAC,aAAa,CAAC;IAyBzB;;;OAGG;IACG,cAAc,CAClB,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC5B,OAAO,CAAC,aAAa,CAAC;CAuB1B"}
|
|
@@ -76,6 +76,33 @@ class CheckoutConfigurator {
|
|
|
76
76
|
getRegisteredProviders() {
|
|
77
77
|
return Array.from(this.providers.keys());
|
|
78
78
|
}
|
|
79
|
+
/**
|
|
80
|
+
* Normalizes a callback / redirect / execute outcome according to the single meaning of
|
|
81
|
+
* `verified` ("the outcome was authenticated by a signature/MAC or by an authenticated
|
|
82
|
+
* read from the provider API"):
|
|
83
|
+
* - `verified` is `true` only when the provider explicitly set it to `true` (fail closed);
|
|
84
|
+
* - an unverified outcome never reports `success: true`, and carries no `paymentId` / `orderId`;
|
|
85
|
+
* - a verified outcome takes `orderId` from the local paymentId -> orderId map (keyed on the
|
|
86
|
+
* provider-authenticated `paymentId`) or from the provider's own `orderId`, never from the
|
|
87
|
+
* request query or from unsigned body fields, whatever name the provider is registered under.
|
|
88
|
+
*/
|
|
89
|
+
normalizeOutcome(result) {
|
|
90
|
+
const verified = result.verified === true;
|
|
91
|
+
if (!verified) {
|
|
92
|
+
result.paymentId = undefined;
|
|
93
|
+
result.orderId = undefined;
|
|
94
|
+
if (result.success) {
|
|
95
|
+
result.success = false;
|
|
96
|
+
result.error = result.error ?? 'Payment outcome could not be verified';
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
result.orderId =
|
|
101
|
+
(result.paymentId ? this.paymentOrders.get(result.paymentId) : undefined) ?? result.orderId;
|
|
102
|
+
}
|
|
103
|
+
result.verified = verified;
|
|
104
|
+
return result;
|
|
105
|
+
}
|
|
79
106
|
/** Create a new payment via the specified provider */
|
|
80
107
|
async createPayment(providerName, request) {
|
|
81
108
|
const provider = this.getProvider(providerName);
|
|
@@ -90,26 +117,42 @@ class CheckoutConfigurator {
|
|
|
90
117
|
orderId: request.orderId,
|
|
91
118
|
status: result.status,
|
|
92
119
|
error: result.error,
|
|
93
|
-
|
|
120
|
+
// Creation reports no payment outcome: nothing has been authenticated yet.
|
|
121
|
+
verified: false,
|
|
94
122
|
raw: result.raw,
|
|
95
123
|
});
|
|
96
124
|
return result;
|
|
97
125
|
}
|
|
98
|
-
/**
|
|
126
|
+
/**
|
|
127
|
+
* Execute/capture a previously created payment.
|
|
128
|
+
* The result and the emitted event are keyed on the `paymentId` authenticated by the
|
|
129
|
+
* provider (e.g. the MAC-covered Nexi `codTrans`), never on the caller's argument.
|
|
130
|
+
* When a non-empty `paymentId` argument differs from the authenticated one, the call fails
|
|
131
|
+
* with `success: false`, `verified: false`, error `'Payment id does not match the outcome'`.
|
|
132
|
+
*/
|
|
99
133
|
async executePayment(providerName, paymentId, data) {
|
|
100
134
|
const provider = this.getProvider(providerName);
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
135
|
+
let result = await provider.executePayment(paymentId, data);
|
|
136
|
+
if (result.verified === true &&
|
|
137
|
+
typeof paymentId === 'string' &&
|
|
138
|
+
paymentId !== '' &&
|
|
139
|
+
result.paymentId !== paymentId) {
|
|
140
|
+
result = {
|
|
141
|
+
success: false,
|
|
142
|
+
verified: false,
|
|
143
|
+
status: 'FAILED',
|
|
144
|
+
error: 'Payment id does not match the outcome',
|
|
145
|
+
raw: result.raw,
|
|
146
|
+
};
|
|
105
147
|
}
|
|
148
|
+
this.normalizeOutcome(result);
|
|
106
149
|
await this.emit(result.success ? 'payment.completed' : 'payment.failed', {
|
|
107
150
|
provider: providerName,
|
|
108
|
-
paymentId,
|
|
109
|
-
orderId,
|
|
151
|
+
paymentId: result.paymentId,
|
|
152
|
+
orderId: result.orderId,
|
|
110
153
|
status: result.status,
|
|
111
154
|
error: result.error,
|
|
112
|
-
verified: result.
|
|
155
|
+
verified: result.verified === true,
|
|
113
156
|
raw: result.raw,
|
|
114
157
|
});
|
|
115
158
|
return result;
|
|
@@ -133,7 +176,7 @@ class CheckoutConfigurator {
|
|
|
133
176
|
orderId,
|
|
134
177
|
status: result.status,
|
|
135
178
|
error: result.error,
|
|
136
|
-
verified: result.
|
|
179
|
+
verified: result.verified === true,
|
|
137
180
|
raw: result.raw,
|
|
138
181
|
});
|
|
139
182
|
return result;
|
|
@@ -148,48 +191,14 @@ class CheckoutConfigurator {
|
|
|
148
191
|
throw new errors_1.CheckoutError(`Provider '${providerName}' does not support webhook handling`, 'WEBHOOK_NOT_SUPPORTED', providerName);
|
|
149
192
|
}
|
|
150
193
|
const result = await provider.handleWebhook(body, headers, query, context);
|
|
151
|
-
|
|
152
|
-
const method = context?.method?.toUpperCase();
|
|
153
|
-
const isGetOrHead = method === 'GET' || method === 'HEAD';
|
|
154
|
-
const isNexi = providerName.toLowerCase() === 'nexi';
|
|
155
|
-
const isVerified = result.verified ?? result.success;
|
|
156
|
-
let orderId;
|
|
157
|
-
if (isVerified) {
|
|
158
|
-
if (isNexi) {
|
|
159
|
-
// For Nexi, orderId only from local map or codTrans (which is MAC-covered), never unsigned body or query
|
|
160
|
-
orderId =
|
|
161
|
-
(result.paymentId ? this.paymentOrders.get(result.paymentId) : undefined) ??
|
|
162
|
-
rawAny?.codTrans ??
|
|
163
|
-
result.orderId;
|
|
164
|
-
result.orderId = orderId;
|
|
165
|
-
}
|
|
166
|
-
else {
|
|
167
|
-
orderId =
|
|
168
|
-
(result.paymentId ? this.paymentOrders.get(result.paymentId) : undefined) ??
|
|
169
|
-
result.orderId ??
|
|
170
|
-
(!isGetOrHead ? (rawAny?.orderId ?? rawAny?.order_id) : undefined) ??
|
|
171
|
-
rawAny?.external_code ??
|
|
172
|
-
(!isGetOrHead ? query?.order_id : undefined);
|
|
173
|
-
if (orderId) {
|
|
174
|
-
result.orderId = orderId;
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
else {
|
|
179
|
-
// When verification failed, do not populate orderId from query or unsigned body fields
|
|
180
|
-
orderId = undefined;
|
|
181
|
-
result.orderId = undefined;
|
|
182
|
-
}
|
|
183
|
-
if (result.verified === undefined) {
|
|
184
|
-
result.verified = isVerified;
|
|
185
|
-
}
|
|
194
|
+
this.normalizeOutcome(result);
|
|
186
195
|
await this.emit('webhook.received', {
|
|
187
196
|
provider: providerName,
|
|
188
197
|
paymentId: result.paymentId,
|
|
189
198
|
orderId: result.orderId,
|
|
190
199
|
status: result.status,
|
|
191
200
|
error: result.error,
|
|
192
|
-
verified:
|
|
201
|
+
verified: result.verified,
|
|
193
202
|
data: body ?? query,
|
|
194
203
|
raw: result.raw,
|
|
195
204
|
});
|
|
@@ -205,37 +214,14 @@ class CheckoutConfigurator {
|
|
|
205
214
|
throw new errors_1.CheckoutError(`Provider '${providerName}' does not support redirect handling`, 'REDIRECT_NOT_SUPPORTED', providerName);
|
|
206
215
|
}
|
|
207
216
|
const result = await provider.handleRedirect(query);
|
|
208
|
-
|
|
209
|
-
let orderId;
|
|
210
|
-
if (result.success) {
|
|
211
|
-
if (isNexi) {
|
|
212
|
-
// For Nexi, orderId only from local map or codTrans (MAC-covered), never unsigned query order_id
|
|
213
|
-
orderId =
|
|
214
|
-
(result.paymentId ? this.paymentOrders.get(result.paymentId) : undefined) ??
|
|
215
|
-
query?.codTrans ??
|
|
216
|
-
result.orderId;
|
|
217
|
-
}
|
|
218
|
-
else {
|
|
219
|
-
orderId =
|
|
220
|
-
(result.paymentId ? this.paymentOrders.get(result.paymentId) : undefined) ??
|
|
221
|
-
result.orderId ??
|
|
222
|
-
query?.order_id ??
|
|
223
|
-
query?.codTrans;
|
|
224
|
-
}
|
|
225
|
-
result.orderId = orderId;
|
|
226
|
-
}
|
|
227
|
-
else {
|
|
228
|
-
// On failed verification or failed payment, never take orderId from query
|
|
229
|
-
orderId = undefined;
|
|
230
|
-
result.orderId = undefined;
|
|
231
|
-
}
|
|
217
|
+
this.normalizeOutcome(result);
|
|
232
218
|
await this.emit(result.success ? 'payment.completed' : 'payment.failed', {
|
|
233
219
|
provider: providerName,
|
|
234
220
|
paymentId: result.paymentId,
|
|
235
|
-
orderId,
|
|
221
|
+
orderId: result.orderId,
|
|
236
222
|
status: result.status,
|
|
237
223
|
error: result.error,
|
|
238
|
-
verified: result.
|
|
224
|
+
verified: result.verified === true,
|
|
239
225
|
raw: result.raw,
|
|
240
226
|
});
|
|
241
227
|
return result;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkout-configurator.js","sourceRoot":"","sources":["../src/checkout-configurator.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"checkout-configurator.js","sourceRoot":"","sources":["../src/checkout-configurator.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,12 +5,31 @@ export interface CheckoutEventPayload {
|
|
|
5
5
|
orderId?: string;
|
|
6
6
|
status?: string;
|
|
7
7
|
error?: string;
|
|
8
|
-
/**
|
|
8
|
+
/**
|
|
9
|
+
* True only when the outcome reported by this event was authenticated, either by a
|
|
10
|
+
* provider signature/MAC checked by the library or by an authenticated server-to-server
|
|
11
|
+
* read from the provider API. Always false for `payment.created` (no outcome exists yet)
|
|
12
|
+
* and for any outcome built from unauthenticated input. When false on
|
|
13
|
+
* `payment.completed` / `payment.failed` / `webhook.received`, `paymentId` and `orderId`
|
|
14
|
+
* are omitted.
|
|
15
|
+
*/
|
|
9
16
|
verified: boolean;
|
|
10
17
|
data?: any;
|
|
11
18
|
raw?: unknown;
|
|
12
19
|
timestamp: Date;
|
|
13
20
|
}
|
|
21
|
+
/**
|
|
22
|
+
* Wraps an error thrown (or a value rejected) by a consumer event listener.
|
|
23
|
+
* The consumer's original value is never mutated: it is available unchanged as `cause`,
|
|
24
|
+
* and `message` is copied from it (or `String(value)` for non-Error values).
|
|
25
|
+
*/
|
|
26
|
+
export declare class CheckoutListenerError extends Error {
|
|
27
|
+
/** The original value thrown by the listener, untouched */
|
|
28
|
+
readonly cause: unknown;
|
|
29
|
+
/** The event whose listener threw */
|
|
30
|
+
readonly event: CheckoutEventName;
|
|
31
|
+
constructor(event: CheckoutEventName, cause: unknown);
|
|
32
|
+
}
|
|
14
33
|
type EventListener = (payload: CheckoutEventPayload) => void | Promise<void>;
|
|
15
34
|
/**
|
|
16
35
|
* Simple event bus for checkout lifecycle events.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkout-event-bus.d.ts","sourceRoot":"","sources":["../../src/events/checkout-event-bus.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GACzB,iBAAiB,GACjB,mBAAmB,GACnB,gBAAgB,GAChB,kBAAkB,GAClB,kBAAkB,CAAC;AAEvB,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf
|
|
1
|
+
{"version":3,"file":"checkout-event-bus.d.ts","sourceRoot":"","sources":["../../src/events/checkout-event-bus.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GACzB,iBAAiB,GACjB,mBAAmB,GACnB,gBAAgB,GAChB,kBAAkB,GAClB,kBAAkB,CAAC;AAEvB,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;;;;OAOG;IACH,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,IAAI,CAAC;CACjB;AAED;;;;GAIG;AACH,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,2DAA2D;IAC3D,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,qCAAqC;IACrC,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAC;gBAEtB,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE,OAAO;CAOrD;AAED,KAAK,aAAa,GAAG,CAAC,OAAO,EAAE,oBAAoB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE7E;;;;;;;;;GASG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAsD;IAEhF,EAAE,CAAC,KAAK,EAAE,iBAAiB,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI;IAM3D,GAAG,CAAC,KAAK,EAAE,iBAAiB,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI;IAQtD,IAAI,CACR,KAAK,EAAE,iBAAiB,EACxB,OAAO,EAAE,IAAI,CAAC,oBAAoB,EAAE,WAAW,CAAC,GAC/C,OAAO,CAAC,IAAI,CAAC;CAcjB"}
|
|
@@ -1,6 +1,21 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.CheckoutEventBus = void 0;
|
|
3
|
+
exports.CheckoutEventBus = exports.CheckoutListenerError = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Wraps an error thrown (or a value rejected) by a consumer event listener.
|
|
6
|
+
* The consumer's original value is never mutated: it is available unchanged as `cause`,
|
|
7
|
+
* and `message` is copied from it (or `String(value)` for non-Error values).
|
|
8
|
+
*/
|
|
9
|
+
class CheckoutListenerError extends Error {
|
|
10
|
+
constructor(event, cause) {
|
|
11
|
+
super(cause instanceof Error ? cause.message : String(cause));
|
|
12
|
+
this.name = 'CheckoutListenerError';
|
|
13
|
+
this.cause = cause;
|
|
14
|
+
this.event = event;
|
|
15
|
+
Object.setPrototypeOf(this, CheckoutListenerError.prototype);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
exports.CheckoutListenerError = CheckoutListenerError;
|
|
4
19
|
/**
|
|
5
20
|
* Simple event bus for checkout lifecycle events.
|
|
6
21
|
*
|
|
@@ -35,14 +50,8 @@ class CheckoutEventBus {
|
|
|
35
50
|
await h(fullPayload);
|
|
36
51
|
}
|
|
37
52
|
catch (err) {
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
throw err;
|
|
41
|
-
}
|
|
42
|
-
const wrapped = new Error(String(err));
|
|
43
|
-
wrapped.__isEventListenerError = true;
|
|
44
|
-
wrapped.originalError = err;
|
|
45
|
-
throw wrapped;
|
|
53
|
+
// Never mutate the consumer's error (it may be frozen): wrap it instead.
|
|
54
|
+
throw new CheckoutListenerError(event, err);
|
|
46
55
|
}
|
|
47
56
|
}));
|
|
48
57
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkout-event-bus.js","sourceRoot":"","sources":["../../src/events/checkout-event-bus.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"checkout-event-bus.js","sourceRoot":"","sources":["../../src/events/checkout-event-bus.ts"],"names":[],"mappings":";;;AA2BA;;;;GAIG;AACH,MAAa,qBAAsB,SAAQ,KAAK;IAM9C,YAAY,KAAwB,EAAE,KAAc;QAClD,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC9D,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;QACpC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,qBAAqB,CAAC,SAAS,CAAC,CAAC;IAC/D,CAAC;CACF;AAbD,sDAaC;AAID;;;;;;;;;GASG;AACH,MAAa,gBAAgB;IAA7B;QACmB,cAAS,GAA4C,IAAI,GAAG,EAAE,CAAC;IAiClF,CAAC;IA/BC,EAAE,CAAC,KAAwB,EAAE,QAAuB;QAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QACjD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,GAAG,CAAC,KAAwB,EAAE,QAAuB;QACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC3C,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC;QACpE,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,IAAI,CACR,KAAwB,EACxB,OAAgD;QAEhD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QACjD,MAAM,WAAW,GAAyB,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC;QAChF,MAAM,OAAO,CAAC,GAAG,CACf,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;YACvB,IAAI,CAAC;gBACH,MAAM,CAAC,CAAC,WAAW,CAAC,CAAC;YACvB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,yEAAyE;gBACzE,MAAM,IAAI,qBAAqB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YAC9C,CAAC;QACH,CAAC,CAAC,CACH,CAAC;IACJ,CAAC;CACF;AAlCD,4CAkCC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -7,7 +7,7 @@ export type { CheckoutConfig } from './models/checkout-config.model';
|
|
|
7
7
|
export { CheckoutError } from './models/errors';
|
|
8
8
|
export type { CheckoutErrorCode } from './models/errors';
|
|
9
9
|
export { BasePaymentProvider } from './abstract/base-payment-provider.abstract';
|
|
10
|
-
export { CheckoutEventBus } from './events/checkout-event-bus';
|
|
10
|
+
export { CheckoutEventBus, CheckoutListenerError } from './events/checkout-event-bus';
|
|
11
11
|
export type { CheckoutEventName, CheckoutEventPayload } from './events/checkout-event-bus';
|
|
12
12
|
export { InMemoryTransactionStore } from './stores/in-memory-transaction.store';
|
|
13
13
|
export { PayPalProvider } from './providers/paypal/paypal.provider';
|
|
@@ -16,4 +16,5 @@ export { NexiProvider } from './providers/nexi/nexi.provider';
|
|
|
16
16
|
export type { NexiProviderConfig } from './providers/nexi/nexi.provider';
|
|
17
17
|
export { SatispayProvider } from './providers/satispay/satispay.provider';
|
|
18
18
|
export type { SatispayProviderConfig } from './providers/satispay/satispay.provider';
|
|
19
|
+
export { ISO_4217_ALPHA3_CODES } from './utils/parsing.util';
|
|
19
20
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAG/D,YAAY,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,yCAAyC,CAAC;AAC7F,YAAY,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,0CAA0C,CAAC;AAGnG,YAAY,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AACrE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAClF,YAAY,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,YAAY,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAGzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,2CAA2C,CAAC;AAGhF,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAG/D,YAAY,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,yCAAyC,CAAC;AAC7F,YAAY,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,0CAA0C,CAAC;AAGnG,YAAY,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AACrE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAClF,YAAY,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,YAAY,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAGzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,2CAA2C,CAAC;AAGhF,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACtF,YAAY,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAG3F,OAAO,EAAE,wBAAwB,EAAE,MAAM,sCAAsC,CAAC;AAGhF,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,YAAY,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAE/E,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,YAAY,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAEzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAC;AAC1E,YAAY,EAAE,sBAAsB,EAAE,MAAM,wCAAwC,CAAC;AAGrF,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.SatispayProvider = exports.NexiProvider = exports.PayPalProvider = exports.InMemoryTransactionStore = exports.CheckoutEventBus = exports.BasePaymentProvider = exports.CheckoutError = exports.CheckoutConfigurator = void 0;
|
|
3
|
+
exports.ISO_4217_ALPHA3_CODES = exports.SatispayProvider = exports.NexiProvider = exports.PayPalProvider = exports.InMemoryTransactionStore = exports.CheckoutListenerError = exports.CheckoutEventBus = exports.BasePaymentProvider = exports.CheckoutError = exports.CheckoutConfigurator = void 0;
|
|
4
4
|
// ---- Configurator ----------------------------------------------------------
|
|
5
5
|
var checkout_configurator_1 = require("./checkout-configurator");
|
|
6
6
|
Object.defineProperty(exports, "CheckoutConfigurator", { enumerable: true, get: function () { return checkout_configurator_1.CheckoutConfigurator; } });
|
|
@@ -12,6 +12,7 @@ Object.defineProperty(exports, "BasePaymentProvider", { enumerable: true, get: f
|
|
|
12
12
|
// ---- Events ----------------------------------------------------------------
|
|
13
13
|
var checkout_event_bus_1 = require("./events/checkout-event-bus");
|
|
14
14
|
Object.defineProperty(exports, "CheckoutEventBus", { enumerable: true, get: function () { return checkout_event_bus_1.CheckoutEventBus; } });
|
|
15
|
+
Object.defineProperty(exports, "CheckoutListenerError", { enumerable: true, get: function () { return checkout_event_bus_1.CheckoutListenerError; } });
|
|
15
16
|
// ---- Stores ----------------------------------------------------------------
|
|
16
17
|
var in_memory_transaction_store_1 = require("./stores/in-memory-transaction.store");
|
|
17
18
|
Object.defineProperty(exports, "InMemoryTransactionStore", { enumerable: true, get: function () { return in_memory_transaction_store_1.InMemoryTransactionStore; } });
|
|
@@ -22,4 +23,7 @@ var nexi_provider_1 = require("./providers/nexi/nexi.provider");
|
|
|
22
23
|
Object.defineProperty(exports, "NexiProvider", { enumerable: true, get: function () { return nexi_provider_1.NexiProvider; } });
|
|
23
24
|
var satispay_provider_1 = require("./providers/satispay/satispay.provider");
|
|
24
25
|
Object.defineProperty(exports, "SatispayProvider", { enumerable: true, get: function () { return satispay_provider_1.SatispayProvider; } });
|
|
26
|
+
// ---- Utils -----------------------------------------------------------------
|
|
27
|
+
var parsing_util_1 = require("./utils/parsing.util");
|
|
28
|
+
Object.defineProperty(exports, "ISO_4217_ALPHA3_CODES", { enumerable: true, get: function () { return parsing_util_1.ISO_4217_ALPHA3_CODES; } });
|
|
25
29
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,+EAA+E;AAC/E,iEAA+D;AAAtD,6HAAA,oBAAoB,OAAA;AAU7B,0CAAgD;AAAvC,uGAAA,aAAa,OAAA;AAGtB,+EAA+E;AAC/E,4FAAgF;AAAvE,qIAAA,mBAAmB,OAAA;AAE5B,+EAA+E;AAC/E,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,+EAA+E;AAC/E,iEAA+D;AAAtD,6HAAA,oBAAoB,OAAA;AAU7B,0CAAgD;AAAvC,uGAAA,aAAa,OAAA;AAGtB,+EAA+E;AAC/E,4FAAgF;AAAvE,qIAAA,mBAAmB,OAAA;AAE5B,+EAA+E;AAC/E,kEAAsF;AAA7E,sHAAA,gBAAgB,OAAA;AAAE,2HAAA,qBAAqB,OAAA;AAGhD,+EAA+E;AAC/E,oFAAgF;AAAvE,uIAAA,wBAAwB,OAAA;AAEjC,+EAA+E;AAC/E,sEAAoE;AAA3D,iHAAA,cAAc,OAAA;AAGvB,gEAA8D;AAArD,6GAAA,YAAY,OAAA;AAGrB,4EAA0E;AAAjE,qHAAA,gBAAgB,OAAA;AAGzB,+EAA+E;AAC/E,qDAA6D;AAApD,qHAAA,qBAAqB,OAAA"}
|
package/dist/models/errors.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type CheckoutErrorCode = 'PROVIDER_NOT_FOUND' | 'PROVIDER_ALREADY_REGISTERED' | 'PAYMENT_FAILED' | 'WEBHOOK_NOT_SUPPORTED' | 'REDIRECT_NOT_SUPPORTED' | 'TRANSACTION_NOT_FOUND';
|
|
1
|
+
export type CheckoutErrorCode = 'PROVIDER_NOT_FOUND' | 'PROVIDER_ALREADY_REGISTERED' | 'PAYMENT_FAILED' | 'WEBHOOK_NOT_SUPPORTED' | 'REDIRECT_NOT_SUPPORTED' | 'TRANSACTION_NOT_FOUND' | 'INSECURE_CONFIGURATION' | 'INVALID_AMOUNT';
|
|
2
2
|
export declare class CheckoutError extends Error {
|
|
3
3
|
readonly code: CheckoutErrorCode;
|
|
4
4
|
readonly provider?: string | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/models/errors.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GACzB,oBAAoB,GACpB,6BAA6B,GAC7B,gBAAgB,GAChB,uBAAuB,GACvB,wBAAwB,GACxB,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/models/errors.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GACzB,oBAAoB,GACpB,6BAA6B,GAC7B,gBAAgB,GAChB,uBAAuB,GACvB,wBAAwB,GACxB,uBAAuB,GACvB,wBAAwB,GACxB,gBAAgB,CAAC;AAErB,qBAAa,aAAc,SAAQ,KAAK;aAGpB,IAAI,EAAE,iBAAiB;aACvB,QAAQ,CAAC,EAAE,MAAM;gBAFjC,OAAO,EAAE,MAAM,EACC,IAAI,EAAE,iBAAiB,EACvB,QAAQ,CAAC,EAAE,MAAM,YAAA;CASpC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/models/errors.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/models/errors.ts"],"names":[],"mappings":";;;AAUA,MAAa,aAAc,SAAQ,KAAK;IACtC,YACE,OAAe,EACC,IAAuB,EACvB,QAAiB;QAEjC,KAAK,CAAC,OAAO,CAAC,CAAC;QAHC,SAAI,GAAJ,IAAI,CAAmB;QACvB,aAAQ,GAAR,QAAQ,CAAS;QAGjC,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;QAC5B,qCAAqC;QACrC,IAAI,KAAK,CAAC,iBAAiB,EAAE,CAAC;YAC5B,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;CACF;AAbD,sCAaC"}
|
|
@@ -18,6 +18,15 @@ export interface PaymentResult {
|
|
|
18
18
|
orderId?: string;
|
|
19
19
|
/** Error message if success is false */
|
|
20
20
|
error?: string;
|
|
21
|
+
/**
|
|
22
|
+
* True only when this outcome was authenticated: by a provider signature/MAC checked by
|
|
23
|
+
* the library (e.g. the Nexi 7-field outcome MAC) or by an authenticated server-to-server
|
|
24
|
+
* read from the provider API (e.g. PayPal capture, Satispay `GET /payments/{id}`).
|
|
25
|
+
* `success: false` with `verified: true` is a genuine, authenticated failure (e.g. KO, CANCELED).
|
|
26
|
+
* Providers that do not set it are treated as unverified (fail closed).
|
|
27
|
+
* Not meaningful for `createPayment` (no outcome yet): the configurator does not trust it there.
|
|
28
|
+
*/
|
|
29
|
+
verified?: boolean;
|
|
21
30
|
/** Raw provider response — preserved in events and returned models, stripped from HTTP router responses */
|
|
22
31
|
raw?: any;
|
|
23
32
|
}
|
|
@@ -25,7 +34,11 @@ export interface PaymentResult {
|
|
|
25
34
|
export interface WebhookResult {
|
|
26
35
|
/** True when payment is confirmed/completed with a valid captured amount */
|
|
27
36
|
success: boolean;
|
|
28
|
-
/**
|
|
37
|
+
/**
|
|
38
|
+
* True only when the notification's outcome was authenticated by a provider signature/MAC
|
|
39
|
+
* or by an authenticated server-to-server read from the provider API. Anything other than
|
|
40
|
+
* `true` is treated as unverified.
|
|
41
|
+
*/
|
|
29
42
|
verified: boolean;
|
|
30
43
|
paymentId?: string;
|
|
31
44
|
orderId?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"payment-result.model.d.ts","sourceRoot":"","sources":["../../src/models/payment-result.model.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,MAAM,WAAW,aAAa;IAC5B,4EAA4E;IAC5E,OAAO,EAAE,OAAO,CAAC;IAEjB,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,wEAAwE;IACxE,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,sFAAsF;IACtF,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,2FAA2F;IAC3F,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,wFAAwF;IACxF,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,gEAAgE;IAChE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,8DAA8D;IAC9D,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,wCAAwC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,2GAA2G;IAC3G,GAAG,CAAC,EAAE,GAAG,CAAC;CACX;AAED,yCAAyC;AACzC,MAAM,WAAW,aAAa;IAC5B,4EAA4E;IAC5E,OAAO,EAAE,OAAO,CAAC;IACjB
|
|
1
|
+
{"version":3,"file":"payment-result.model.d.ts","sourceRoot":"","sources":["../../src/models/payment-result.model.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,MAAM,WAAW,aAAa;IAC5B,4EAA4E;IAC5E,OAAO,EAAE,OAAO,CAAC;IAEjB,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,wEAAwE;IACxE,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,sFAAsF;IACtF,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,2FAA2F;IAC3F,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,wFAAwF;IACxF,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,gEAAgE;IAChE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,8DAA8D;IAC9D,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,wCAAwC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;;;;;;OAOG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,2GAA2G;IAC3G,GAAG,CAAC,EAAE,GAAG,CAAC;CACX;AAED,yCAAyC;AACzC,MAAM,WAAW,aAAa;IAC5B,4EAA4E;IAC5E,OAAO,EAAE,OAAO,CAAC;IACjB;;;;OAIG;IACH,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,wFAAwF;IACxF,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,gEAAgE;IAChE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,GAAG,CAAC;CACX"}
|
|
@@ -63,6 +63,9 @@ export declare class NexiProvider extends BasePaymentProvider {
|
|
|
63
63
|
* Validates the POST-back data from Nexi.
|
|
64
64
|
* `data` is the query/body object sent by Nexi to the returnUrl.
|
|
65
65
|
* The outcome MAC is mandatory and verified over all 7 fields before the result is considered authoritative.
|
|
66
|
+
* The result (`paymentId`, `orderId`) is keyed on the MAC-covered `codTrans`. When a non-empty
|
|
67
|
+
* `paymentId` argument is given and differs from the outcome's `codTrans`, the call fails
|
|
68
|
+
* (`success: false`, `verified: false`): a genuine outcome for one order cannot confirm another.
|
|
66
69
|
*/
|
|
67
70
|
executePayment(paymentId: string, data?: Record<string, string>): Promise<PaymentResult>;
|
|
68
71
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nexi.provider.d.ts","sourceRoot":"","sources":["../../../src/providers/nexi/nexi.provider.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,+CAA+C,CAAC;
|
|
1
|
+
{"version":3,"file":"nexi.provider.d.ts","sourceRoot":"","sources":["../../../src/providers/nexi/nexi.provider.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,+CAA+C,CAAC;AAGpF,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAGjF,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,gCAAgC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yBAAyB;IACzB,WAAW,CAAC,EAAE,SAAS,GAAG,YAAY,CAAC;CACxC;AAED;;;;;;;GAOG;AACH,qBAAa,YAAa,SAAQ,mBAAmB;IAMvC,OAAO,CAAC,QAAQ,CAAC,MAAM;IALnC,QAAQ,CAAC,IAAI,UAAU;IACvB,QAAQ,CAAC,IAAI,EAAG,UAAU,CAAU;IAEpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAEH,MAAM,EAAE,kBAAkB;IAQvD;;;;;OAKG;IACH,OAAO,CAAC,IAAI;IAIZ;;;;;OAKG;IACH,OAAO,CAAC,WAAW;IAInB;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAIzB;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IASzB;;;OAGG;IACH,OAAO,CAAC,aAAa;IAIrB;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAwBzB,OAAO,CAAC,qBAAqB;IAiBvB,aAAa,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;IAmDpE;;;;;;;OAOG;IACG,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC;IAuE9F;;;OAGG;IACG,aAAa,CACjB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,QAAQ,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GACpC,OAAO,CAAC,aAAa,CAAC;IAqDnB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IA6G5D,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IA6C/E;;;;OAIG;IACG,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC;CAG5E"}
|
|
@@ -36,6 +36,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
36
36
|
exports.NexiProvider = void 0;
|
|
37
37
|
const crypto = __importStar(require("crypto"));
|
|
38
38
|
const base_payment_provider_abstract_1 = require("../../abstract/base-payment-provider.abstract");
|
|
39
|
+
const ids_1 = require("../../utils/ids");
|
|
40
|
+
const money_1 = require("../../utils/money");
|
|
39
41
|
const parsing_util_1 = require("../../utils/parsing.util");
|
|
40
42
|
/**
|
|
41
43
|
* Nexi eCommerce provider.
|
|
@@ -123,8 +125,19 @@ class NexiProvider extends base_payment_provider_abstract_1.BasePaymentProvider
|
|
|
123
125
|
}
|
|
124
126
|
async createPayment(request) {
|
|
125
127
|
try {
|
|
126
|
-
|
|
127
|
-
|
|
128
|
+
// Outcome amounts (redirect, webhook, details) and refunds are read and sent in hundredths:
|
|
129
|
+
// only 2-decimal currencies keep create, read-back and refund on the same scale.
|
|
130
|
+
// Numeric codes ('392') are normalised so they are checked like their alpha-3 code.
|
|
131
|
+
const currencyCode = (0, parsing_util_1.parseNexiCurrency)(request.currency) ?? request.currency;
|
|
132
|
+
if ((0, money_1.currencyExponent)(currencyCode) !== 2) {
|
|
133
|
+
return {
|
|
134
|
+
success: false,
|
|
135
|
+
error: 'Payment currency is not supported by Nexi: only currencies with 2 decimal places are accepted',
|
|
136
|
+
status: 'FAILED',
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
const amountCents = (0, money_1.toMinorUnits)(request.amount, currencyCode);
|
|
140
|
+
const orderId = request.orderId ?? (0, ids_1.generateOrderId)();
|
|
128
141
|
const mac = this.generateMac(orderId, request.currency, amountCents);
|
|
129
142
|
const params = {
|
|
130
143
|
alias: this.config.merchantId,
|
|
@@ -150,6 +163,9 @@ class NexiProvider extends base_payment_provider_abstract_1.BasePaymentProvider
|
|
|
150
163
|
};
|
|
151
164
|
}
|
|
152
165
|
catch (error) {
|
|
166
|
+
if ((0, money_1.isInvalidAmountError)(error)) {
|
|
167
|
+
return { success: false, error: error.message, status: 'FAILED' };
|
|
168
|
+
}
|
|
153
169
|
return this.errorResult(error, 'Failed to create Nexi payment');
|
|
154
170
|
}
|
|
155
171
|
}
|
|
@@ -157,11 +173,15 @@ class NexiProvider extends base_payment_provider_abstract_1.BasePaymentProvider
|
|
|
157
173
|
* Validates the POST-back data from Nexi.
|
|
158
174
|
* `data` is the query/body object sent by Nexi to the returnUrl.
|
|
159
175
|
* The outcome MAC is mandatory and verified over all 7 fields before the result is considered authoritative.
|
|
176
|
+
* The result (`paymentId`, `orderId`) is keyed on the MAC-covered `codTrans`. When a non-empty
|
|
177
|
+
* `paymentId` argument is given and differs from the outcome's `codTrans`, the call fails
|
|
178
|
+
* (`success: false`, `verified: false`): a genuine outcome for one order cannot confirm another.
|
|
160
179
|
*/
|
|
161
180
|
async executePayment(paymentId, data) {
|
|
162
181
|
try {
|
|
163
182
|
const esito = data?.esito ?? '';
|
|
164
|
-
const
|
|
183
|
+
const requestedId = typeof paymentId === 'string' && paymentId !== '' ? paymentId : undefined;
|
|
184
|
+
const codTrans = data?.codTrans ?? requestedId ?? '';
|
|
165
185
|
const importo = data?.importo ?? '';
|
|
166
186
|
const divisa = data?.divisa ?? '';
|
|
167
187
|
const dataStr = data?.data ?? '';
|
|
@@ -171,6 +191,7 @@ class NexiProvider extends base_payment_provider_abstract_1.BasePaymentProvider
|
|
|
171
191
|
if (!mac) {
|
|
172
192
|
return {
|
|
173
193
|
success: false,
|
|
194
|
+
verified: false,
|
|
174
195
|
paymentId: undefined,
|
|
175
196
|
status: 'FAILED',
|
|
176
197
|
error: 'MAC missing',
|
|
@@ -179,17 +200,29 @@ class NexiProvider extends base_payment_provider_abstract_1.BasePaymentProvider
|
|
|
179
200
|
if (!this.isValidHexMac(mac) || !this.safeVerifyResponseMac(codTrans, esito, importo, divisa, dataStr, orario, codAut, mac)) {
|
|
180
201
|
return {
|
|
181
202
|
success: false,
|
|
203
|
+
verified: false,
|
|
182
204
|
paymentId: undefined,
|
|
183
205
|
status: 'FAILED',
|
|
184
206
|
error: 'MAC verification failed: response may have been tampered with',
|
|
185
207
|
};
|
|
186
208
|
}
|
|
209
|
+
if (requestedId !== undefined && requestedId !== codTrans) {
|
|
210
|
+
return {
|
|
211
|
+
success: false,
|
|
212
|
+
verified: false,
|
|
213
|
+
paymentId: undefined,
|
|
214
|
+
status: 'FAILED',
|
|
215
|
+
error: 'Payment id does not match the outcome',
|
|
216
|
+
};
|
|
217
|
+
}
|
|
187
218
|
const amount = (0, parsing_util_1.parseAmountFromCents)(importo);
|
|
188
219
|
const currency = (0, parsing_util_1.parseNexiCurrency)(divisa);
|
|
189
220
|
const isPaid = esito === 'OK' && amount !== undefined && amount > 0 && !!currency && currency.trim() !== '';
|
|
190
221
|
return {
|
|
191
222
|
success: isPaid,
|
|
223
|
+
verified: true,
|
|
192
224
|
paymentId: codTrans,
|
|
225
|
+
orderId: codTrans,
|
|
193
226
|
status: esito === 'OK' ? 'COMPLETED' : 'FAILED',
|
|
194
227
|
amount,
|
|
195
228
|
currency,
|
|
@@ -206,7 +239,7 @@ class NexiProvider extends base_payment_provider_abstract_1.BasePaymentProvider
|
|
|
206
239
|
};
|
|
207
240
|
}
|
|
208
241
|
catch (error) {
|
|
209
|
-
return this.errorResult(error, 'Failed to execute Nexi payment');
|
|
242
|
+
return { ...this.errorResult(error, 'Failed to execute Nexi payment'), verified: false };
|
|
210
243
|
}
|
|
211
244
|
}
|
|
212
245
|
/**
|
|
@@ -340,6 +373,7 @@ class NexiProvider extends base_payment_provider_abstract_1.BasePaymentProvider
|
|
|
340
373
|
const isSuccess = isPaidStatus && amount !== undefined && amount > 0 && !!currency && currency.trim() !== '';
|
|
341
374
|
return {
|
|
342
375
|
success: isSuccess,
|
|
376
|
+
verified: true,
|
|
343
377
|
paymentId,
|
|
344
378
|
status: stato,
|
|
345
379
|
amount,
|
|
@@ -363,7 +397,10 @@ class NexiProvider extends base_payment_provider_abstract_1.BasePaymentProvider
|
|
|
363
397
|
async refundPayment(paymentId, amount) {
|
|
364
398
|
try {
|
|
365
399
|
const timestamp = new Date().toISOString();
|
|
366
|
-
|
|
400
|
+
// The refund API carries no currency. createPayment accepts only 2-decimal currencies,
|
|
401
|
+
// so a partial amount is always in hundredths. Only an omitted (undefined) amount means a
|
|
402
|
+
// full refund, as in PayPal: 0 and null are rejected by toMinorUnits like any invalid amount.
|
|
403
|
+
const importo = amount !== undefined ? (0, money_1.toMinorUnits)(amount, 'EUR').toString() : '';
|
|
367
404
|
const mac = this.generateRefundMac(this.config.merchantId, paymentId, importo, timestamp);
|
|
368
405
|
const params = {
|
|
369
406
|
alias: this.config.merchantId,
|
|
@@ -394,6 +431,9 @@ class NexiProvider extends base_payment_provider_abstract_1.BasePaymentProvider
|
|
|
394
431
|
};
|
|
395
432
|
}
|
|
396
433
|
catch (error) {
|
|
434
|
+
if ((0, money_1.isInvalidAmountError)(error)) {
|
|
435
|
+
return { success: false, error: error.message, status: 'FAILED' };
|
|
436
|
+
}
|
|
397
437
|
return this.errorResult(error, 'Failed to refund Nexi payment');
|
|
398
438
|
}
|
|
399
439
|
}
|