vona-module-pay-paypal 5.0.4 → 5.0.6
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/dist/bean/payProvider.paypal.d.ts +8 -5
- package/dist/bean/payProvider.paypal.d.ts.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +216 -71
- package/dist/index.js.map +1 -1
- package/dist/lib/paypalGateway.d.ts +2 -0
- package/dist/lib/paypalGateway.d.ts.map +1 -1
- package/package.json +3 -3
- package/src/bean/payProvider.paypal.ts +289 -92
- package/src/index.ts +1 -0
- package/src/lib/paypalGateway.ts +9 -1
|
@@ -20,19 +20,22 @@ export declare class PayProviderPaypal extends BeanBase implements IPayProviderE
|
|
|
20
20
|
createRefund(input: IPayProviderRefundInput, clientOptions: IPayProviderPaypalClientOptions): Promise<IPayProviderRefundSnapshot>;
|
|
21
21
|
queryRefund(input: IPayProviderRefundInput, clientOptions: IPayProviderPaypalClientOptions): Promise<IPayProviderRefundSnapshot>;
|
|
22
22
|
verifyWebhook(input: IPayProviderWebhookInput, clientOptions: IPayProviderPaypalClientOptions): Promise<IPayProviderVerifiedWebhook>;
|
|
23
|
+
private _mapRefundWebhook;
|
|
24
|
+
private _mapCaptureRefundedWebhook;
|
|
25
|
+
private _mapCaptureRefundedRefund;
|
|
26
|
+
private _ignoredCaptureRefund;
|
|
23
27
|
private _mapWebhook;
|
|
24
28
|
private _inputFromOrder;
|
|
25
29
|
private _mapOrder;
|
|
30
|
+
private _approvalUrl;
|
|
26
31
|
private _mapRefund;
|
|
32
|
+
private _isDefinitiveRefundRejection;
|
|
33
|
+
private _isPaypalNotFound;
|
|
27
34
|
private _gateway;
|
|
28
35
|
private _gatewayOptions;
|
|
29
36
|
private _throwGatewayError;
|
|
30
37
|
private _assertReady;
|
|
31
38
|
private _assertMerchant;
|
|
32
|
-
|
|
33
|
-
declare module 'vona-module-a-pay' {
|
|
34
|
-
interface IPayProviderRecord {
|
|
35
|
-
'pay-paypal:paypal': IPayProviderOptionsPaypal;
|
|
36
|
-
}
|
|
39
|
+
private _merchantReference;
|
|
37
40
|
}
|
|
38
41
|
//# sourceMappingURL=payProvider.paypal.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"payProvider.paypal.d.ts","sourceRoot":"","sources":["../../src/bean/payProvider.paypal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,4BAA4B,EAC5B,yBAAyB,EACzB,wBAAwB,EACxB,mBAAmB,EACnB,wBAAwB,EACxB,2BAA2B,EAC3B,uBAAuB,EACvB,0BAA0B,EAC1B,2BAA2B,EAC3B,wBAAwB,EACzB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,QAAQ,EAAU,MAAM,MAAM,CAAC;AAIxC,OAAO,KAAK,EAAE,cAAc,EAAyB,MAAM,yBAAyB,CAAC;AAIrF,MAAM,WAAW,8BAA+B,SAAQ,wBAAwB;CAAG;AAEnF,MAAM,WAAW,+BAAgC,SAAQ,yBAAyB;IAChF,gBAAgB,EAAE;QAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;QAAC,YAAY,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,CAAC;IACrF,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,OAAO,CAAC,EAAE,cAAc,CAAC;CAC1B;AASD,MAAM,WAAW,yBAA0B,SAAQ,4BAA4B,CAC7E,8BAA8B,EAC9B,+BAA+B,CAChC;CAAG;AAEJ,qBAwBa,iBACX,SAAQ,QACR,YAAW,mBAAmB,CAAC,+BAA+B,CAAC;IAEzD,YAAY,CAChB,KAAK,EAAE,wBAAwB,EAC/B,aAAa,EAAE,+BAA+B,GAC7C,OAAO,CAAC,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"payProvider.paypal.d.ts","sourceRoot":"","sources":["../../src/bean/payProvider.paypal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,4BAA4B,EAC5B,yBAAyB,EACzB,wBAAwB,EACxB,mBAAmB,EACnB,wBAAwB,EACxB,2BAA2B,EAC3B,uBAAuB,EACvB,0BAA0B,EAC1B,2BAA2B,EAC3B,wBAAwB,EACzB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,QAAQ,EAAU,MAAM,MAAM,CAAC;AAIxC,OAAO,KAAK,EAAE,cAAc,EAAyB,MAAM,yBAAyB,CAAC;AAIrF,MAAM,WAAW,8BAA+B,SAAQ,wBAAwB;CAAG;AAEnF,MAAM,WAAW,+BAAgC,SAAQ,yBAAyB;IAChF,gBAAgB,EAAE;QAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;QAAC,YAAY,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,CAAC;IACrF,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,OAAO,CAAC,EAAE,cAAc,CAAC;CAC1B;AASD,MAAM,WAAW,yBAA0B,SAAQ,4BAA4B,CAC7E,8BAA8B,EAC9B,+BAA+B,CAChC;CAAG;AAEJ,qBAwBa,iBACX,SAAQ,QACR,YAAW,mBAAmB,CAAC,+BAA+B,CAAC;IAEzD,YAAY,CAChB,KAAK,EAAE,wBAAwB,EAC/B,aAAa,EAAE,+BAA+B,GAC7C,OAAO,CAAC,2BAA2B,CAAC;IAsCjC,cAAc,CAClB,KAAK,EAAE,wBAAwB,EAC/B,aAAa,EAAE,+BAA+B,GAC7C,OAAO,CAAC,2BAA2B,CAAC;IAcjC,YAAY,CAChB,KAAK,EAAE,wBAAwB,EAC/B,aAAa,EAAE,+BAA+B,GAC7C,OAAO,CAAC,2BAA2B,CAAC;IASjC,YAAY,CAChB,KAAK,EAAE,uBAAuB,EAC9B,aAAa,EAAE,+BAA+B,GAC7C,OAAO,CAAC,0BAA0B,CAAC;IAyBhC,WAAW,CACf,KAAK,EAAE,uBAAuB,EAC9B,aAAa,EAAE,+BAA+B,GAC7C,OAAO,CAAC,0BAA0B,CAAC;IAahC,aAAa,CACjB,KAAK,EAAE,wBAAwB,EAC/B,aAAa,EAAE,+BAA+B,GAC7C,OAAO,CAAC,2BAA2B,CAAC;YAezB,iBAAiB;YAsDjB,0BAA0B;YAuD1B,yBAAyB;IAsDvC,OAAO,CAAC,qBAAqB;YAiBf,WAAW;YA+CX,eAAe;IAqC7B,OAAO,CAAC,SAAS;IAwEjB,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,UAAU;IAyBlB,OAAO,CAAC,4BAA4B;IAIpC,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,eAAe;IAcvB,OAAO,CAAC,kBAAkB;IAK1B,OAAO,CAAC,YAAY;IAYpB,OAAO,CAAC,eAAe;IAkBvB,OAAO,CAAC,kBAAkB;CAU3B"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,+BAA+B,EAAE,MAAM,8BAA8B,CAAC;AACpF,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import { PaymentsController, OrdersController, Client, Environment, CheckoutPaymentIntent, OrderStatus } from '@cabloy/paypal-server-sdk';
|
|
1
|
+
import { PaymentsController, OrdersController, Client, Environment, CheckoutPaymentIntent, OrderStatus, ApiError } from '@cabloy/paypal-server-sdk';
|
|
2
2
|
import { useApp, BeanInfo, BeanBase, BeanScopeBase } from 'vona';
|
|
3
3
|
import { __decorate } from 'tslib';
|
|
4
4
|
import { PayProvider } from 'vona-module-a-pay';
|
|
5
5
|
import { z } from 'zod';
|
|
6
6
|
import { Scope } from 'vona-module-a-bean';
|
|
7
7
|
|
|
8
|
+
const PaypalRequestTimeoutMilliseconds = 15_000;
|
|
8
9
|
class PaypalGatewayError extends Error {
|
|
9
10
|
constructor(status, message) {
|
|
10
11
|
super(message);
|
|
@@ -26,6 +27,9 @@ function createPaypalGateway(fetcher) {
|
|
|
26
27
|
async refundCapturedPayment(options, input) {
|
|
27
28
|
return (await new PaymentsController(createClient(options)).refundCapturedPayment(input)).result;
|
|
28
29
|
},
|
|
30
|
+
async getCapturedPayment(options, input) {
|
|
31
|
+
return (await new PaymentsController(createClient(options)).getCapturedPayment(input)).result;
|
|
32
|
+
},
|
|
29
33
|
async getRefund(options, input) {
|
|
30
34
|
return (await new PaymentsController(createClient(options)).getRefund(input)).result;
|
|
31
35
|
},
|
|
@@ -82,7 +86,7 @@ function createClient(options) {
|
|
|
82
86
|
oAuthClientId: options.clientId,
|
|
83
87
|
oAuthClientSecret: options.clientSecret
|
|
84
88
|
},
|
|
85
|
-
timeout:
|
|
89
|
+
timeout: PaypalRequestTimeoutMilliseconds,
|
|
86
90
|
environment: options.environment === 'live' ? Environment.Production : Environment.Sandbox
|
|
87
91
|
});
|
|
88
92
|
}
|
|
@@ -107,7 +111,7 @@ let PayProviderPaypal = class PayProviderPaypal extends BeanBase {
|
|
|
107
111
|
async startPayment(input, clientOptions) {
|
|
108
112
|
if (input.providerOrderId) return await this.queryPayment(input, clientOptions);
|
|
109
113
|
if (!input.returnUrl || !input.cancelUrl) {
|
|
110
|
-
this.app.throw(
|
|
114
|
+
this.app.throw(500, 'PayPal payment requires return and cancel URLs');
|
|
111
115
|
}
|
|
112
116
|
this._assertReady(clientOptions);
|
|
113
117
|
const order = await this._gateway(clientOptions).createOrder(this._gatewayOptions(clientOptions), {
|
|
@@ -119,8 +123,8 @@ let PayProviderPaypal = class PayProviderPaypal extends BeanBase {
|
|
|
119
123
|
cancelUrl: input.cancelUrl
|
|
120
124
|
},
|
|
121
125
|
purchaseUnits: [{
|
|
122
|
-
customId:
|
|
123
|
-
invoiceId: input.
|
|
126
|
+
customId: input.providerCorrelationReference,
|
|
127
|
+
invoiceId: input.providerInvoiceReference,
|
|
124
128
|
amount: {
|
|
125
129
|
currencyCode: input.currency,
|
|
126
130
|
value: formatMinorAmount(input.amountMinor, input.currency)
|
|
@@ -129,7 +133,7 @@ let PayProviderPaypal = class PayProviderPaypal extends BeanBase {
|
|
|
129
133
|
}
|
|
130
134
|
});
|
|
131
135
|
const orderRecord = asRecord(order);
|
|
132
|
-
const approvalUrl =
|
|
136
|
+
const approvalUrl = this._approvalUrl(orderRecord);
|
|
133
137
|
const orderId = readString(orderRecord.id);
|
|
134
138
|
if (!orderId || !approvalUrl) this.app.throw(502, 'PayPal did not return an approval order');
|
|
135
139
|
return {
|
|
@@ -147,7 +151,8 @@ let PayProviderPaypal = class PayProviderPaypal extends BeanBase {
|
|
|
147
151
|
if (!input.providerOrderId) this.app.throw(409, 'PayPal payment has no provider order');
|
|
148
152
|
const order = await this._gateway(clientOptions).captureOrder(this._gatewayOptions(clientOptions), {
|
|
149
153
|
id: input.providerOrderId,
|
|
150
|
-
paypalRequestId: input.idempotencyKey
|
|
154
|
+
paypalRequestId: input.idempotencyKey,
|
|
155
|
+
prefer: 'return=representation'
|
|
151
156
|
});
|
|
152
157
|
return this._mapOrder(order, input, clientOptions);
|
|
153
158
|
}
|
|
@@ -161,19 +166,26 @@ let PayProviderPaypal = class PayProviderPaypal extends BeanBase {
|
|
|
161
166
|
}
|
|
162
167
|
async createRefund(input, clientOptions) {
|
|
163
168
|
this._assertReady(clientOptions);
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
169
|
+
try {
|
|
170
|
+
const refund = await this._gateway(clientOptions).refundCapturedPayment(this._gatewayOptions(clientOptions), {
|
|
171
|
+
captureId: input.providerCaptureId,
|
|
172
|
+
paypalRequestId: input.idempotencyKey,
|
|
173
|
+
body: {
|
|
174
|
+
amount: {
|
|
175
|
+
currencyCode: input.currency,
|
|
176
|
+
value: formatMinorAmount(input.amountMinor, input.currency)
|
|
177
|
+
},
|
|
178
|
+
customId: input.providerCorrelationReference,
|
|
179
|
+
invoiceId: input.providerInvoiceReference
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
return this._mapRefund(refund, input, clientOptions);
|
|
183
|
+
} catch (error) {
|
|
184
|
+
if (this._isDefinitiveRefundRejection(error)) return {
|
|
185
|
+
state: 'failed'
|
|
186
|
+
};
|
|
187
|
+
throw error;
|
|
188
|
+
}
|
|
177
189
|
}
|
|
178
190
|
async queryRefund(input, clientOptions) {
|
|
179
191
|
this._assertReady(clientOptions);
|
|
@@ -194,42 +206,140 @@ let PayProviderPaypal = class PayProviderPaypal extends BeanBase {
|
|
|
194
206
|
}
|
|
195
207
|
return await this._mapWebhook(webhook.data, clientOptions);
|
|
196
208
|
}
|
|
209
|
+
async _mapRefundWebhook(event, resource, resourceId, clientOptions) {
|
|
210
|
+
const captureId = readNestedString(resource, ['supplementary_data', 'related_ids', 'capture_id']);
|
|
211
|
+
if (!captureId) this.app.throw(400, 'PayPal refund webhook has no capture identifier');
|
|
212
|
+
const refundByProviderId = await this.$scope.pay.model.refundOperation.get({
|
|
213
|
+
providerRefundId: resourceId
|
|
214
|
+
});
|
|
215
|
+
const customId = readString(readField(resource, 'customId', 'custom_id'));
|
|
216
|
+
const refund = refundByProviderId ?? (customId ? await this.$scope.pay.model.refundOperation.get({
|
|
217
|
+
providerCorrelationReference: customId
|
|
218
|
+
}) : undefined);
|
|
219
|
+
if (!refund) this.app.throw(400, 'PayPal refund webhook is not correlated');
|
|
220
|
+
const session = await this.$scope.pay.model.paymentSession.getById(refund.paymentSessionId);
|
|
221
|
+
if (!session || session.providerCaptureId !== captureId) {
|
|
222
|
+
this.app.throw(409, 'PayPal refund webhook capture conflicts');
|
|
223
|
+
}
|
|
224
|
+
const snapshot = this._mapRefund(resource, {
|
|
225
|
+
paymentSessionId: session.id,
|
|
226
|
+
refundOperationId: refund.id,
|
|
227
|
+
businessReference: refund.businessReference,
|
|
228
|
+
providerInvoiceReference: refund.providerInvoiceReference,
|
|
229
|
+
providerCorrelationReference: refund.providerCorrelationReference,
|
|
230
|
+
idempotencyKey: '',
|
|
231
|
+
amountMinor: refund.amountMinor,
|
|
232
|
+
currency: refund.currency,
|
|
233
|
+
providerCaptureId: captureId,
|
|
234
|
+
providerRefundId: resourceId
|
|
235
|
+
}, clientOptions);
|
|
236
|
+
return {
|
|
237
|
+
eventId: event.id,
|
|
238
|
+
eventType: event.event_type,
|
|
239
|
+
refundOperationId: refund.id,
|
|
240
|
+
refund: snapshot,
|
|
241
|
+
summary: {
|
|
242
|
+
amountMinor: refund.amountMinor,
|
|
243
|
+
currency: refund.currency
|
|
244
|
+
}
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
async _mapCaptureRefundedWebhook(event, resource, resourceId, clientOptions) {
|
|
248
|
+
const relatedCaptureId = readNestedString(resource, ['supplementary_data', 'related_ids', 'capture_id']);
|
|
249
|
+
const relatedRefundId = readNestedString(resource, ['supplementary_data', 'related_ids', 'refund_id']);
|
|
250
|
+
if (relatedRefundId) {
|
|
251
|
+
return await this._mapCaptureRefundedRefund(event, await this._gateway(clientOptions).getRefund(this._gatewayOptions(clientOptions), {
|
|
252
|
+
refundId: relatedRefundId
|
|
253
|
+
}), relatedRefundId, relatedCaptureId, clientOptions);
|
|
254
|
+
}
|
|
255
|
+
try {
|
|
256
|
+
const capture = asRecord(await this._gateway(clientOptions).getCapturedPayment(this._gatewayOptions(clientOptions), {
|
|
257
|
+
captureId: resourceId
|
|
258
|
+
}));
|
|
259
|
+
const captureId = readString(capture.id);
|
|
260
|
+
if (!captureId || captureId !== resourceId) {
|
|
261
|
+
this.app.throw(409, 'PayPal capture refund webhook capture conflicts');
|
|
262
|
+
}
|
|
263
|
+
if (relatedCaptureId && relatedCaptureId !== captureId) {
|
|
264
|
+
this.app.throw(409, 'PayPal capture refund webhook capture conflicts');
|
|
265
|
+
}
|
|
266
|
+
return this._ignoredCaptureRefund(event, resource, captureId);
|
|
267
|
+
} catch (error) {
|
|
268
|
+
if (!this._isPaypalNotFound(error)) throw error;
|
|
269
|
+
}
|
|
270
|
+
return await this._mapCaptureRefundedRefund(event, await this._gateway(clientOptions).getRefund(this._gatewayOptions(clientOptions), {
|
|
271
|
+
refundId: resourceId
|
|
272
|
+
}), resourceId, relatedCaptureId, clientOptions);
|
|
273
|
+
}
|
|
274
|
+
async _mapCaptureRefundedRefund(event, refundResource, refundId, relatedCaptureId, clientOptions) {
|
|
275
|
+
const refundRecord = asRecord(refundResource);
|
|
276
|
+
if (readString(refundRecord.id) !== refundId) {
|
|
277
|
+
this.app.throw(409, 'PayPal capture refund webhook refund conflicts');
|
|
278
|
+
}
|
|
279
|
+
const customId = readString(readField(refundRecord, 'customId', 'custom_id'));
|
|
280
|
+
const invoiceId = readString(readField(refundRecord, 'invoiceId', 'invoice_id'));
|
|
281
|
+
if (!customId || !invoiceId) {
|
|
282
|
+
this.app.throw(400, 'PayPal capture refund webhook is not correlated');
|
|
283
|
+
}
|
|
284
|
+
const refund = await this.$scope.pay.model.refundOperation.get({
|
|
285
|
+
providerCorrelationReference: customId
|
|
286
|
+
});
|
|
287
|
+
if (!refund || refund.providerInvoiceReference !== invoiceId) {
|
|
288
|
+
this.app.throw(400, 'PayPal capture refund webhook is not correlated');
|
|
289
|
+
}
|
|
290
|
+
const session = await this.$scope.pay.model.paymentSession.getById(refund.paymentSessionId);
|
|
291
|
+
if (!session?.providerCaptureId) {
|
|
292
|
+
this.app.throw(409, 'PayPal capture refund webhook payment session conflicts');
|
|
293
|
+
}
|
|
294
|
+
if (relatedCaptureId && session.providerCaptureId !== relatedCaptureId) {
|
|
295
|
+
this.app.throw(409, 'PayPal capture refund webhook capture conflicts');
|
|
296
|
+
}
|
|
297
|
+
const snapshot = this._mapRefund(refundRecord, {
|
|
298
|
+
paymentSessionId: session.id,
|
|
299
|
+
refundOperationId: refund.id,
|
|
300
|
+
businessReference: refund.businessReference,
|
|
301
|
+
providerInvoiceReference: refund.providerInvoiceReference,
|
|
302
|
+
providerCorrelationReference: refund.providerCorrelationReference,
|
|
303
|
+
idempotencyKey: '',
|
|
304
|
+
amountMinor: refund.amountMinor,
|
|
305
|
+
currency: refund.currency,
|
|
306
|
+
providerCaptureId: session.providerCaptureId,
|
|
307
|
+
providerRefundId: refundId
|
|
308
|
+
}, clientOptions);
|
|
309
|
+
return {
|
|
310
|
+
eventId: event.id,
|
|
311
|
+
eventType: event.event_type,
|
|
312
|
+
refundOperationId: refund.id,
|
|
313
|
+
refund: snapshot,
|
|
314
|
+
summary: {
|
|
315
|
+
amountMinor: refund.amountMinor,
|
|
316
|
+
currency: refund.currency
|
|
317
|
+
}
|
|
318
|
+
};
|
|
319
|
+
}
|
|
320
|
+
_ignoredCaptureRefund(event, resource, captureId) {
|
|
321
|
+
return {
|
|
322
|
+
eventId: event.id,
|
|
323
|
+
eventType: event.event_type,
|
|
324
|
+
providerCaptureId: captureId,
|
|
325
|
+
ignored: true,
|
|
326
|
+
summary: {
|
|
327
|
+
amountMinor: parsePaypalAmount(resource.amount),
|
|
328
|
+
currency: parsePaypalCurrency(resource.amount)
|
|
329
|
+
}
|
|
330
|
+
};
|
|
331
|
+
}
|
|
197
332
|
async _mapWebhook(event, clientOptions) {
|
|
198
333
|
const resource = event.resource;
|
|
199
334
|
const amount = parsePaypalAmount(resource.amount);
|
|
200
335
|
const currency = parsePaypalCurrency(resource.amount);
|
|
201
336
|
const resourceId = readString(resource.id);
|
|
202
|
-
if (!resourceId ||
|
|
203
|
-
if (
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
if (!refund) this.app.throw(404, 'PayPal refund operation not found');
|
|
209
|
-
const session = await this.$scope.pay.model.paymentSession.getById(refund.paymentSessionId);
|
|
210
|
-
if (!session || session.providerCaptureId !== captureId) {
|
|
211
|
-
this.app.throw(409, 'PayPal refund webhook capture conflicts');
|
|
212
|
-
}
|
|
213
|
-
const snapshot = this._mapRefund(resource, {
|
|
214
|
-
paymentSessionId: session.id,
|
|
215
|
-
refundOperationId: refund.id,
|
|
216
|
-
businessReference: refund.businessReference,
|
|
217
|
-
idempotencyKey: '',
|
|
218
|
-
amountMinor: refund.amountMinor,
|
|
219
|
-
currency: refund.currency,
|
|
220
|
-
providerCaptureId: captureId,
|
|
221
|
-
providerRefundId: resourceId
|
|
222
|
-
}, clientOptions);
|
|
223
|
-
return {
|
|
224
|
-
eventId: event.id,
|
|
225
|
-
eventType: event.event_type,
|
|
226
|
-
refundOperationId: refund.id,
|
|
227
|
-
refund: snapshot,
|
|
228
|
-
summary: {
|
|
229
|
-
amountMinor: amount,
|
|
230
|
-
currency
|
|
231
|
-
}
|
|
232
|
-
};
|
|
337
|
+
if (!resourceId || amount === undefined || !currency) this.app.throw(400, 'PayPal webhook has invalid resource');
|
|
338
|
+
if (event.event_type.startsWith('PAYMENT.REFUND.')) {
|
|
339
|
+
return await this._mapRefundWebhook(event, resource, resourceId, clientOptions);
|
|
340
|
+
}
|
|
341
|
+
if (event.event_type === 'PAYMENT.CAPTURE.REFUNDED') {
|
|
342
|
+
return await this._mapCaptureRefundedWebhook(event, resource, resourceId, clientOptions);
|
|
233
343
|
}
|
|
234
344
|
if (event.event_type.startsWith('PAYMENT.CAPTURE.')) {
|
|
235
345
|
const orderId = readNestedString(resource, ['supplementaryData', 'relatedIds', 'orderId']);
|
|
@@ -237,7 +347,7 @@ let PayProviderPaypal = class PayProviderPaypal extends BeanBase {
|
|
|
237
347
|
const order = await this._gateway(clientOptions).getOrder(this._gatewayOptions(clientOptions), {
|
|
238
348
|
id: orderId
|
|
239
349
|
});
|
|
240
|
-
const input = this._inputFromOrder(order, orderId);
|
|
350
|
+
const input = await this._inputFromOrder(order, orderId);
|
|
241
351
|
const payment = this._mapOrder(order, input, clientOptions);
|
|
242
352
|
if (!['succeeded', 'failed', 'cancelled'].includes(payment.state)) {
|
|
243
353
|
this.app.throw(400, 'PayPal capture webhook is not terminal');
|
|
@@ -258,20 +368,28 @@ let PayProviderPaypal = class PayProviderPaypal extends BeanBase {
|
|
|
258
368
|
}
|
|
259
369
|
this.app.throw(400, 'PayPal webhook event type is unsupported');
|
|
260
370
|
}
|
|
261
|
-
_inputFromOrder(order, providerOrderId) {
|
|
371
|
+
async _inputFromOrder(order, providerOrderId) {
|
|
262
372
|
const orderRecord = asRecord(order);
|
|
263
373
|
const unit = asArray(readField(orderRecord, 'purchaseUnits', 'purchase_units'))[0];
|
|
264
374
|
const unitRecord = asRecord(unit);
|
|
265
|
-
const
|
|
266
|
-
const
|
|
375
|
+
const providerCorrelationReference = readString(readField(unitRecord, 'customId', 'custom_id'));
|
|
376
|
+
const providerInvoiceReference = readString(readField(unitRecord, 'invoiceId', 'invoice_id'));
|
|
267
377
|
const amountMinor = parsePaypalAmount(readField(unitRecord, 'amount'));
|
|
268
378
|
const currency = parsePaypalCurrency(readField(unitRecord, 'amount'));
|
|
269
|
-
if (!
|
|
379
|
+
if (!providerCorrelationReference || !providerInvoiceReference || amountMinor === undefined || !currency) {
|
|
380
|
+
this.app.throw(400, 'PayPal order is not correlated');
|
|
381
|
+
}
|
|
382
|
+
const session = await this.$scope.pay.model.paymentSession.get({
|
|
383
|
+
providerCorrelationReference
|
|
384
|
+
});
|
|
385
|
+
if (!session || session.providerInvoiceReference !== providerInvoiceReference) {
|
|
270
386
|
this.app.throw(400, 'PayPal order is not correlated');
|
|
271
387
|
}
|
|
272
388
|
return {
|
|
273
|
-
paymentSessionId:
|
|
274
|
-
businessReference,
|
|
389
|
+
paymentSessionId: session.id,
|
|
390
|
+
businessReference: session.businessReference,
|
|
391
|
+
providerInvoiceReference: session.providerInvoiceReference,
|
|
392
|
+
providerCorrelationReference: session.providerCorrelationReference,
|
|
275
393
|
idempotencyKey: '',
|
|
276
394
|
amountMinor,
|
|
277
395
|
currency,
|
|
@@ -287,10 +405,10 @@ let PayProviderPaypal = class PayProviderPaypal extends BeanBase {
|
|
|
287
405
|
const units = asArray(readField(orderRecord, 'purchaseUnits', 'purchase_units'));
|
|
288
406
|
if (units.length !== 1) this.app.throw(409, 'PayPal order has an invalid purchase-unit count');
|
|
289
407
|
const unit = asRecord(units[0]);
|
|
290
|
-
if (readString(readField(unit, 'customId', 'custom_id')) !==
|
|
408
|
+
if (readString(readField(unit, 'customId', 'custom_id')) !== input.providerCorrelationReference || readString(readField(unit, 'invoiceId', 'invoice_id')) !== input.providerInvoiceReference || parsePaypalAmount(readField(unit, 'amount')) !== input.amountMinor || parsePaypalCurrency(readField(unit, 'amount')) !== input.currency) {
|
|
291
409
|
this.app.throw(409, 'PayPal order facts conflict with the payment session');
|
|
292
410
|
}
|
|
293
|
-
this._assertMerchant(unit, clientOptions);
|
|
411
|
+
this._assertMerchant(unit, clientOptions, 'order');
|
|
294
412
|
const captures = asArray(readField(asRecord(readField(unit, 'payments')), 'captures'));
|
|
295
413
|
if (captures.length > 1) this.app.throw(409, 'PayPal order has multiple captures');
|
|
296
414
|
const capture = asRecord(captures[0]);
|
|
@@ -335,22 +453,40 @@ let PayProviderPaypal = class PayProviderPaypal extends BeanBase {
|
|
|
335
453
|
providerOrderId: orderId
|
|
336
454
|
};
|
|
337
455
|
}
|
|
456
|
+
const approvalUrl = this._approvalUrl(orderRecord);
|
|
338
457
|
return {
|
|
339
458
|
state: 'requires_action',
|
|
340
459
|
providerPaymentId: orderId,
|
|
341
|
-
providerOrderId: orderId
|
|
460
|
+
providerOrderId: orderId,
|
|
461
|
+
...(approvalUrl && {
|
|
462
|
+
nextAction: {
|
|
463
|
+
kind: 'redirect',
|
|
464
|
+
url: approvalUrl
|
|
465
|
+
}
|
|
466
|
+
})
|
|
342
467
|
};
|
|
343
468
|
}
|
|
344
|
-
|
|
469
|
+
_approvalUrl(order) {
|
|
470
|
+
return readString(asArray(order.links).map(asRecord).find(item => item.rel === 'approve')?.href);
|
|
471
|
+
}
|
|
472
|
+
_mapRefund(refund, input, clientOptions, requireCorrelationMetadata = true) {
|
|
345
473
|
const record = asRecord(refund);
|
|
346
474
|
const providerRefundId = readString(record.id);
|
|
347
475
|
if (!providerRefundId) this.app.throw(502, 'PayPal refund returned no identifier');
|
|
348
|
-
|
|
476
|
+
const customId = readString(readField(record, 'customId', 'custom_id'));
|
|
477
|
+
const invoiceId = readString(readField(record, 'invoiceId', 'invoice_id'));
|
|
478
|
+
if (input.providerRefundId && input.providerRefundId !== providerRefundId || customId && customId !== input.providerCorrelationReference || invoiceId && invoiceId !== input.providerInvoiceReference || requireCorrelationMetadata && (!customId || !invoiceId) || parsePaypalAmount(record.amount) !== input.amountMinor || parsePaypalCurrency(record.amount) !== input.currency) {
|
|
349
479
|
this.app.throw(409, 'PayPal refund facts conflict with the refund operation');
|
|
350
480
|
}
|
|
351
|
-
this._assertMerchant(record, clientOptions);
|
|
481
|
+
this._assertMerchant(record, clientOptions, 'refund');
|
|
352
482
|
return mapRefund(readString(record.status), providerRefundId);
|
|
353
483
|
}
|
|
484
|
+
_isDefinitiveRefundRejection(error) {
|
|
485
|
+
return error instanceof ApiError && error.statusCode === 422;
|
|
486
|
+
}
|
|
487
|
+
_isPaypalNotFound(error) {
|
|
488
|
+
return error instanceof ApiError && error.statusCode === 404;
|
|
489
|
+
}
|
|
354
490
|
_gateway(clientOptions) {
|
|
355
491
|
return clientOptions.gateway ?? createPaypalGateway(this.bean.core.fetch);
|
|
356
492
|
}
|
|
@@ -383,12 +519,24 @@ let PayProviderPaypal = class PayProviderPaypal extends BeanBase {
|
|
|
383
519
|
this.app.throw(503, 'PayPal is not fully configured');
|
|
384
520
|
}
|
|
385
521
|
}
|
|
386
|
-
_assertMerchant(value, clientOptions) {
|
|
387
|
-
const
|
|
388
|
-
if (!
|
|
522
|
+
_assertMerchant(value, clientOptions, resourceType) {
|
|
523
|
+
const merchant = this._merchantReference(value, resourceType);
|
|
524
|
+
if (!merchant.observedMerchantReference || merchant.observedMerchantReference !== clientOptions.merchantReference) {
|
|
525
|
+
this.$logger.warn({
|
|
526
|
+
event: 'paypal.merchant_reference_conflict',
|
|
527
|
+
observedMerchantSource: merchant.observedMerchantSource
|
|
528
|
+
});
|
|
389
529
|
this.app.throw(409, 'PayPal merchant reference conflicts');
|
|
390
530
|
}
|
|
391
531
|
}
|
|
532
|
+
_merchantReference(value, resourceType) {
|
|
533
|
+
const field = resourceType === 'order' ? 'payee' : 'payer';
|
|
534
|
+
const merchantReference = readNestedString(value, [field, 'merchantId']) ?? readNestedString(value, [field, 'merchant_id']);
|
|
535
|
+
return {
|
|
536
|
+
observedMerchantReference: merchantReference,
|
|
537
|
+
observedMerchantSource: merchantReference ? `${field}.merchant_id` : 'missing'
|
|
538
|
+
};
|
|
539
|
+
}
|
|
392
540
|
};
|
|
393
541
|
PayProviderPaypal = __decorate([PayProvider({
|
|
394
542
|
base: {
|
|
@@ -480,9 +628,6 @@ function parsePaypalCurrency(value) {
|
|
|
480
628
|
const currency = readString(readField(amount, 'currencyCode', 'currency_code'));
|
|
481
629
|
return currency === 'USD' ? currency : undefined;
|
|
482
630
|
}
|
|
483
|
-
function isRefundEvent(eventType) {
|
|
484
|
-
return eventType === 'PAYMENT.CAPTURE.REFUNDED' || eventType.startsWith('PAYMENT.REFUND.');
|
|
485
|
-
}
|
|
486
631
|
|
|
487
632
|
let ScopeModulePayPaypal = class ScopeModulePayPaypal extends BeanScopeBase {};
|
|
488
633
|
ScopeModulePayPaypal = __decorate([Scope(), BeanInfo({
|
|
@@ -490,5 +635,5 @@ ScopeModulePayPaypal = __decorate([Scope(), BeanInfo({
|
|
|
490
635
|
})], ScopeModulePayPaypal);
|
|
491
636
|
/** scope: end */
|
|
492
637
|
|
|
493
|
-
export { PayProviderPaypal, PaypalGatewayError, ScopeModulePayPaypal, createPaypalGateway };
|
|
638
|
+
export { PayProviderPaypal, PaypalGatewayError, PaypalRequestTimeoutMilliseconds, ScopeModulePayPaypal, createPaypalGateway };
|
|
494
639
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/lib/paypalGateway.ts","../src/bean/payProvider.paypal.ts","../src/.metadata/index.ts"],"sourcesContent":[null,null,null],"names":["PaypalGatewayError","Error","constructor","status","message","createPaypalGateway","fetcher","createOrder","options","input","OrdersController","createClient","result","captureOrder","getOrder","refundCapturedPayment","PaymentsController","getRefund","verifyWebhookSignature","transmissionId","getHeader","headers","transmissionTime","certUrl","authAlgo","transmissionSig","apiBaseUrl","environment","tokenResponse","method","Buffer","from","clientId","clientSecret","toString","body","token","asRecord","ok","json","undefined","accessToken","readString","access_token","response","JSON","stringify","auth_algo","cert_url","transmission_id","transmission_sig","transmission_time","webhook_id","webhookId","webhook_event","verification_status","Client","clientCredentialsAuthCredentials","oAuthClientId","oAuthClientSecret","timeout","Environment","Production","Sandbox","value","key","Array","isArray","app","useApp","PaypalWebhookSchema","z","object","id","string","min","max","event_type","resource","record","unknown","PayProviderPaypal","BeanBase","startPayment","clientOptions","providerOrderId","queryPayment","returnUrl","cancelUrl","throw","_assertReady","order","_gateway","_gatewayOptions","paypalRequestId","idempotencyKey","intent","CheckoutPaymentIntent","Capture","applicationContext","purchaseUnits","customId","String","paymentSessionId","invoiceId","businessReference","amount","currencyCode","currency","formatMinorAmount","amountMinor","orderRecord","approvalUrl","asArray","links","map","find","item","rel","href","orderId","state","providerPaymentId","nextAction","kind","url","confirmPayment","_mapOrder","createRefund","refund","captureId","providerCaptureId","refundOperationId","_mapRefund","queryRefund","providerRefundId","refundId","verifyWebhook","webhook","safeParse","success","error","_throwGatewayError","_mapWebhook","data","event","parsePaypalAmount","parsePaypalCurrency","resourceId","isRefundEvent","readField","readNestedString","$scope","pay","model","refundOperation","getById","session","paymentSession","snapshot","eventId","eventType","summary","startsWith","_inputFromOrder","payment","includes","unit","unitRecord","units","length","_assertMerchant","captures","capture","captureStatus","OrderStatus","Voided","mapRefund","gateway","bean","core","fetch","secretCredential","merchantReference","merchantId","__decorate","PayProvider","base","capabilities","redirectCheckout","embeddedCheckout","automaticCapture","manualCapture","refunds","partialRefunds","webhooks","clients","default","meta","env","PAYPAL_ENVIRONMENT","PAYPAL_CLIENT_ID","PAYPAL_CLIENT_SECRET","PAYPAL_WEBHOOK_ID","PAYPAL_MERCHANT_REFERENCE","__z_BeanInfo","module","Number","isSafeInteger","Math","floor","padStart","keys","path","current","camelToSnake","replace","character","toLowerCase","decimal","test","whole","fractional","split","ScopeModulePayPaypal","BeanScopeBase","Scope"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/lib/paypalGateway.ts","../src/bean/payProvider.paypal.ts","../src/.metadata/index.ts"],"sourcesContent":[null,null,null],"names":["PaypalRequestTimeoutMilliseconds","PaypalGatewayError","Error","constructor","status","message","createPaypalGateway","fetcher","createOrder","options","input","OrdersController","createClient","result","captureOrder","getOrder","refundCapturedPayment","PaymentsController","getCapturedPayment","getRefund","verifyWebhookSignature","transmissionId","getHeader","headers","transmissionTime","certUrl","authAlgo","transmissionSig","apiBaseUrl","environment","tokenResponse","method","Buffer","from","clientId","clientSecret","toString","body","token","asRecord","ok","json","undefined","accessToken","readString","access_token","response","JSON","stringify","auth_algo","cert_url","transmission_id","transmission_sig","transmission_time","webhook_id","webhookId","webhook_event","verification_status","Client","clientCredentialsAuthCredentials","oAuthClientId","oAuthClientSecret","timeout","Environment","Production","Sandbox","value","key","Array","isArray","app","useApp","PaypalWebhookSchema","z","object","id","string","min","max","event_type","resource","record","unknown","PayProviderPaypal","BeanBase","startPayment","clientOptions","providerOrderId","queryPayment","returnUrl","cancelUrl","throw","_assertReady","order","_gateway","_gatewayOptions","paypalRequestId","idempotencyKey","intent","CheckoutPaymentIntent","Capture","applicationContext","purchaseUnits","customId","providerCorrelationReference","invoiceId","providerInvoiceReference","amount","currencyCode","currency","formatMinorAmount","amountMinor","orderRecord","approvalUrl","_approvalUrl","orderId","state","providerPaymentId","nextAction","kind","url","confirmPayment","prefer","_mapOrder","createRefund","refund","captureId","providerCaptureId","_mapRefund","error","_isDefinitiveRefundRejection","queryRefund","providerRefundId","refundId","verifyWebhook","webhook","safeParse","success","_throwGatewayError","_mapWebhook","data","_mapRefundWebhook","event","resourceId","readNestedString","refundByProviderId","$scope","pay","model","refundOperation","get","readField","session","paymentSession","getById","paymentSessionId","snapshot","refundOperationId","businessReference","eventId","eventType","summary","_mapCaptureRefundedWebhook","relatedCaptureId","relatedRefundId","_mapCaptureRefundedRefund","capture","_ignoredCaptureRefund","_isPaypalNotFound","refundResource","refundRecord","ignored","parsePaypalAmount","parsePaypalCurrency","startsWith","_inputFromOrder","payment","includes","unit","asArray","unitRecord","units","length","_assertMerchant","captures","captureStatus","OrderStatus","Voided","links","map","find","item","rel","href","requireCorrelationMetadata","mapRefund","ApiError","statusCode","gateway","bean","core","fetch","secretCredential","merchantReference","resourceType","merchant","_merchantReference","observedMerchantReference","$logger","warn","observedMerchantSource","field","__decorate","PayProvider","base","capabilities","redirectCheckout","embeddedCheckout","automaticCapture","manualCapture","refunds","partialRefunds","webhooks","clients","default","meta","env","PAYPAL_ENVIRONMENT","PAYPAL_CLIENT_ID","PAYPAL_CLIENT_SECRET","PAYPAL_WEBHOOK_ID","PAYPAL_MERCHANT_REFERENCE","__z_BeanInfo","module","Number","isSafeInteger","Math","floor","String","padStart","keys","path","current","camelToSnake","replace","character","toLowerCase","decimal","test","whole","fractional","split","ScopeModulePayPaypal","BeanScopeBase","Scope"],"mappings":"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"}
|
|
@@ -4,11 +4,13 @@ export interface IPaypalGatewayOptions {
|
|
|
4
4
|
clientSecret: string;
|
|
5
5
|
webhookId: string;
|
|
6
6
|
}
|
|
7
|
+
export declare const PaypalRequestTimeoutMilliseconds = 15000;
|
|
7
8
|
export interface IPaypalGateway {
|
|
8
9
|
createOrder(options: IPaypalGatewayOptions, input: unknown): Promise<unknown>;
|
|
9
10
|
captureOrder(options: IPaypalGatewayOptions, input: unknown): Promise<unknown>;
|
|
10
11
|
getOrder(options: IPaypalGatewayOptions, input: unknown): Promise<unknown>;
|
|
11
12
|
refundCapturedPayment(options: IPaypalGatewayOptions, input: unknown): Promise<unknown>;
|
|
13
|
+
getCapturedPayment(options: IPaypalGatewayOptions, input: unknown): Promise<unknown>;
|
|
12
14
|
getRefund(options: IPaypalGatewayOptions, input: unknown): Promise<unknown>;
|
|
13
15
|
verifyWebhookSignature(options: IPaypalGatewayOptions, input: {
|
|
14
16
|
headers: Record<string, string | string[] | undefined>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paypalGateway.d.ts","sourceRoot":"","sources":["../../src/lib/paypalGateway.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,SAAS,GAAG,MAAM,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,CAAC,OAAO,EAAE,qBAAqB,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9E,YAAY,CAAC,OAAO,EAAE,qBAAqB,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/E,QAAQ,CAAC,OAAO,EAAE,qBAAqB,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3E,qBAAqB,CAAC,OAAO,EAAE,qBAAqB,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACxF,SAAS,CAAC,OAAO,EAAE,qBAAqB,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5E,sBAAsB,CACpB,OAAO,EAAE,qBAAqB,EAC9B,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,GAC/E,OAAO,CAAC,IAAI,CAAC,CAAC;CAClB;AAED,qBAAa,kBAAmB,SAAQ,KAAK;IAEzC,QAAQ,CAAC,MAAM,EAAE,MAAM;gBAAd,MAAM,EAAE,MAAM,EACvB,OAAO,EAAE,MAAM;CAIlB;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,KAAK,GAAG,cAAc,
|
|
1
|
+
{"version":3,"file":"paypalGateway.d.ts","sourceRoot":"","sources":["../../src/lib/paypalGateway.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,SAAS,GAAG,MAAM,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,gCAAgC,QAAS,CAAC;AAEvD,MAAM,WAAW,cAAc;IAC7B,WAAW,CAAC,OAAO,EAAE,qBAAqB,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9E,YAAY,CAAC,OAAO,EAAE,qBAAqB,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/E,QAAQ,CAAC,OAAO,EAAE,qBAAqB,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3E,qBAAqB,CAAC,OAAO,EAAE,qBAAqB,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACxF,kBAAkB,CAAC,OAAO,EAAE,qBAAqB,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACrF,SAAS,CAAC,OAAO,EAAE,qBAAqB,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5E,sBAAsB,CACpB,OAAO,EAAE,qBAAqB,EAC9B,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,GAC/E,OAAO,CAAC,IAAI,CAAC,CAAC;CAClB;AAED,qBAAa,kBAAmB,SAAQ,KAAK;IAEzC,QAAQ,CAAC,MAAM,EAAE,MAAM;gBAAd,MAAM,EAAE,MAAM,EACvB,OAAO,EAAE,MAAM;CAIlB;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,KAAK,GAAG,cAAc,CA0EzE"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vona-module-pay-paypal",
|
|
3
|
-
"version": "5.0.
|
|
3
|
+
"version": "5.0.6",
|
|
4
4
|
"description": "",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"Vona Module"
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
},
|
|
32
32
|
"dependencies": {
|
|
33
33
|
"@cabloy/paypal-server-sdk": "2.2.0",
|
|
34
|
-
"vona-module-a-pay": "5.0.
|
|
34
|
+
"vona-module-a-pay": "5.0.6"
|
|
35
35
|
},
|
|
36
36
|
"title": "pay-paypal",
|
|
37
37
|
"vonaModule": {
|
|
@@ -40,5 +40,5 @@
|
|
|
40
40
|
"a-vona": "5.0.0"
|
|
41
41
|
}
|
|
42
42
|
},
|
|
43
|
-
"gitHead": "
|
|
43
|
+
"gitHead": "75a09e6a22891e958802ee649ed454db38f90c16"
|
|
44
44
|
}
|
|
@@ -11,7 +11,7 @@ import type {
|
|
|
11
11
|
IPayProviderWebhookInput,
|
|
12
12
|
} from 'vona-module-a-pay';
|
|
13
13
|
|
|
14
|
-
import { CheckoutPaymentIntent, OrderStatus } from '@cabloy/paypal-server-sdk';
|
|
14
|
+
import { ApiError, CheckoutPaymentIntent, OrderStatus } from '@cabloy/paypal-server-sdk';
|
|
15
15
|
import { BeanBase, useApp } from 'vona';
|
|
16
16
|
import { PayProvider } from 'vona-module-a-pay';
|
|
17
17
|
import { z } from 'zod';
|
|
@@ -74,7 +74,7 @@ export class PayProviderPaypal
|
|
|
74
74
|
): Promise<IPayProviderPaymentSnapshot> {
|
|
75
75
|
if (input.providerOrderId) return await this.queryPayment(input, clientOptions);
|
|
76
76
|
if (!input.returnUrl || !input.cancelUrl) {
|
|
77
|
-
this.app.throw(
|
|
77
|
+
this.app.throw(500, 'PayPal payment requires return and cancel URLs');
|
|
78
78
|
}
|
|
79
79
|
this._assertReady(clientOptions);
|
|
80
80
|
const order = await this._gateway(clientOptions).createOrder(
|
|
@@ -86,8 +86,8 @@ export class PayProviderPaypal
|
|
|
86
86
|
applicationContext: { returnUrl: input.returnUrl, cancelUrl: input.cancelUrl },
|
|
87
87
|
purchaseUnits: [
|
|
88
88
|
{
|
|
89
|
-
customId:
|
|
90
|
-
invoiceId: input.
|
|
89
|
+
customId: input.providerCorrelationReference,
|
|
90
|
+
invoiceId: input.providerInvoiceReference,
|
|
91
91
|
amount: {
|
|
92
92
|
currencyCode: input.currency,
|
|
93
93
|
value: formatMinorAmount(input.amountMinor, input.currency),
|
|
@@ -98,11 +98,7 @@ export class PayProviderPaypal
|
|
|
98
98
|
},
|
|
99
99
|
);
|
|
100
100
|
const orderRecord = asRecord(order);
|
|
101
|
-
const approvalUrl =
|
|
102
|
-
asArray(orderRecord.links)
|
|
103
|
-
.map(asRecord)
|
|
104
|
-
.find(item => item.rel === 'approve')?.href,
|
|
105
|
-
);
|
|
101
|
+
const approvalUrl = this._approvalUrl(orderRecord);
|
|
106
102
|
const orderId = readString(orderRecord.id);
|
|
107
103
|
if (!orderId || !approvalUrl) this.app.throw(502, 'PayPal did not return an approval order');
|
|
108
104
|
return {
|
|
@@ -124,6 +120,7 @@ export class PayProviderPaypal
|
|
|
124
120
|
{
|
|
125
121
|
id: input.providerOrderId,
|
|
126
122
|
paypalRequestId: input.idempotencyKey,
|
|
123
|
+
prefer: 'return=representation',
|
|
127
124
|
},
|
|
128
125
|
);
|
|
129
126
|
return this._mapOrder(order, input, clientOptions);
|
|
@@ -146,22 +143,27 @@ export class PayProviderPaypal
|
|
|
146
143
|
clientOptions: IPayProviderPaypalClientOptions,
|
|
147
144
|
): Promise<IPayProviderRefundSnapshot> {
|
|
148
145
|
this._assertReady(clientOptions);
|
|
149
|
-
|
|
150
|
-
this.
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
146
|
+
try {
|
|
147
|
+
const refund = await this._gateway(clientOptions).refundCapturedPayment(
|
|
148
|
+
this._gatewayOptions(clientOptions),
|
|
149
|
+
{
|
|
150
|
+
captureId: input.providerCaptureId,
|
|
151
|
+
paypalRequestId: input.idempotencyKey,
|
|
152
|
+
body: {
|
|
153
|
+
amount: {
|
|
154
|
+
currencyCode: input.currency,
|
|
155
|
+
value: formatMinorAmount(input.amountMinor, input.currency),
|
|
156
|
+
},
|
|
157
|
+
customId: input.providerCorrelationReference,
|
|
158
|
+
invoiceId: input.providerInvoiceReference,
|
|
158
159
|
},
|
|
159
|
-
customId: String(input.refundOperationId),
|
|
160
|
-
invoiceId: input.businessReference,
|
|
161
160
|
},
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
161
|
+
);
|
|
162
|
+
return this._mapRefund(refund, input, clientOptions);
|
|
163
|
+
} catch (error) {
|
|
164
|
+
if (this._isDefinitiveRefundRejection(error)) return { state: 'failed' };
|
|
165
|
+
throw error;
|
|
166
|
+
}
|
|
165
167
|
}
|
|
166
168
|
|
|
167
169
|
async queryRefund(
|
|
@@ -198,6 +200,186 @@ export class PayProviderPaypal
|
|
|
198
200
|
return await this._mapWebhook(webhook.data, clientOptions);
|
|
199
201
|
}
|
|
200
202
|
|
|
203
|
+
private async _mapRefundWebhook(
|
|
204
|
+
event: z.infer<typeof PaypalWebhookSchema>,
|
|
205
|
+
resource: Record<string, unknown>,
|
|
206
|
+
resourceId: string,
|
|
207
|
+
clientOptions: IPayProviderPaypalClientOptions,
|
|
208
|
+
): Promise<IPayProviderVerifiedWebhook> {
|
|
209
|
+
const captureId = readNestedString(resource, [
|
|
210
|
+
'supplementary_data',
|
|
211
|
+
'related_ids',
|
|
212
|
+
'capture_id',
|
|
213
|
+
]);
|
|
214
|
+
if (!captureId) this.app.throw(400, 'PayPal refund webhook has no capture identifier');
|
|
215
|
+
|
|
216
|
+
const refundByProviderId = await this.$scope.pay.model.refundOperation.get({
|
|
217
|
+
providerRefundId: resourceId,
|
|
218
|
+
});
|
|
219
|
+
const customId = readString(readField(resource, 'customId', 'custom_id'));
|
|
220
|
+
const refund =
|
|
221
|
+
refundByProviderId ??
|
|
222
|
+
(customId
|
|
223
|
+
? await this.$scope.pay.model.refundOperation.get({
|
|
224
|
+
providerCorrelationReference: customId,
|
|
225
|
+
})
|
|
226
|
+
: undefined);
|
|
227
|
+
if (!refund) this.app.throw(400, 'PayPal refund webhook is not correlated');
|
|
228
|
+
const session = await this.$scope.pay.model.paymentSession.getById(refund.paymentSessionId);
|
|
229
|
+
if (!session || session.providerCaptureId !== captureId) {
|
|
230
|
+
this.app.throw(409, 'PayPal refund webhook capture conflicts');
|
|
231
|
+
}
|
|
232
|
+
const snapshot = this._mapRefund(
|
|
233
|
+
resource,
|
|
234
|
+
{
|
|
235
|
+
paymentSessionId: session.id,
|
|
236
|
+
refundOperationId: refund.id,
|
|
237
|
+
businessReference: refund.businessReference,
|
|
238
|
+
providerInvoiceReference: refund.providerInvoiceReference,
|
|
239
|
+
providerCorrelationReference: refund.providerCorrelationReference,
|
|
240
|
+
idempotencyKey: '',
|
|
241
|
+
amountMinor: refund.amountMinor,
|
|
242
|
+
currency: refund.currency,
|
|
243
|
+
providerCaptureId: captureId,
|
|
244
|
+
providerRefundId: resourceId,
|
|
245
|
+
},
|
|
246
|
+
clientOptions,
|
|
247
|
+
);
|
|
248
|
+
return {
|
|
249
|
+
eventId: event.id,
|
|
250
|
+
eventType: event.event_type,
|
|
251
|
+
refundOperationId: refund.id,
|
|
252
|
+
refund: snapshot,
|
|
253
|
+
summary: { amountMinor: refund.amountMinor, currency: refund.currency },
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
private async _mapCaptureRefundedWebhook(
|
|
258
|
+
event: z.infer<typeof PaypalWebhookSchema>,
|
|
259
|
+
resource: Record<string, unknown>,
|
|
260
|
+
resourceId: string,
|
|
261
|
+
clientOptions: IPayProviderPaypalClientOptions,
|
|
262
|
+
): Promise<IPayProviderVerifiedWebhook> {
|
|
263
|
+
const relatedCaptureId = readNestedString(resource, [
|
|
264
|
+
'supplementary_data',
|
|
265
|
+
'related_ids',
|
|
266
|
+
'capture_id',
|
|
267
|
+
]);
|
|
268
|
+
const relatedRefundId = readNestedString(resource, [
|
|
269
|
+
'supplementary_data',
|
|
270
|
+
'related_ids',
|
|
271
|
+
'refund_id',
|
|
272
|
+
]);
|
|
273
|
+
if (relatedRefundId) {
|
|
274
|
+
return await this._mapCaptureRefundedRefund(
|
|
275
|
+
event,
|
|
276
|
+
await this._gateway(clientOptions).getRefund(this._gatewayOptions(clientOptions), {
|
|
277
|
+
refundId: relatedRefundId,
|
|
278
|
+
}),
|
|
279
|
+
relatedRefundId,
|
|
280
|
+
relatedCaptureId,
|
|
281
|
+
clientOptions,
|
|
282
|
+
);
|
|
283
|
+
}
|
|
284
|
+
try {
|
|
285
|
+
const capture = asRecord(
|
|
286
|
+
await this._gateway(clientOptions).getCapturedPayment(this._gatewayOptions(clientOptions), {
|
|
287
|
+
captureId: resourceId,
|
|
288
|
+
}),
|
|
289
|
+
);
|
|
290
|
+
const captureId = readString(capture.id);
|
|
291
|
+
if (!captureId || captureId !== resourceId) {
|
|
292
|
+
this.app.throw(409, 'PayPal capture refund webhook capture conflicts');
|
|
293
|
+
}
|
|
294
|
+
if (relatedCaptureId && relatedCaptureId !== captureId) {
|
|
295
|
+
this.app.throw(409, 'PayPal capture refund webhook capture conflicts');
|
|
296
|
+
}
|
|
297
|
+
return this._ignoredCaptureRefund(event, resource, captureId);
|
|
298
|
+
} catch (error) {
|
|
299
|
+
if (!this._isPaypalNotFound(error)) throw error;
|
|
300
|
+
}
|
|
301
|
+
return await this._mapCaptureRefundedRefund(
|
|
302
|
+
event,
|
|
303
|
+
await this._gateway(clientOptions).getRefund(this._gatewayOptions(clientOptions), {
|
|
304
|
+
refundId: resourceId,
|
|
305
|
+
}),
|
|
306
|
+
resourceId,
|
|
307
|
+
relatedCaptureId,
|
|
308
|
+
clientOptions,
|
|
309
|
+
);
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
private async _mapCaptureRefundedRefund(
|
|
313
|
+
event: z.infer<typeof PaypalWebhookSchema>,
|
|
314
|
+
refundResource: unknown,
|
|
315
|
+
refundId: string,
|
|
316
|
+
relatedCaptureId: string | undefined,
|
|
317
|
+
clientOptions: IPayProviderPaypalClientOptions,
|
|
318
|
+
): Promise<IPayProviderVerifiedWebhook> {
|
|
319
|
+
const refundRecord = asRecord(refundResource);
|
|
320
|
+
if (readString(refundRecord.id) !== refundId) {
|
|
321
|
+
this.app.throw(409, 'PayPal capture refund webhook refund conflicts');
|
|
322
|
+
}
|
|
323
|
+
const customId = readString(readField(refundRecord, 'customId', 'custom_id'));
|
|
324
|
+
const invoiceId = readString(readField(refundRecord, 'invoiceId', 'invoice_id'));
|
|
325
|
+
if (!customId || !invoiceId) {
|
|
326
|
+
this.app.throw(400, 'PayPal capture refund webhook is not correlated');
|
|
327
|
+
}
|
|
328
|
+
const refund = await this.$scope.pay.model.refundOperation.get({
|
|
329
|
+
providerCorrelationReference: customId,
|
|
330
|
+
});
|
|
331
|
+
if (!refund || refund.providerInvoiceReference !== invoiceId) {
|
|
332
|
+
this.app.throw(400, 'PayPal capture refund webhook is not correlated');
|
|
333
|
+
}
|
|
334
|
+
const session = await this.$scope.pay.model.paymentSession.getById(refund.paymentSessionId);
|
|
335
|
+
if (!session?.providerCaptureId) {
|
|
336
|
+
this.app.throw(409, 'PayPal capture refund webhook payment session conflicts');
|
|
337
|
+
}
|
|
338
|
+
if (relatedCaptureId && session.providerCaptureId !== relatedCaptureId) {
|
|
339
|
+
this.app.throw(409, 'PayPal capture refund webhook capture conflicts');
|
|
340
|
+
}
|
|
341
|
+
const snapshot = this._mapRefund(
|
|
342
|
+
refundRecord,
|
|
343
|
+
{
|
|
344
|
+
paymentSessionId: session.id,
|
|
345
|
+
refundOperationId: refund.id,
|
|
346
|
+
businessReference: refund.businessReference,
|
|
347
|
+
providerInvoiceReference: refund.providerInvoiceReference,
|
|
348
|
+
providerCorrelationReference: refund.providerCorrelationReference,
|
|
349
|
+
idempotencyKey: '',
|
|
350
|
+
amountMinor: refund.amountMinor,
|
|
351
|
+
currency: refund.currency,
|
|
352
|
+
providerCaptureId: session.providerCaptureId,
|
|
353
|
+
providerRefundId: refundId,
|
|
354
|
+
},
|
|
355
|
+
clientOptions,
|
|
356
|
+
);
|
|
357
|
+
return {
|
|
358
|
+
eventId: event.id,
|
|
359
|
+
eventType: event.event_type,
|
|
360
|
+
refundOperationId: refund.id,
|
|
361
|
+
refund: snapshot,
|
|
362
|
+
summary: { amountMinor: refund.amountMinor, currency: refund.currency },
|
|
363
|
+
};
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
private _ignoredCaptureRefund(
|
|
367
|
+
event: z.infer<typeof PaypalWebhookSchema>,
|
|
368
|
+
resource: Record<string, unknown>,
|
|
369
|
+
captureId: string,
|
|
370
|
+
): IPayProviderVerifiedWebhook {
|
|
371
|
+
return {
|
|
372
|
+
eventId: event.id,
|
|
373
|
+
eventType: event.event_type,
|
|
374
|
+
providerCaptureId: captureId,
|
|
375
|
+
ignored: true,
|
|
376
|
+
summary: {
|
|
377
|
+
amountMinor: parsePaypalAmount(resource.amount)!,
|
|
378
|
+
currency: parsePaypalCurrency(resource.amount)!,
|
|
379
|
+
},
|
|
380
|
+
};
|
|
381
|
+
}
|
|
382
|
+
|
|
201
383
|
private async _mapWebhook(
|
|
202
384
|
event: z.infer<typeof PaypalWebhookSchema>,
|
|
203
385
|
clientOptions: IPayProviderPaypalClientOptions,
|
|
@@ -206,47 +388,15 @@ export class PayProviderPaypal
|
|
|
206
388
|
const amount = parsePaypalAmount(resource.amount);
|
|
207
389
|
const currency = parsePaypalCurrency(resource.amount);
|
|
208
390
|
const resourceId = readString(resource.id);
|
|
209
|
-
if (!resourceId ||
|
|
391
|
+
if (!resourceId || amount === undefined || !currency)
|
|
210
392
|
this.app.throw(400, 'PayPal webhook has invalid resource');
|
|
211
393
|
|
|
212
|
-
if (
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
]);
|
|
219
|
-
if (!refundOperationId || !captureId)
|
|
220
|
-
this.app.throw(400, 'PayPal refund webhook is not correlated');
|
|
221
|
-
const refund = await this.$scope.pay.model.refundOperation.getById(
|
|
222
|
-
refundOperationId as never,
|
|
223
|
-
);
|
|
224
|
-
if (!refund) this.app.throw(404, 'PayPal refund operation not found');
|
|
225
|
-
const session = await this.$scope.pay.model.paymentSession.getById(refund.paymentSessionId);
|
|
226
|
-
if (!session || session.providerCaptureId !== captureId) {
|
|
227
|
-
this.app.throw(409, 'PayPal refund webhook capture conflicts');
|
|
228
|
-
}
|
|
229
|
-
const snapshot = this._mapRefund(
|
|
230
|
-
resource,
|
|
231
|
-
{
|
|
232
|
-
paymentSessionId: session.id,
|
|
233
|
-
refundOperationId: refund.id,
|
|
234
|
-
businessReference: refund.businessReference,
|
|
235
|
-
idempotencyKey: '',
|
|
236
|
-
amountMinor: refund.amountMinor,
|
|
237
|
-
currency: refund.currency,
|
|
238
|
-
providerCaptureId: captureId,
|
|
239
|
-
providerRefundId: resourceId,
|
|
240
|
-
},
|
|
241
|
-
clientOptions,
|
|
242
|
-
);
|
|
243
|
-
return {
|
|
244
|
-
eventId: event.id,
|
|
245
|
-
eventType: event.event_type,
|
|
246
|
-
refundOperationId: refund.id,
|
|
247
|
-
refund: snapshot,
|
|
248
|
-
summary: { amountMinor: amount, currency },
|
|
249
|
-
};
|
|
394
|
+
if (event.event_type.startsWith('PAYMENT.REFUND.')) {
|
|
395
|
+
return await this._mapRefundWebhook(event, resource, resourceId, clientOptions);
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
if (event.event_type === 'PAYMENT.CAPTURE.REFUNDED') {
|
|
399
|
+
return await this._mapCaptureRefundedWebhook(event, resource, resourceId, clientOptions);
|
|
250
400
|
}
|
|
251
401
|
|
|
252
402
|
if (event.event_type.startsWith('PAYMENT.CAPTURE.')) {
|
|
@@ -258,7 +408,7 @@ export class PayProviderPaypal
|
|
|
258
408
|
id: orderId,
|
|
259
409
|
},
|
|
260
410
|
);
|
|
261
|
-
const input = this._inputFromOrder(order, orderId);
|
|
411
|
+
const input = await this._inputFromOrder(order, orderId);
|
|
262
412
|
const payment = this._mapOrder(order, input, clientOptions);
|
|
263
413
|
if (!['succeeded', 'failed', 'cancelled'].includes(payment.state)) {
|
|
264
414
|
this.app.throw(400, 'PayPal capture webhook is not terminal');
|
|
@@ -277,20 +427,36 @@ export class PayProviderPaypal
|
|
|
277
427
|
this.app.throw(400, 'PayPal webhook event type is unsupported');
|
|
278
428
|
}
|
|
279
429
|
|
|
280
|
-
private _inputFromOrder(
|
|
430
|
+
private async _inputFromOrder(
|
|
431
|
+
order: unknown,
|
|
432
|
+
providerOrderId: string,
|
|
433
|
+
): Promise<IPayProviderPaymentInput> {
|
|
281
434
|
const orderRecord = asRecord(order);
|
|
282
435
|
const unit = asArray(readField(orderRecord, 'purchaseUnits', 'purchase_units'))[0];
|
|
283
436
|
const unitRecord = asRecord(unit);
|
|
284
|
-
const
|
|
285
|
-
const
|
|
437
|
+
const providerCorrelationReference = readString(readField(unitRecord, 'customId', 'custom_id'));
|
|
438
|
+
const providerInvoiceReference = readString(readField(unitRecord, 'invoiceId', 'invoice_id'));
|
|
286
439
|
const amountMinor = parsePaypalAmount(readField(unitRecord, 'amount'));
|
|
287
440
|
const currency = parsePaypalCurrency(readField(unitRecord, 'amount'));
|
|
288
|
-
if (
|
|
441
|
+
if (
|
|
442
|
+
!providerCorrelationReference ||
|
|
443
|
+
!providerInvoiceReference ||
|
|
444
|
+
amountMinor === undefined ||
|
|
445
|
+
!currency
|
|
446
|
+
) {
|
|
447
|
+
this.app.throw(400, 'PayPal order is not correlated');
|
|
448
|
+
}
|
|
449
|
+
const session = await this.$scope.pay.model.paymentSession.get({
|
|
450
|
+
providerCorrelationReference,
|
|
451
|
+
});
|
|
452
|
+
if (!session || session.providerInvoiceReference !== providerInvoiceReference) {
|
|
289
453
|
this.app.throw(400, 'PayPal order is not correlated');
|
|
290
454
|
}
|
|
291
455
|
return {
|
|
292
|
-
paymentSessionId:
|
|
293
|
-
businessReference,
|
|
456
|
+
paymentSessionId: session.id,
|
|
457
|
+
businessReference: session.businessReference,
|
|
458
|
+
providerInvoiceReference: session.providerInvoiceReference,
|
|
459
|
+
providerCorrelationReference: session.providerCorrelationReference,
|
|
294
460
|
idempotencyKey: '',
|
|
295
461
|
amountMinor,
|
|
296
462
|
currency,
|
|
@@ -312,14 +478,14 @@ export class PayProviderPaypal
|
|
|
312
478
|
if (units.length !== 1) this.app.throw(409, 'PayPal order has an invalid purchase-unit count');
|
|
313
479
|
const unit = asRecord(units[0]);
|
|
314
480
|
if (
|
|
315
|
-
readString(readField(unit, 'customId', 'custom_id')) !==
|
|
316
|
-
readString(readField(unit, 'invoiceId', 'invoice_id')) !== input.
|
|
481
|
+
readString(readField(unit, 'customId', 'custom_id')) !== input.providerCorrelationReference ||
|
|
482
|
+
readString(readField(unit, 'invoiceId', 'invoice_id')) !== input.providerInvoiceReference ||
|
|
317
483
|
parsePaypalAmount(readField(unit, 'amount')) !== input.amountMinor ||
|
|
318
484
|
parsePaypalCurrency(readField(unit, 'amount')) !== input.currency
|
|
319
485
|
) {
|
|
320
486
|
this.app.throw(409, 'PayPal order facts conflict with the payment session');
|
|
321
487
|
}
|
|
322
|
-
this._assertMerchant(unit, clientOptions);
|
|
488
|
+
this._assertMerchant(unit, clientOptions, 'order');
|
|
323
489
|
const captures = asArray(readField(asRecord(readField(unit, 'payments')), 'captures'));
|
|
324
490
|
if (captures.length > 1) this.app.throw(409, 'PayPal order has multiple captures');
|
|
325
491
|
const capture = asRecord(captures[0]);
|
|
@@ -361,30 +527,56 @@ export class PayProviderPaypal
|
|
|
361
527
|
if (orderRecord.status === OrderStatus.Voided) {
|
|
362
528
|
return { state: 'cancelled', providerPaymentId: orderId, providerOrderId: orderId };
|
|
363
529
|
}
|
|
364
|
-
|
|
530
|
+
const approvalUrl = this._approvalUrl(orderRecord);
|
|
531
|
+
return {
|
|
532
|
+
state: 'requires_action',
|
|
533
|
+
providerPaymentId: orderId,
|
|
534
|
+
providerOrderId: orderId,
|
|
535
|
+
...(approvalUrl && { nextAction: { kind: 'redirect' as const, url: approvalUrl } }),
|
|
536
|
+
};
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
private _approvalUrl(order: Record<string, unknown>) {
|
|
540
|
+
return readString(
|
|
541
|
+
asArray(order.links)
|
|
542
|
+
.map(asRecord)
|
|
543
|
+
.find(item => item.rel === 'approve')?.href,
|
|
544
|
+
);
|
|
365
545
|
}
|
|
366
546
|
|
|
367
547
|
private _mapRefund(
|
|
368
548
|
refund: unknown,
|
|
369
549
|
input: IPayProviderRefundInput,
|
|
370
550
|
clientOptions: IPayProviderPaypalClientOptions,
|
|
551
|
+
requireCorrelationMetadata = true,
|
|
371
552
|
): IPayProviderRefundSnapshot {
|
|
372
553
|
const record = asRecord(refund);
|
|
373
554
|
const providerRefundId = readString(record.id);
|
|
374
555
|
if (!providerRefundId) this.app.throw(502, 'PayPal refund returned no identifier');
|
|
556
|
+
const customId = readString(readField(record, 'customId', 'custom_id'));
|
|
557
|
+
const invoiceId = readString(readField(record, 'invoiceId', 'invoice_id'));
|
|
375
558
|
if (
|
|
376
559
|
(input.providerRefundId && input.providerRefundId !== providerRefundId) ||
|
|
377
|
-
|
|
378
|
-
|
|
560
|
+
(customId && customId !== input.providerCorrelationReference) ||
|
|
561
|
+
(invoiceId && invoiceId !== input.providerInvoiceReference) ||
|
|
562
|
+
(requireCorrelationMetadata && (!customId || !invoiceId)) ||
|
|
379
563
|
parsePaypalAmount(record.amount) !== input.amountMinor ||
|
|
380
564
|
parsePaypalCurrency(record.amount) !== input.currency
|
|
381
565
|
) {
|
|
382
566
|
this.app.throw(409, 'PayPal refund facts conflict with the refund operation');
|
|
383
567
|
}
|
|
384
|
-
this._assertMerchant(record, clientOptions);
|
|
568
|
+
this._assertMerchant(record, clientOptions, 'refund');
|
|
385
569
|
return mapRefund(readString(record.status), providerRefundId);
|
|
386
570
|
}
|
|
387
571
|
|
|
572
|
+
private _isDefinitiveRefundRejection(error: unknown) {
|
|
573
|
+
return error instanceof ApiError && error.statusCode === 422;
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
private _isPaypalNotFound(error: unknown) {
|
|
577
|
+
return error instanceof ApiError && error.statusCode === 404;
|
|
578
|
+
}
|
|
579
|
+
|
|
388
580
|
private _gateway(clientOptions: IPayProviderPaypalClientOptions) {
|
|
389
581
|
return clientOptions.gateway ?? createPaypalGateway(this.bean.core.fetch);
|
|
390
582
|
}
|
|
@@ -423,16 +615,31 @@ export class PayProviderPaypal
|
|
|
423
615
|
private _assertMerchant(
|
|
424
616
|
value: Record<string, unknown>,
|
|
425
617
|
clientOptions: IPayProviderPaypalClientOptions,
|
|
618
|
+
resourceType: 'order' | 'refund',
|
|
426
619
|
) {
|
|
427
|
-
const
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
620
|
+
const merchant = this._merchantReference(value, resourceType);
|
|
621
|
+
if (
|
|
622
|
+
!merchant.observedMerchantReference ||
|
|
623
|
+
merchant.observedMerchantReference !== clientOptions.merchantReference
|
|
624
|
+
) {
|
|
625
|
+
this.$logger.warn({
|
|
626
|
+
event: 'paypal.merchant_reference_conflict',
|
|
627
|
+
observedMerchantSource: merchant.observedMerchantSource,
|
|
628
|
+
});
|
|
433
629
|
this.app.throw(409, 'PayPal merchant reference conflicts');
|
|
434
630
|
}
|
|
435
631
|
}
|
|
632
|
+
|
|
633
|
+
private _merchantReference(value: Record<string, unknown>, resourceType: 'order' | 'refund') {
|
|
634
|
+
const field = resourceType === 'order' ? 'payee' : 'payer';
|
|
635
|
+
const merchantReference =
|
|
636
|
+
readNestedString(value, [field, 'merchantId']) ??
|
|
637
|
+
readNestedString(value, [field, 'merchant_id']);
|
|
638
|
+
return {
|
|
639
|
+
observedMerchantReference: merchantReference,
|
|
640
|
+
observedMerchantSource: merchantReference ? `${field}.merchant_id` : 'missing',
|
|
641
|
+
};
|
|
642
|
+
}
|
|
436
643
|
}
|
|
437
644
|
|
|
438
645
|
function formatMinorAmount(amountMinor: number, currency: string) {
|
|
@@ -499,13 +706,3 @@ function parsePaypalCurrency(value: unknown) {
|
|
|
499
706
|
const currency = readString(readField(amount, 'currencyCode', 'currency_code'));
|
|
500
707
|
return currency === 'USD' ? currency : undefined;
|
|
501
708
|
}
|
|
502
|
-
|
|
503
|
-
function isRefundEvent(eventType: string) {
|
|
504
|
-
return eventType === 'PAYMENT.CAPTURE.REFUNDED' || eventType.startsWith('PAYMENT.REFUND.');
|
|
505
|
-
}
|
|
506
|
-
|
|
507
|
-
declare module 'vona-module-a-pay' {
|
|
508
|
-
export interface IPayProviderRecord {
|
|
509
|
-
'pay-paypal:paypal': IPayProviderOptionsPaypal;
|
|
510
|
-
}
|
|
511
|
-
}
|
package/src/index.ts
CHANGED
package/src/lib/paypalGateway.ts
CHANGED
|
@@ -12,11 +12,14 @@ export interface IPaypalGatewayOptions {
|
|
|
12
12
|
webhookId: string;
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
+
export const PaypalRequestTimeoutMilliseconds = 15_000;
|
|
16
|
+
|
|
15
17
|
export interface IPaypalGateway {
|
|
16
18
|
createOrder(options: IPaypalGatewayOptions, input: unknown): Promise<unknown>;
|
|
17
19
|
captureOrder(options: IPaypalGatewayOptions, input: unknown): Promise<unknown>;
|
|
18
20
|
getOrder(options: IPaypalGatewayOptions, input: unknown): Promise<unknown>;
|
|
19
21
|
refundCapturedPayment(options: IPaypalGatewayOptions, input: unknown): Promise<unknown>;
|
|
22
|
+
getCapturedPayment(options: IPaypalGatewayOptions, input: unknown): Promise<unknown>;
|
|
20
23
|
getRefund(options: IPaypalGatewayOptions, input: unknown): Promise<unknown>;
|
|
21
24
|
verifyWebhookSignature(
|
|
22
25
|
options: IPaypalGatewayOptions,
|
|
@@ -50,6 +53,11 @@ export function createPaypalGateway(fetcher: typeof fetch): IPaypalGateway {
|
|
|
50
53
|
await new PaymentsController(createClient(options)).refundCapturedPayment(input as never)
|
|
51
54
|
).result;
|
|
52
55
|
},
|
|
56
|
+
async getCapturedPayment(options, input) {
|
|
57
|
+
return (
|
|
58
|
+
await new PaymentsController(createClient(options)).getCapturedPayment(input as never)
|
|
59
|
+
).result;
|
|
60
|
+
},
|
|
53
61
|
async getRefund(options, input) {
|
|
54
62
|
return (await new PaymentsController(createClient(options)).getRefund(input as never)).result;
|
|
55
63
|
},
|
|
@@ -110,7 +118,7 @@ function createClient(options: IPaypalGatewayOptions) {
|
|
|
110
118
|
oAuthClientId: options.clientId,
|
|
111
119
|
oAuthClientSecret: options.clientSecret,
|
|
112
120
|
},
|
|
113
|
-
timeout:
|
|
121
|
+
timeout: PaypalRequestTimeoutMilliseconds,
|
|
114
122
|
environment: options.environment === 'live' ? Environment.Production : Environment.Sandbox,
|
|
115
123
|
});
|
|
116
124
|
}
|