@easypayment/medusa-payment-paypal 0.9.15 → 0.9.16
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/.medusa/server/src/admin/index.js +17 -17
- package/.medusa/server/src/admin/index.mjs +17 -17
- package/.medusa/server/src/api/store/paypal/capture-order/route.d.ts.map +1 -1
- package/.medusa/server/src/api/store/paypal/capture-order/route.js +21 -10
- package/.medusa/server/src/api/store/paypal/capture-order/route.js.map +1 -1
- package/.medusa/server/src/api/store/paypal/create-order/route.d.ts.map +1 -1
- package/.medusa/server/src/api/store/paypal/create-order/route.js +76 -54
- package/.medusa/server/src/api/store/paypal/create-order/route.js.map +1 -1
- package/.medusa/server/src/api/store/paypal/webhook/route.d.ts.map +1 -1
- package/.medusa/server/src/api/store/paypal/webhook/route.js +2 -1
- package/.medusa/server/src/api/store/paypal/webhook/route.js.map +1 -1
- package/.medusa/server/src/api/store/paypal-complete/route.d.ts.map +1 -1
- package/.medusa/server/src/api/store/paypal-complete/route.js +29 -27
- package/.medusa/server/src/api/store/paypal-complete/route.js.map +1 -1
- package/.medusa/server/src/jobs/paypal-webhook-retry.d.ts.map +1 -1
- package/.medusa/server/src/jobs/paypal-webhook-retry.js +42 -1
- package/.medusa/server/src/jobs/paypal-webhook-retry.js.map +1 -1
- package/.medusa/server/src/modules/paypal/clients/paypal-seller.client.d.ts.map +1 -1
- package/.medusa/server/src/modules/paypal/clients/paypal-seller.client.js +5 -4
- package/.medusa/server/src/modules/paypal/clients/paypal-seller.client.js.map +1 -1
- package/.medusa/server/src/modules/paypal/payment-provider/card-service.d.ts.map +1 -1
- package/.medusa/server/src/modules/paypal/payment-provider/card-service.js +13 -10
- package/.medusa/server/src/modules/paypal/payment-provider/card-service.js.map +1 -1
- package/.medusa/server/src/modules/paypal/payment-provider/service.d.ts.map +1 -1
- package/.medusa/server/src/modules/paypal/payment-provider/service.js +10 -9
- package/.medusa/server/src/modules/paypal/payment-provider/service.js.map +1 -1
- package/.medusa/server/src/modules/paypal/payment-provider/webhook-utils.d.ts +12 -0
- package/.medusa/server/src/modules/paypal/payment-provider/webhook-utils.d.ts.map +1 -1
- package/.medusa/server/src/modules/paypal/payment-provider/webhook-utils.js +12 -0
- package/.medusa/server/src/modules/paypal/payment-provider/webhook-utils.js.map +1 -1
- package/.medusa/server/src/modules/paypal/service.d.ts +10 -1
- package/.medusa/server/src/modules/paypal/service.d.ts.map +1 -1
- package/.medusa/server/src/modules/paypal/service.js +71 -21
- package/.medusa/server/src/modules/paypal/service.js.map +1 -1
- package/.medusa/server/src/modules/paypal/utils/amounts.d.ts +9 -1
- package/.medusa/server/src/modules/paypal/utils/amounts.d.ts.map +1 -1
- package/.medusa/server/src/modules/paypal/utils/amounts.js +17 -5
- package/.medusa/server/src/modules/paypal/utils/amounts.js.map +1 -1
- package/.medusa/server/src/modules/paypal/utils/paypal-auth.d.ts +0 -8
- package/.medusa/server/src/modules/paypal/utils/paypal-auth.d.ts.map +1 -1
- package/.medusa/server/src/modules/paypal/utils/paypal-auth.js +0 -22
- package/.medusa/server/src/modules/paypal/utils/paypal-auth.js.map +1 -1
- package/.medusa/server/src/modules/paypal/utils/paypal-fetch.d.ts +16 -0
- package/.medusa/server/src/modules/paypal/utils/paypal-fetch.d.ts.map +1 -0
- package/.medusa/server/src/modules/paypal/utils/paypal-fetch.js +31 -0
- package/.medusa/server/src/modules/paypal/utils/paypal-fetch.js.map +1 -0
- package/.medusa/server/src/modules/paypal/utils/secret-crypto.d.ts +14 -0
- package/.medusa/server/src/modules/paypal/utils/secret-crypto.d.ts.map +1 -0
- package/.medusa/server/src/modules/paypal/utils/secret-crypto.js +91 -0
- package/.medusa/server/src/modules/paypal/utils/secret-crypto.js.map +1 -0
- package/.medusa/server/src/modules/paypal/webhook-processor.d.ts.map +1 -1
- package/.medusa/server/src/modules/paypal/webhook-processor.js +29 -13
- package/.medusa/server/src/modules/paypal/webhook-processor.js.map +1 -1
- package/.medusa/server/src/subscribers/paypal-order-invoice.d.ts.map +1 -1
- package/.medusa/server/src/subscribers/paypal-order-invoice.js +5 -3
- package/.medusa/server/src/subscribers/paypal-order-invoice.js.map +1 -1
- package/README.md +12 -0
- package/package.json +5 -2
- package/src/api/store/paypal/capture-order/route.ts +24 -13
- package/src/api/store/paypal/create-order/route.ts +93 -62
- package/src/api/store/paypal/webhook/route.ts +2 -1
- package/src/api/store/paypal-complete/route.ts +32 -38
- package/src/jobs/paypal-webhook-retry.ts +51 -1
- package/src/modules/paypal/clients/paypal-seller.client.ts +6 -4
- package/src/modules/paypal/payment-provider/card-service.ts +13 -10
- package/src/modules/paypal/payment-provider/service.ts +10 -9
- package/src/modules/paypal/payment-provider/webhook-utils.ts +12 -0
- package/src/modules/paypal/service.ts +76 -21
- package/src/modules/paypal/utils/amounts.ts +17 -8
- package/src/modules/paypal/utils/paypal-auth.ts +0 -27
- package/src/modules/paypal/utils/paypal-fetch.ts +30 -0
- package/src/modules/paypal/utils/secret-crypto.ts +94 -0
- package/src/modules/paypal/webhook-processor.ts +32 -15
- package/src/subscribers/paypal-order-invoice.ts +6 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhook-processor.js","sourceRoot":"","sources":["../../../../../src/modules/paypal/webhook-processor.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"webhook-processor.js","sourceRoot":"","sources":["../../../../../src/modules/paypal/webhook-processor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paypal-order-invoice.d.ts","sourceRoot":"","sources":["../../../../src/subscribers/paypal-order-invoice.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"paypal-order-invoice.d.ts","sourceRoot":"","sources":["../../../../src/subscribers/paypal-order-invoice.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAQ3E,wBAA8B,yBAAyB,CAAC,EACtD,KAAK,EACL,SAAS,GACV,EAAE,cAAc,CAAC;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC,iBA6JhC;AAED,eAAO,MAAM,MAAM,EAAE,gBAEpB,CAAA"}
|
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.config = void 0;
|
|
4
4
|
exports.default = paypalOrderInvoiceHandler;
|
|
5
5
|
const paypal_auth_1 = require("../modules/paypal/utils/paypal-auth");
|
|
6
|
+
const paypal_fetch_1 = require("../modules/paypal/utils/paypal-fetch");
|
|
6
7
|
const provider_ids_1 = require("../modules/paypal/utils/provider-ids");
|
|
7
8
|
const PATCHABLE_STATUSES = new Set(["CREATED", "APPROVED", "SAVED"]);
|
|
8
9
|
async function paypalOrderInvoiceHandler({ event, container, }) {
|
|
@@ -56,11 +57,12 @@ async function paypalOrderInvoiceHandler({ event, container, }) {
|
|
|
56
57
|
if (!invoiceId)
|
|
57
58
|
return;
|
|
58
59
|
const creds = await paypal.getActiveCredentials();
|
|
59
|
-
const
|
|
60
|
+
const base = (0, paypal_auth_1.getPayPalApiBase)(creds.environment);
|
|
61
|
+
const accessToken = await paypal.getAppAccessToken();
|
|
60
62
|
let paypalOrderStatus = "";
|
|
61
63
|
let currentInvoiceId = "";
|
|
62
64
|
try {
|
|
63
|
-
const statusResp = await
|
|
65
|
+
const statusResp = await (0, paypal_fetch_1.paypalFetch)(`${base}/v2/checkout/orders/${encodeURIComponent(paypalOrderId)}`, { headers: { Authorization: `Bearer ${accessToken}` } });
|
|
64
66
|
if (statusResp.ok) {
|
|
65
67
|
const currentOrder = await statusResp.json().catch(() => ({}));
|
|
66
68
|
paypalOrderStatus = String(currentOrder?.status || "").toUpperCase();
|
|
@@ -86,7 +88,7 @@ async function paypalOrderInvoiceHandler({ event, container, }) {
|
|
|
86
88
|
console.info(`[PayPal] invoice_id already "${invoiceId}" — skipping PATCH`);
|
|
87
89
|
return;
|
|
88
90
|
}
|
|
89
|
-
const patchResp = await
|
|
91
|
+
const patchResp = await (0, paypal_fetch_1.paypalFetch)(`${base}/v2/checkout/orders/${encodeURIComponent(paypalOrderId)}`, {
|
|
90
92
|
method: "PATCH",
|
|
91
93
|
headers: {
|
|
92
94
|
Authorization: `Bearer ${accessToken}`,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paypal-order-invoice.js","sourceRoot":"","sources":["../../../../src/subscribers/paypal-order-invoice.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"paypal-order-invoice.js","sourceRoot":"","sources":["../../../../src/subscribers/paypal-order-invoice.ts"],"names":[],"mappings":"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"}
|
package/README.md
CHANGED
|
@@ -131,6 +131,10 @@ npx medusa db:migrate
|
|
|
131
131
|
|
|
132
132
|
Credentials are saved automatically. Prefer manual setup? Click **Insert credentials manually** and paste your Client ID and Secret from [developer.paypal.com](https://developer.paypal.com/dashboard/).
|
|
133
133
|
|
|
134
|
+
> **🔐 Encrypt secrets at rest (recommended for production).** Set `PAYPAL_ENCRYPTION_KEY` to any strong random string. The seller client secret and PayPal app access token are then stored AES‑256‑GCM‑encrypted in the database; without it they are stored in plaintext (the previous default). Encryption is transparent — existing plaintext credentials keep working and are upgraded to ciphertext the next time they are saved/refreshed.
|
|
135
|
+
>
|
|
136
|
+
> Keep this key safe and backed up: **if it is lost, stored credentials cannot be decrypted** and you must reconnect PayPal. Rotating the key requires re‑saving credentials.
|
|
137
|
+
|
|
134
138
|
---
|
|
135
139
|
|
|
136
140
|
### Step 4 — Enable providers in your region
|
|
@@ -167,6 +171,14 @@ See the [storefront integration & testing guide →](https://www.npmjs.com/packa
|
|
|
167
171
|
|
|
168
172
|
---
|
|
169
173
|
|
|
174
|
+
## 📊 Observability
|
|
175
|
+
|
|
176
|
+
- **Metrics** — operational counters (e.g. `create_order_success`, `capture_order_failed`, `webhook_success`, `webhook_dead_letter`) are persisted in the `paypal_metric` table.
|
|
177
|
+
- **Audit trail** — security/lifecycle events (credential changes, environment switches, webhook registration, capture/refund failures, alerts) are emitted as structured JSON log lines tagged `"log":"paypal_audit"`. In production, ship stdout to your log aggregator and filter on that tag. Sensitive fields (secrets, tokens) are redacted before logging.
|
|
178
|
+
- **Webhooks** — every received event is recorded in `paypal_webhook_event` with status (`processed` / `failed` / `dead_letter` / `ignored`), attempt count, and last error; failures are retried by the `paypal-webhook-retry` job.
|
|
179
|
+
|
|
180
|
+
---
|
|
181
|
+
|
|
170
182
|
## 📄 License
|
|
171
183
|
|
|
172
184
|
MIT © [Easy Payment](https://www.npmjs.com/package/@easypayment/medusa-payment-paypal)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@easypayment/medusa-payment-paypal",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.16",
|
|
4
4
|
"description": "PayPal integration for Medusa v2",
|
|
5
5
|
"author": "EasyPayment Plugins",
|
|
6
6
|
"license": "MIT",
|
|
@@ -36,6 +36,8 @@
|
|
|
36
36
|
"scripts": {
|
|
37
37
|
"build": "medusa plugin:build",
|
|
38
38
|
"develop": "medusa plugin:develop",
|
|
39
|
+
"test": "vitest run",
|
|
40
|
+
"test:watch": "vitest",
|
|
39
41
|
"prepublishOnly": "npm run build"
|
|
40
42
|
},
|
|
41
43
|
"devDependencies": {
|
|
@@ -47,7 +49,8 @@
|
|
|
47
49
|
"@medusajs/ui": "^4.0.0",
|
|
48
50
|
"@medusajs/icons": "2.12.5",
|
|
49
51
|
"@swc/core": "^1.5.7",
|
|
50
|
-
"typescript": "^5.6.2"
|
|
52
|
+
"typescript": "^5.6.2",
|
|
53
|
+
"vitest": "^2.0.5"
|
|
51
54
|
},
|
|
52
55
|
"peerDependencies": {
|
|
53
56
|
"@medusajs/admin-sdk": "^2.12.0",
|
|
@@ -3,7 +3,8 @@ import type { IPaymentModuleService, Logger } from "@medusajs/framework/types"
|
|
|
3
3
|
import { ContainerRegistrationKeys, Modules } from "@medusajs/framework/utils"
|
|
4
4
|
import { randomUUID } from "crypto"
|
|
5
5
|
import type PayPalModuleService from "../../../../modules/paypal/service"
|
|
6
|
-
import {
|
|
6
|
+
import { getPayPalApiBase } from "../../../../modules/paypal/utils/paypal-auth"
|
|
7
|
+
import { paypalFetch } from "../../../../modules/paypal/utils/paypal-fetch"
|
|
7
8
|
import { isPayPalProviderId } from "../../../../modules/paypal/utils/provider-ids"
|
|
8
9
|
|
|
9
10
|
const BN_CODE = "MBJTechnolabs_SI_SPB"
|
|
@@ -196,17 +197,24 @@ export async function POST(req: MedusaRequest, res: MedusaResponse) {
|
|
|
196
197
|
return res.status(400).json({ message: "Invalid order_id format" })
|
|
197
198
|
}
|
|
198
199
|
|
|
200
|
+
// Bind the capture to the cart's own PayPal session, fail-closed: the
|
|
201
|
+
// order_id MUST be the one this cart's session created (stored by
|
|
202
|
+
// create-order). This prevents capturing an arbitrary, caller-supplied
|
|
203
|
+
// order_id against the merchant account.
|
|
199
204
|
const session = await findPayPalSessionForCart(cartId, scope)
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
205
|
+
const sessionOrderId = String(
|
|
206
|
+
(session?.session_data?.paypal as Record<string, unknown>)?.order_id ||
|
|
207
|
+
session?.session_data?.order_id || ""
|
|
208
|
+
)
|
|
209
|
+
if (!session || !sessionOrderId) {
|
|
210
|
+
return res.status(409).json({
|
|
211
|
+
message: "No PayPal order is associated with this cart's payment session",
|
|
212
|
+
})
|
|
213
|
+
}
|
|
214
|
+
if (sessionOrderId !== orderId) {
|
|
215
|
+
return res.status(400).json({
|
|
216
|
+
message: "order_id does not match the payment session for this cart",
|
|
217
|
+
})
|
|
210
218
|
}
|
|
211
219
|
|
|
212
220
|
const existingCapture = await getExistingCapture(cartId, orderId, scope)
|
|
@@ -215,7 +223,10 @@ export async function POST(req: MedusaRequest, res: MedusaResponse) {
|
|
|
215
223
|
}
|
|
216
224
|
|
|
217
225
|
const creds = await paypal.getActiveCredentials()
|
|
218
|
-
|
|
226
|
+
// Cached app access token (single-flight refresh) — avoids an OAuth
|
|
227
|
+
// round-trip on every capture-order call.
|
|
228
|
+
const base = getPayPalApiBase(creds.environment)
|
|
229
|
+
const accessToken = await paypal.getAppAccessToken()
|
|
219
230
|
const settings = await paypal.getSettings().catch(() => ({}))
|
|
220
231
|
const data =
|
|
221
232
|
settings && typeof settings === "object" && "data" in settings
|
|
@@ -234,7 +245,7 @@ export async function POST(req: MedusaRequest, res: MedusaResponse) {
|
|
|
234
245
|
? `${base}/v2/checkout/orders/${safeOrderId}/authorize`
|
|
235
246
|
: `${base}/v2/checkout/orders/${safeOrderId}/capture`
|
|
236
247
|
|
|
237
|
-
const ppResp = await
|
|
248
|
+
const ppResp = await paypalFetch(endpoint, {
|
|
238
249
|
method: "POST",
|
|
239
250
|
headers: {
|
|
240
251
|
Authorization: `Bearer ${accessToken}`,
|
|
@@ -7,7 +7,8 @@ import {
|
|
|
7
7
|
assertPayPalCurrencySupported,
|
|
8
8
|
normalizeCurrencyCode,
|
|
9
9
|
} from "../../../../modules/paypal/utils/currencies"
|
|
10
|
-
import {
|
|
10
|
+
import { getPayPalApiBase } from "../../../../modules/paypal/utils/paypal-auth"
|
|
11
|
+
import { paypalFetch } from "../../../../modules/paypal/utils/paypal-fetch"
|
|
11
12
|
import type PayPalModuleService from "../../../../modules/paypal/service"
|
|
12
13
|
import { isPayPalProviderId } from "../../../../modules/paypal/utils/provider-ids"
|
|
13
14
|
|
|
@@ -300,87 +301,113 @@ export async function POST(req: MedusaRequest, res: MedusaResponse) {
|
|
|
300
301
|
|
|
301
302
|
const finalPurchaseItems = purchaseItemsRaw.map((item: any) => item.paypalItem)
|
|
302
303
|
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
304
|
+
// Reconcile rounding drift so the items we send sum to the cart subtotal.
|
|
305
|
+
if (finalPurchaseItems.length > 0) {
|
|
306
|
+
const diff = parseFloat((subtotalMajor - roundedItemSumFixed).toFixed(exponent))
|
|
307
|
+
if (Math.abs(diff) > 0.000001) {
|
|
308
|
+
finalPurchaseItems.push({
|
|
309
|
+
name: "Line Item Amount Offset",
|
|
310
|
+
quantity: "1",
|
|
311
|
+
unit_amount: {
|
|
312
|
+
currency_code: currency,
|
|
313
|
+
value: diff.toFixed(exponent),
|
|
314
|
+
},
|
|
315
|
+
})
|
|
316
|
+
}
|
|
317
|
+
}
|
|
306
318
|
|
|
307
|
-
|
|
319
|
+
// Only send line items (and an item_total) when we actually have them.
|
|
320
|
+
const sendItems = finalPurchaseItems.length > 0
|
|
321
|
+
|
|
322
|
+
// item_total MUST equal the exact sum of (unit_amount * quantity) of the
|
|
323
|
+
// items we send; otherwise PayPal rejects with ITEM_TOTAL_MISMATCH.
|
|
324
|
+
const itemsTotalMajor = sendItems
|
|
325
|
+
? parseFloat(
|
|
326
|
+
finalPurchaseItems
|
|
327
|
+
.reduce(
|
|
328
|
+
(sum: number, it: any) =>
|
|
329
|
+
sum + Number(it.unit_amount.value) * Number(it.quantity),
|
|
330
|
+
0
|
|
331
|
+
)
|
|
332
|
+
.toFixed(exponent)
|
|
333
|
+
)
|
|
334
|
+
: 0
|
|
308
335
|
|
|
309
|
-
|
|
310
|
-
finalPurchaseItems.push({
|
|
311
|
-
name: "Line Item Amount Offset",
|
|
312
|
-
quantity: "1",
|
|
313
|
-
unit_amount: {
|
|
314
|
-
currency_code: currency,
|
|
315
|
-
value: diff.toFixed(exponent),
|
|
316
|
-
},
|
|
317
|
-
})
|
|
318
|
-
}
|
|
336
|
+
const discountValue = discountMajor + giftCardMajor
|
|
319
337
|
|
|
338
|
+
// Build a breakdown only when we send line items. A breakdown whose
|
|
339
|
+
// item_total has no matching items (or items with no item_total) is
|
|
340
|
+
// rejected by PayPal, so with no items we send just the order total.
|
|
320
341
|
const breakdown: Record<string, any> = {}
|
|
321
|
-
if (
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
if (shippingMajor > 0) {
|
|
328
|
-
breakdown.shipping = {
|
|
329
|
-
currency_code: currency,
|
|
330
|
-
value: shippingMajor.toFixed(exponent),
|
|
331
|
-
}
|
|
332
|
-
}
|
|
333
|
-
if (taxMajor > 0) {
|
|
334
|
-
breakdown.tax_total = {
|
|
335
|
-
currency_code: currency,
|
|
336
|
-
value: taxMajor.toFixed(exponent),
|
|
342
|
+
if (sendItems) {
|
|
343
|
+
if (itemsTotalMajor > 0) {
|
|
344
|
+
breakdown.item_total = {
|
|
345
|
+
currency_code: currency,
|
|
346
|
+
value: itemsTotalMajor.toFixed(exponent),
|
|
347
|
+
}
|
|
337
348
|
}
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
currency_code: currency,
|
|
344
|
-
value: discountValue.toFixed(exponent),
|
|
349
|
+
if (shippingMajor > 0) {
|
|
350
|
+
breakdown.shipping = {
|
|
351
|
+
currency_code: currency,
|
|
352
|
+
value: shippingMajor.toFixed(exponent),
|
|
353
|
+
}
|
|
345
354
|
}
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
const breakdownSum = parseFloat(
|
|
349
|
-
(adjustedItemTotal + shippingMajor + taxMajor - discountValue).toFixed(exponent)
|
|
350
|
-
)
|
|
351
|
-
|
|
352
|
-
if (Math.abs(breakdownSum - totalMajor) > 0.000001) {
|
|
353
|
-
const gap = parseFloat((totalMajor - breakdownSum).toFixed(exponent))
|
|
354
|
-
|
|
355
|
-
if (gap > 0) {
|
|
355
|
+
if (taxMajor > 0) {
|
|
356
356
|
breakdown.tax_total = {
|
|
357
357
|
currency_code: currency,
|
|
358
|
-
value:
|
|
359
|
-
((Number(breakdown.tax_total?.value || 0) + gap).toFixed(exponent))
|
|
360
|
-
).toFixed(exponent),
|
|
358
|
+
value: taxMajor.toFixed(exponent),
|
|
361
359
|
}
|
|
362
|
-
}
|
|
363
|
-
|
|
360
|
+
}
|
|
361
|
+
if (discountValue > 0) {
|
|
362
|
+
breakdown.discount = {
|
|
364
363
|
currency_code: currency,
|
|
365
|
-
value:
|
|
364
|
+
value: discountValue.toFixed(exponent),
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
const breakdownSum = parseFloat(
|
|
369
|
+
(itemsTotalMajor + shippingMajor + taxMajor - discountValue).toFixed(exponent)
|
|
370
|
+
)
|
|
371
|
+
|
|
372
|
+
if (Math.abs(breakdownSum - totalMajor) > 0.000001) {
|
|
373
|
+
const gap = parseFloat((totalMajor - breakdownSum).toFixed(exponent))
|
|
374
|
+
|
|
375
|
+
if (gap > 0) {
|
|
376
|
+
breakdown.tax_total = {
|
|
377
|
+
currency_code: currency,
|
|
378
|
+
value: parseFloat(
|
|
379
|
+
((Number(breakdown.tax_total?.value || 0) + gap).toFixed(exponent))
|
|
380
|
+
).toFixed(exponent),
|
|
381
|
+
}
|
|
382
|
+
} else {
|
|
383
|
+
breakdown.shipping_discount = {
|
|
384
|
+
currency_code: currency,
|
|
385
|
+
value: Math.abs(gap).toFixed(exponent),
|
|
386
|
+
}
|
|
366
387
|
}
|
|
367
388
|
}
|
|
368
389
|
}
|
|
369
390
|
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
391
|
+
logger.debug(
|
|
392
|
+
`[paypal] create-order line items (request_id=${requestId}): send_item_details=${sendItemDetails}, cart_items=${lineItems.length}, sent_items=${finalPurchaseItems.length}, items_total=${itemsTotalMajor}, subtotal=${subtotalMajor}, total=${totalMajor}`
|
|
393
|
+
)
|
|
394
|
+
|
|
395
|
+
// Use the module's cached app access token (single-flight refresh, ~9h TTL)
|
|
396
|
+
// instead of minting a fresh OAuth token on every create-order call.
|
|
397
|
+
const base = getPayPalApiBase(creds.environment)
|
|
398
|
+
const accessToken = await paypal.getAppAccessToken()
|
|
375
399
|
|
|
376
|
-
|
|
400
|
+
// Deterministic-per-cart idempotency key for the PayPal call. Kept distinct
|
|
401
|
+
// from `requestId` (the log/response correlation id declared at the top of
|
|
402
|
+
// POST) so the two never shadow each other.
|
|
403
|
+
const paypalRequestId = resolveIdempotencyKey(req, "create-order", `pp-create-${cart.id}`)
|
|
377
404
|
|
|
378
|
-
const ppResp = await
|
|
405
|
+
const ppResp = await paypalFetch(`${base}/v2/checkout/orders`, {
|
|
379
406
|
method: "POST",
|
|
380
407
|
headers: {
|
|
381
408
|
Authorization: `Bearer ${accessToken}`,
|
|
382
409
|
"Content-Type": "application/json",
|
|
383
|
-
"PayPal-Request-Id":
|
|
410
|
+
"PayPal-Request-Id": paypalRequestId,
|
|
384
411
|
"PayPal-Partner-Attribution-Id": BN_CODE,
|
|
385
412
|
},
|
|
386
413
|
body: JSON.stringify({
|
|
@@ -388,6 +415,10 @@ export async function POST(req: MedusaRequest, res: MedusaResponse) {
|
|
|
388
415
|
purchase_units: [
|
|
389
416
|
{
|
|
390
417
|
reference_id: "default",
|
|
418
|
+
// Set custom_id on the purchase unit (not just the order) so PayPal
|
|
419
|
+
// propagates the cart id onto capture/refund webhook resources,
|
|
420
|
+
// letting webhooks resolve the session directly without a scan.
|
|
421
|
+
custom_id: cart.id,
|
|
391
422
|
invoice_id: invoiceId,
|
|
392
423
|
...(statementName ? { soft_descriptor: statementName.slice(0, 22) } : {}),
|
|
393
424
|
amount: {
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { MedusaRequest, MedusaResponse } from "@medusajs/framework/http"
|
|
2
2
|
import type PayPalModuleService from "../../../../modules/paypal/service"
|
|
3
|
+
import { paypalFetch } from "../../../../modules/paypal/utils/paypal-fetch"
|
|
3
4
|
import {
|
|
4
5
|
computeNextRetryAt,
|
|
5
6
|
isAllowedEventType,
|
|
@@ -158,7 +159,7 @@ async function verifyWebhookSignature(
|
|
|
158
159
|
throw new Error(`Missing required PayPal webhook headers: ${missing.join(", ")}`)
|
|
159
160
|
}
|
|
160
161
|
|
|
161
|
-
const resp = await
|
|
162
|
+
const resp = await paypalFetch(`${base}/v1/notifications/verify-webhook-signature`, {
|
|
162
163
|
method: "POST",
|
|
163
164
|
headers: {
|
|
164
165
|
Authorization: `Bearer ${accessToken}`,
|
|
@@ -3,7 +3,7 @@ import type { IPaymentModuleService, Logger } from "@medusajs/framework/types"
|
|
|
3
3
|
import { ContainerRegistrationKeys, Modules } from "@medusajs/framework/utils"
|
|
4
4
|
import { completeCartWorkflow } from "@medusajs/core-flows"
|
|
5
5
|
import { randomUUID } from "crypto"
|
|
6
|
-
import
|
|
6
|
+
import { isPayPalProviderId } from "../../../modules/paypal/utils/provider-ids"
|
|
7
7
|
|
|
8
8
|
export async function POST(req: MedusaRequest, res: MedusaResponse) {
|
|
9
9
|
const logger = req.scope.resolve<Logger>(ContainerRegistrationKeys.LOGGER)
|
|
@@ -43,7 +43,7 @@ export async function POST(req: MedusaRequest, res: MedusaResponse) {
|
|
|
43
43
|
|
|
44
44
|
const sessions = cart?.payment_collection?.payment_sessions || []
|
|
45
45
|
const session = sessions
|
|
46
|
-
.filter((s: any) =>
|
|
46
|
+
.filter((s: any) => isPayPalProviderId(s.provider_id))
|
|
47
47
|
.sort(
|
|
48
48
|
(a: any, b: any) =>
|
|
49
49
|
new Date(b.created_at || 0).getTime() - new Date(a.created_at || 0).getTime()
|
|
@@ -55,38 +55,11 @@ export async function POST(req: MedusaRequest, res: MedusaResponse) {
|
|
|
55
55
|
|
|
56
56
|
const paymentModule = req.scope.resolve(Modules.PAYMENT) as IPaymentModuleService
|
|
57
57
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
const liveData = (liveSession?.data || {}) as Record<string, any>
|
|
64
|
-
|
|
65
|
-
const paypal = req.scope.resolve<PayPalModuleService>("paypal_onboarding")
|
|
66
|
-
const settings = await paypal.getSettings().catch(() => ({}))
|
|
67
|
-
const settingsData =
|
|
68
|
-
settings && typeof settings === "object" && "data" in settings
|
|
69
|
-
? ((settings as { data?: Record<string, any> }).data ?? {})
|
|
70
|
-
: {}
|
|
71
|
-
const additionalSettings = (settingsData.additional_settings || {}) as Record<string, any>
|
|
72
|
-
const paymentAction =
|
|
73
|
-
typeof additionalSettings.paymentAction === "string"
|
|
74
|
-
? additionalSettings.paymentAction
|
|
75
|
-
: "capture"
|
|
76
|
-
|
|
77
|
-
const timestampKey = paymentAction === "authorize" ? "authorized_at" : "captured_at"
|
|
78
|
-
|
|
79
|
-
if (!liveData[timestampKey]) {
|
|
80
|
-
await (paymentModule as any).updatePaymentSession({
|
|
81
|
-
id: session.id,
|
|
82
|
-
data: {
|
|
83
|
-
...liveData,
|
|
84
|
-
[timestampKey]: new Date().toISOString(),
|
|
85
|
-
},
|
|
86
|
-
amount: liveSession?.amount ?? session.amount,
|
|
87
|
-
currency_code: liveSession?.currency_code ?? session.currency_code,
|
|
88
|
-
})
|
|
89
|
-
}
|
|
58
|
+
// Do NOT fabricate captured_at/authorized_at here. The authoritative
|
|
59
|
+
// timestamp and status are set by the provider's authorizePayment (invoked
|
|
60
|
+
// via authorizePaymentSession below) only after it verifies the capture /
|
|
61
|
+
// authorization against PayPal. Stamping it ourselves would mark an unpaid
|
|
62
|
+
// session as paid.
|
|
90
63
|
|
|
91
64
|
const currentStatus = String(session.status || "")
|
|
92
65
|
if (currentStatus !== "authorized") {
|
|
@@ -96,8 +69,10 @@ export async function POST(req: MedusaRequest, res: MedusaResponse) {
|
|
|
96
69
|
`[paypal] paypal-complete authorizePaymentSession succeeded (request_id=${requestId}, session_id=${session.id})`
|
|
97
70
|
)
|
|
98
71
|
} catch (e: any) {
|
|
72
|
+
// Authorization is the gate for completion; if it fails, the
|
|
73
|
+
// completeCartWorkflow below fails too and we report that honestly.
|
|
99
74
|
logger.warn(
|
|
100
|
-
`[paypal] paypal-complete authorizePaymentSession
|
|
75
|
+
`[paypal] paypal-complete authorizePaymentSession failed (request_id=${requestId}, session_id=${session.id}): ${
|
|
101
76
|
e?.message ?? String(e)
|
|
102
77
|
}`
|
|
103
78
|
)
|
|
@@ -113,12 +88,31 @@ export async function POST(req: MedusaRequest, res: MedusaResponse) {
|
|
|
113
88
|
)
|
|
114
89
|
return res.json({ success: true, cart_id, order_id: result?.id, request_id: requestId })
|
|
115
90
|
} catch (e: any) {
|
|
116
|
-
|
|
91
|
+
// The cart may have been completed by a concurrent request between our
|
|
92
|
+
// initial check and now — treat that as success, not an error.
|
|
93
|
+
const recheck = await query
|
|
94
|
+
.graph({ entity: "cart", fields: ["id", "completed_at"], filters: { id: cart_id } })
|
|
95
|
+
.catch(() => ({ data: [] as any[] }))
|
|
96
|
+
if (recheck?.data?.[0]?.completed_at) {
|
|
97
|
+
return res.json({ success: true, cart_id, already_completed: true, request_id: requestId })
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
logger.error(
|
|
117
101
|
`[paypal] paypal-complete completeCartWorkflow failed (request_id=${requestId}, cart_id=${cart_id}): ${
|
|
118
102
|
e?.message ?? String(e)
|
|
119
|
-
}
|
|
103
|
+
}`,
|
|
104
|
+
e instanceof Error ? e : undefined
|
|
120
105
|
)
|
|
121
|
-
|
|
106
|
+
// The payment may have been captured at PayPal but the order was not
|
|
107
|
+
// finalized. Report failure (not a false success) so the storefront can
|
|
108
|
+
// surface a "payment taken, contact support" state.
|
|
109
|
+
return res.status(500).json({
|
|
110
|
+
success: false,
|
|
111
|
+
cart_id,
|
|
112
|
+
session_id: session.id,
|
|
113
|
+
message: "Payment was processed but the order could not be finalized.",
|
|
114
|
+
request_id: requestId,
|
|
115
|
+
})
|
|
122
116
|
}
|
|
123
117
|
} catch (e: any) {
|
|
124
118
|
logger.error(
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { MedusaContainer } from "@medusajs/framework/types"
|
|
2
|
+
import { ContainerRegistrationKeys } from "@medusajs/framework/utils"
|
|
2
3
|
import type PayPalModuleService from "../modules/paypal/service"
|
|
3
4
|
import {
|
|
4
5
|
computeNextRetryAt,
|
|
@@ -8,11 +9,60 @@ import {
|
|
|
8
9
|
processPayPalWebhookEvent,
|
|
9
10
|
} from "../modules/paypal/webhook-processor"
|
|
10
11
|
|
|
12
|
+
// Bound how many failed events one run drains so the cron can't load an
|
|
13
|
+
// unbounded backlog into memory.
|
|
14
|
+
const RETRY_BATCH_SIZE = 100
|
|
15
|
+
|
|
16
|
+
// Stable key for the Postgres advisory lock that serializes this cron across
|
|
17
|
+
// instances. pg_try_advisory_xact_lock auto-releases at transaction end, so
|
|
18
|
+
// there is no unlock to pair (and no risk of a leaked lock).
|
|
19
|
+
const RETRY_ADVISORY_LOCK_KEY = 838907812
|
|
20
|
+
|
|
11
21
|
export default async function paypalWebhookRetry(container: MedusaContainer) {
|
|
22
|
+
// Run the sweep under a Postgres advisory lock so that with multiple server
|
|
23
|
+
// instances running this cron, only one drains the queue per cycle (each
|
|
24
|
+
// event is processed at most once). Falls back to running directly if the
|
|
25
|
+
// raw connection isn't resolvable, so the job degrades gracefully rather
|
|
26
|
+
// than breaking.
|
|
27
|
+
let pg: any = null
|
|
28
|
+
try {
|
|
29
|
+
pg = container.resolve(ContainerRegistrationKeys.PG_CONNECTION)
|
|
30
|
+
} catch {
|
|
31
|
+
pg = null
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
if (!pg?.transaction) {
|
|
35
|
+
await runRetrySweep(container)
|
|
36
|
+
return
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
try {
|
|
40
|
+
await pg.transaction(async (trx: any) => {
|
|
41
|
+
const res = await trx.raw(
|
|
42
|
+
"SELECT pg_try_advisory_xact_lock(?) AS locked",
|
|
43
|
+
[RETRY_ADVISORY_LOCK_KEY]
|
|
44
|
+
)
|
|
45
|
+
const locked = res?.rows?.[0]?.locked ?? res?.[0]?.locked ?? false
|
|
46
|
+
if (!locked) {
|
|
47
|
+
console.info("[PayPal] webhook-retry: another instance holds the lock, skipping")
|
|
48
|
+
return
|
|
49
|
+
}
|
|
50
|
+
await runRetrySweep(container)
|
|
51
|
+
})
|
|
52
|
+
} catch (e: any) {
|
|
53
|
+
console.warn("[PayPal] webhook-retry: advisory lock path failed, running unlocked:", e?.message)
|
|
54
|
+
await runRetrySweep(container)
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
async function runRetrySweep(container: MedusaContainer) {
|
|
12
59
|
const paypal = container.resolve<PayPalModuleService>("paypal_onboarding")
|
|
13
60
|
const now = Date.now()
|
|
14
61
|
|
|
15
|
-
const candidates = await paypal.listPayPalWebhookEvents(
|
|
62
|
+
const candidates = await paypal.listPayPalWebhookEvents(
|
|
63
|
+
{ status: "failed" },
|
|
64
|
+
{ take: RETRY_BATCH_SIZE, order: { next_retry_at: "ASC" } }
|
|
65
|
+
)
|
|
16
66
|
if (!candidates?.length) return
|
|
17
67
|
|
|
18
68
|
console.info(
|