@easypayment/medusa-paypal 0.4.7 → 0.4.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/.medusa/server/src/admin/index.js +7 -7
  2. package/.medusa/server/src/admin/index.mjs +7 -7
  3. package/.medusa/server/src/api/store/paypal/create-order/route.d.ts.map +1 -1
  4. package/.medusa/server/src/api/store/paypal/create-order/route.js +62 -139
  5. package/.medusa/server/src/api/store/paypal/create-order/route.js.map +1 -1
  6. package/.medusa/server/src/modules/paypal/migrations/20260115120000_create_paypal_connection.js +22 -22
  7. package/.medusa/server/src/modules/paypal/migrations/20260123090000_create_paypal_settings.js +11 -11
  8. package/.medusa/server/src/modules/paypal/migrations/20260201090000_create_paypal_webhook_event.js +18 -18
  9. package/.medusa/server/src/modules/paypal/migrations/20260401090000_create_paypal_metric.js +16 -16
  10. package/.medusa/server/src/modules/paypal/migrations/20260701090000_add_paypal_webhook_event_processing.js +20 -20
  11. package/.medusa/server/src/modules/paypal/migrations/20261101090000_remove_paypal_reconciliation_status.js +14 -14
  12. package/.medusa/server/src/modules/paypal/migrations/20261201090000_remove_paypal_audit_log.js +15 -15
  13. package/README.md +142 -142
  14. package/package.json +75 -75
  15. package/src/admin/index.ts +7 -7
  16. package/src/admin/routes/settings/paypal/_components/Tabs.tsx +52 -52
  17. package/src/admin/routes/settings/paypal/_components/Toast.tsx +51 -51
  18. package/src/admin/routes/settings/paypal/additional-settings/page.tsx +200 -200
  19. package/src/admin/routes/settings/paypal/advanced-card-payments/page.tsx +183 -183
  20. package/src/admin/routes/settings/paypal/apple-pay/page.tsx +5 -5
  21. package/src/admin/routes/settings/paypal/connection/page.tsx +754 -754
  22. package/src/admin/routes/settings/paypal/google-pay/page.tsx +5 -5
  23. package/src/admin/routes/settings/paypal/pay-later-messaging/page.tsx +5 -5
  24. package/src/admin/routes/settings/paypal/paypal-settings/page.tsx +376 -376
  25. package/src/api/admin/payment-collections/[id]/payment-sessions/route.ts +24 -24
  26. package/src/api/admin/paypal/disconnect/route.ts +8 -8
  27. package/src/api/admin/paypal/environment/route.ts +25 -25
  28. package/src/api/admin/paypal/onboard-complete/route.ts +44 -44
  29. package/src/api/admin/paypal/onboarding-link/route.ts +45 -45
  30. package/src/api/admin/paypal/onboarding-status/route.ts +18 -18
  31. package/src/api/admin/paypal/rotate-credentials/route.ts +8 -8
  32. package/src/api/admin/paypal/save-credentials/route.ts +14 -14
  33. package/src/api/admin/paypal/settings/route.ts +14 -14
  34. package/src/api/admin/paypal/status/route.ts +12 -12
  35. package/src/api/store/payment-collections/[id]/payment-sessions/route.ts +65 -65
  36. package/src/api/store/paypal/capture-order/route.ts +276 -276
  37. package/src/api/store/paypal/config/route.ts +102 -102
  38. package/src/api/store/paypal/create-order/route.ts +77 -176
  39. package/src/api/store/paypal/settings/route.ts +19 -19
  40. package/src/api/store/paypal/webhook/route.ts +246 -246
  41. package/src/api/store/paypal-complete/route.ts +75 -75
  42. package/src/jobs/paypal-reconcile.ts +112 -112
  43. package/src/jobs/paypal-webhook-retry.ts +85 -85
  44. package/src/modules/paypal/clients/paypal-seller.client.ts +59 -59
  45. package/src/modules/paypal/index.ts +8 -8
  46. package/src/modules/paypal/migrations/20260115120000_create_paypal_connection.ts +33 -33
  47. package/src/modules/paypal/migrations/20260123090000_create_paypal_settings.ts +22 -22
  48. package/src/modules/paypal/migrations/20260201090000_create_paypal_webhook_event.ts +29 -29
  49. package/src/modules/paypal/migrations/20260401090000_create_paypal_metric.ts +27 -27
  50. package/src/modules/paypal/migrations/20260701090000_add_paypal_webhook_event_processing.ts +31 -31
  51. package/src/modules/paypal/migrations/20261101090000_remove_paypal_reconciliation_status.ts +25 -25
  52. package/src/modules/paypal/migrations/20261201090000_remove_paypal_audit_log.ts +26 -26
  53. package/src/modules/paypal/migrations/20270101090000_set_paypal_environment_default_live.ts +11 -11
  54. package/src/modules/paypal/models/paypal_connection.ts +21 -21
  55. package/src/modules/paypal/models/paypal_metric.ts +9 -9
  56. package/src/modules/paypal/models/paypal_settings.ts +8 -8
  57. package/src/modules/paypal/models/paypal_webhook_event.ts +19 -19
  58. package/src/modules/paypal/payment-provider/README.md +22 -22
  59. package/src/modules/paypal/payment-provider/card-service.ts +760 -760
  60. package/src/modules/paypal/payment-provider/index.ts +19 -19
  61. package/src/modules/paypal/payment-provider/service.ts +1121 -1121
  62. package/src/modules/paypal/payment-provider/webhook-utils.ts +88 -88
  63. package/src/modules/paypal/service.ts +1247 -1247
  64. package/src/modules/paypal/types/config.ts +47 -47
  65. package/src/modules/paypal/utils/amounts.ts +41 -41
  66. package/src/modules/paypal/utils/crypto.ts +51 -51
  67. package/src/modules/paypal/utils/currencies.ts +84 -84
  68. package/src/modules/paypal/utils/paypal-auth.ts +32 -32
  69. package/src/modules/paypal/utils/provider-ids.ts +15 -15
  70. package/src/modules/paypal/webhook-processor.ts +215 -215
@@ -1,29 +1,29 @@
1
- import { Migration } from "@medusajs/framework/mikro-orm/migrations"
2
-
3
- export class Migration20260201090000 extends Migration {
4
- async up(): Promise<void> {
5
- this.addSql(`
6
- CREATE TABLE IF NOT EXISTS "paypal_webhook_event" (
7
- "id" text NOT NULL,
8
- "event_id" text NOT NULL,
9
- "event_type" text NOT NULL,
10
- "resource_id" text NULL,
11
- "payload" jsonb NOT NULL DEFAULT '{}'::jsonb,
12
- "created_at" timestamptz NOT NULL DEFAULT now(),
13
- "updated_at" timestamptz NOT NULL DEFAULT now(),
14
- "deleted_at" timestamptz NULL,
15
- CONSTRAINT "paypal_webhook_event_pkey" PRIMARY KEY ("id"),
16
- CONSTRAINT "paypal_webhook_event_event_id_unique" UNIQUE ("event_id")
17
- );
18
-
19
- CREATE INDEX IF NOT EXISTS "idx_paypal_webhook_event_deleted_at"
20
- ON "paypal_webhook_event" ("deleted_at");
21
- `)
22
- }
23
-
24
- async down(): Promise<void> {
25
- this.addSql(`
26
- DROP TABLE IF EXISTS "paypal_webhook_event" CASCADE;
27
- `)
28
- }
29
- }
1
+ import { Migration } from "@medusajs/framework/mikro-orm/migrations"
2
+
3
+ export class Migration20260201090000 extends Migration {
4
+ async up(): Promise<void> {
5
+ this.addSql(`
6
+ CREATE TABLE IF NOT EXISTS "paypal_webhook_event" (
7
+ "id" text NOT NULL,
8
+ "event_id" text NOT NULL,
9
+ "event_type" text NOT NULL,
10
+ "resource_id" text NULL,
11
+ "payload" jsonb NOT NULL DEFAULT '{}'::jsonb,
12
+ "created_at" timestamptz NOT NULL DEFAULT now(),
13
+ "updated_at" timestamptz NOT NULL DEFAULT now(),
14
+ "deleted_at" timestamptz NULL,
15
+ CONSTRAINT "paypal_webhook_event_pkey" PRIMARY KEY ("id"),
16
+ CONSTRAINT "paypal_webhook_event_event_id_unique" UNIQUE ("event_id")
17
+ );
18
+
19
+ CREATE INDEX IF NOT EXISTS "idx_paypal_webhook_event_deleted_at"
20
+ ON "paypal_webhook_event" ("deleted_at");
21
+ `)
22
+ }
23
+
24
+ async down(): Promise<void> {
25
+ this.addSql(`
26
+ DROP TABLE IF EXISTS "paypal_webhook_event" CASCADE;
27
+ `)
28
+ }
29
+ }
@@ -1,27 +1,27 @@
1
- import { Migration } from "@medusajs/framework/mikro-orm/migrations"
2
-
3
- export class Migration20260401090000 extends Migration {
4
- async up(): Promise<void> {
5
- this.addSql(`
6
- CREATE TABLE IF NOT EXISTS "paypal_metric" (
7
- "id" text NOT NULL,
8
- "name" text NOT NULL,
9
- "data" jsonb NOT NULL DEFAULT '{}'::jsonb,
10
- "created_at" timestamptz NOT NULL DEFAULT now(),
11
- "updated_at" timestamptz NOT NULL DEFAULT now(),
12
- "deleted_at" timestamptz NULL,
13
- CONSTRAINT "paypal_metric_pkey" PRIMARY KEY ("id"),
14
- CONSTRAINT "paypal_metric_name_unique" UNIQUE ("name")
15
- );
16
-
17
- CREATE INDEX IF NOT EXISTS "idx_paypal_metric_deleted_at"
18
- ON "paypal_metric" ("deleted_at");
19
- `)
20
- }
21
-
22
- async down(): Promise<void> {
23
- this.addSql(`
24
- DROP TABLE IF EXISTS "paypal_metric" CASCADE;
25
- `)
26
- }
27
- }
1
+ import { Migration } from "@medusajs/framework/mikro-orm/migrations"
2
+
3
+ export class Migration20260401090000 extends Migration {
4
+ async up(): Promise<void> {
5
+ this.addSql(`
6
+ CREATE TABLE IF NOT EXISTS "paypal_metric" (
7
+ "id" text NOT NULL,
8
+ "name" text NOT NULL,
9
+ "data" jsonb NOT NULL DEFAULT '{}'::jsonb,
10
+ "created_at" timestamptz NOT NULL DEFAULT now(),
11
+ "updated_at" timestamptz NOT NULL DEFAULT now(),
12
+ "deleted_at" timestamptz NULL,
13
+ CONSTRAINT "paypal_metric_pkey" PRIMARY KEY ("id"),
14
+ CONSTRAINT "paypal_metric_name_unique" UNIQUE ("name")
15
+ );
16
+
17
+ CREATE INDEX IF NOT EXISTS "idx_paypal_metric_deleted_at"
18
+ ON "paypal_metric" ("deleted_at");
19
+ `)
20
+ }
21
+
22
+ async down(): Promise<void> {
23
+ this.addSql(`
24
+ DROP TABLE IF EXISTS "paypal_metric" CASCADE;
25
+ `)
26
+ }
27
+ }
@@ -1,31 +1,31 @@
1
- import { Migration } from "@medusajs/framework/mikro-orm/migrations"
2
-
3
- export class Migration20260701090000 extends Migration {
4
- async up(): Promise<void> {
5
- this.addSql(`
6
- ALTER TABLE "paypal_webhook_event"
7
- ADD COLUMN IF NOT EXISTS "event_version" text NULL,
8
- ADD COLUMN IF NOT EXISTS "transmission_id" text NULL,
9
- ADD COLUMN IF NOT EXISTS "transmission_time" timestamptz NULL,
10
- ADD COLUMN IF NOT EXISTS "status" text NOT NULL DEFAULT 'pending',
11
- ADD COLUMN IF NOT EXISTS "attempt_count" integer NOT NULL DEFAULT 0,
12
- ADD COLUMN IF NOT EXISTS "next_retry_at" timestamptz NULL,
13
- ADD COLUMN IF NOT EXISTS "processed_at" timestamptz NULL,
14
- ADD COLUMN IF NOT EXISTS "last_error" text NULL;
15
- `)
16
- }
17
-
18
- async down(): Promise<void> {
19
- this.addSql(`
20
- ALTER TABLE "paypal_webhook_event"
21
- DROP COLUMN IF EXISTS "event_version",
22
- DROP COLUMN IF EXISTS "transmission_id",
23
- DROP COLUMN IF EXISTS "transmission_time",
24
- DROP COLUMN IF EXISTS "status",
25
- DROP COLUMN IF EXISTS "attempt_count",
26
- DROP COLUMN IF EXISTS "next_retry_at",
27
- DROP COLUMN IF EXISTS "processed_at",
28
- DROP COLUMN IF EXISTS "last_error";
29
- `)
30
- }
31
- }
1
+ import { Migration } from "@medusajs/framework/mikro-orm/migrations"
2
+
3
+ export class Migration20260701090000 extends Migration {
4
+ async up(): Promise<void> {
5
+ this.addSql(`
6
+ ALTER TABLE "paypal_webhook_event"
7
+ ADD COLUMN IF NOT EXISTS "event_version" text NULL,
8
+ ADD COLUMN IF NOT EXISTS "transmission_id" text NULL,
9
+ ADD COLUMN IF NOT EXISTS "transmission_time" timestamptz NULL,
10
+ ADD COLUMN IF NOT EXISTS "status" text NOT NULL DEFAULT 'pending',
11
+ ADD COLUMN IF NOT EXISTS "attempt_count" integer NOT NULL DEFAULT 0,
12
+ ADD COLUMN IF NOT EXISTS "next_retry_at" timestamptz NULL,
13
+ ADD COLUMN IF NOT EXISTS "processed_at" timestamptz NULL,
14
+ ADD COLUMN IF NOT EXISTS "last_error" text NULL;
15
+ `)
16
+ }
17
+
18
+ async down(): Promise<void> {
19
+ this.addSql(`
20
+ ALTER TABLE "paypal_webhook_event"
21
+ DROP COLUMN IF EXISTS "event_version",
22
+ DROP COLUMN IF EXISTS "transmission_id",
23
+ DROP COLUMN IF EXISTS "transmission_time",
24
+ DROP COLUMN IF EXISTS "status",
25
+ DROP COLUMN IF EXISTS "attempt_count",
26
+ DROP COLUMN IF EXISTS "next_retry_at",
27
+ DROP COLUMN IF EXISTS "processed_at",
28
+ DROP COLUMN IF EXISTS "last_error";
29
+ `)
30
+ }
31
+ }
@@ -1,25 +1,25 @@
1
- import { Migration } from "@medusajs/framework/mikro-orm/migrations"
2
-
3
- export class Migration20261101090000 extends Migration {
4
- async up(): Promise<void> {
5
- this.addSql(`
6
- DELETE FROM "paypal_metric"
7
- WHERE "name" = 'reconcile_status';
8
-
9
- DROP TABLE IF EXISTS "paypal_reconciliation_status" CASCADE;
10
- `)
11
- }
12
-
13
- async down(): Promise<void> {
14
- this.addSql(`
15
- CREATE TABLE IF NOT EXISTS "paypal_reconciliation_status" (
16
- "id" text NOT NULL,
17
- "status" text NOT NULL,
18
- "data" jsonb NOT NULL DEFAULT '{}'::jsonb,
19
- "created_at" timestamptz NOT NULL DEFAULT now(),
20
- "updated_at" timestamptz NOT NULL DEFAULT now(),
21
- CONSTRAINT "paypal_reconciliation_status_pkey" PRIMARY KEY ("id")
22
- );
23
- `)
24
- }
25
- }
1
+ import { Migration } from "@medusajs/framework/mikro-orm/migrations"
2
+
3
+ export class Migration20261101090000 extends Migration {
4
+ async up(): Promise<void> {
5
+ this.addSql(`
6
+ DELETE FROM "paypal_metric"
7
+ WHERE "name" = 'reconcile_status';
8
+
9
+ DROP TABLE IF EXISTS "paypal_reconciliation_status" CASCADE;
10
+ `)
11
+ }
12
+
13
+ async down(): Promise<void> {
14
+ this.addSql(`
15
+ CREATE TABLE IF NOT EXISTS "paypal_reconciliation_status" (
16
+ "id" text NOT NULL,
17
+ "status" text NOT NULL,
18
+ "data" jsonb NOT NULL DEFAULT '{}'::jsonb,
19
+ "created_at" timestamptz NOT NULL DEFAULT now(),
20
+ "updated_at" timestamptz NOT NULL DEFAULT now(),
21
+ CONSTRAINT "paypal_reconciliation_status_pkey" PRIMARY KEY ("id")
22
+ );
23
+ `)
24
+ }
25
+ }
@@ -1,26 +1,26 @@
1
- import { Migration } from "@medusajs/framework/mikro-orm/migrations"
2
-
3
- export class Migration20261201090000 extends Migration {
4
- async up(): Promise<void> {
5
- this.addSql(`
6
- DROP TABLE IF EXISTS "paypal_audit_log" CASCADE;
7
- `)
8
- }
9
-
10
- async down(): Promise<void> {
11
- this.addSql(`
12
- CREATE TABLE IF NOT EXISTS "paypal_audit_log" (
13
- "id" text NOT NULL,
14
- "event_type" text NOT NULL,
15
- "metadata" jsonb NULL,
16
- "created_at" timestamptz NOT NULL DEFAULT now(),
17
- "updated_at" timestamptz NOT NULL DEFAULT now(),
18
- "deleted_at" timestamptz NULL,
19
- CONSTRAINT "paypal_audit_log_pkey" PRIMARY KEY ("id")
20
- );
21
-
22
- CREATE INDEX IF NOT EXISTS "idx_paypal_audit_log_deleted_at"
23
- ON "paypal_audit_log" ("deleted_at");
24
- `)
25
- }
26
- }
1
+ import { Migration } from "@medusajs/framework/mikro-orm/migrations"
2
+
3
+ export class Migration20261201090000 extends Migration {
4
+ async up(): Promise<void> {
5
+ this.addSql(`
6
+ DROP TABLE IF EXISTS "paypal_audit_log" CASCADE;
7
+ `)
8
+ }
9
+
10
+ async down(): Promise<void> {
11
+ this.addSql(`
12
+ CREATE TABLE IF NOT EXISTS "paypal_audit_log" (
13
+ "id" text NOT NULL,
14
+ "event_type" text NOT NULL,
15
+ "metadata" jsonb NULL,
16
+ "created_at" timestamptz NOT NULL DEFAULT now(),
17
+ "updated_at" timestamptz NOT NULL DEFAULT now(),
18
+ "deleted_at" timestamptz NULL,
19
+ CONSTRAINT "paypal_audit_log_pkey" PRIMARY KEY ("id")
20
+ );
21
+
22
+ CREATE INDEX IF NOT EXISTS "idx_paypal_audit_log_deleted_at"
23
+ ON "paypal_audit_log" ("deleted_at");
24
+ `)
25
+ }
26
+ }
@@ -1,11 +1,11 @@
1
- import { Migration } from "@mikro-orm/migrations"
2
-
3
- export class Migration20270101090000 extends Migration {
4
- override async up(): Promise<void> {
5
- this.addSql(`alter table if exists "paypal_connection" alter column "environment" set default 'live';`)
6
- }
7
-
8
- override async down(): Promise<void> {
9
- this.addSql(`alter table if exists "paypal_connection" alter column "environment" set default 'sandbox';`)
10
- }
11
- }
1
+ import { Migration } from "@mikro-orm/migrations"
2
+
3
+ export class Migration20270101090000 extends Migration {
4
+ override async up(): Promise<void> {
5
+ this.addSql(`alter table if exists "paypal_connection" alter column "environment" set default 'live';`)
6
+ }
7
+
8
+ override async down(): Promise<void> {
9
+ this.addSql(`alter table if exists "paypal_connection" alter column "environment" set default 'sandbox';`)
10
+ }
11
+ }
@@ -1,21 +1,21 @@
1
- import { model } from "@medusajs/framework/utils"
2
-
3
- const PayPalConnection = model.define("paypal_connection", {
4
- id: model.id().primaryKey(),
5
-
6
- environment: model.text(), // sandbox|live
7
- status: model.text(), // disconnected|pending|pending_credentials|connected|revoked
8
-
9
- shared_id: model.text().nullable(),
10
- auth_code: model.text().nullable(),
11
-
12
- seller_client_id: model.text().nullable(),
13
- seller_client_secret: model.text().nullable(),
14
-
15
- app_access_token: model.text().nullable(),
16
- app_access_token_expires_at: model.dateTime().nullable(),
17
-
18
- metadata: model.json().nullable(),
19
- })
20
-
21
- export default PayPalConnection
1
+ import { model } from "@medusajs/framework/utils"
2
+
3
+ const PayPalConnection = model.define("paypal_connection", {
4
+ id: model.id().primaryKey(),
5
+
6
+ environment: model.text(), // sandbox|live
7
+ status: model.text(), // disconnected|pending|pending_credentials|connected|revoked
8
+
9
+ shared_id: model.text().nullable(),
10
+ auth_code: model.text().nullable(),
11
+
12
+ seller_client_id: model.text().nullable(),
13
+ seller_client_secret: model.text().nullable(),
14
+
15
+ app_access_token: model.text().nullable(),
16
+ app_access_token_expires_at: model.dateTime().nullable(),
17
+
18
+ metadata: model.json().nullable(),
19
+ })
20
+
21
+ export default PayPalConnection
@@ -1,9 +1,9 @@
1
- import { model } from "@medusajs/framework/utils"
2
-
3
- const PayPalMetric = model.define("paypal_metric", {
4
- id: model.id().primaryKey(),
5
- name: model.text().unique(),
6
- data: model.json().nullable(),
7
- })
8
-
9
- export default PayPalMetric
1
+ import { model } from "@medusajs/framework/utils"
2
+
3
+ const PayPalMetric = model.define("paypal_metric", {
4
+ id: model.id().primaryKey(),
5
+ name: model.text().unique(),
6
+ data: model.json().nullable(),
7
+ })
8
+
9
+ export default PayPalMetric
@@ -1,8 +1,8 @@
1
- import { model } from "@medusajs/framework/utils"
2
-
3
- const PayPalSettings = model.define("paypal_settings", {
4
- id: model.id().primaryKey(),
5
- data: model.json().nullable(),
6
- })
7
-
8
- export default PayPalSettings
1
+ import { model } from "@medusajs/framework/utils"
2
+
3
+ const PayPalSettings = model.define("paypal_settings", {
4
+ id: model.id().primaryKey(),
5
+ data: model.json().nullable(),
6
+ })
7
+
8
+ export default PayPalSettings
@@ -1,19 +1,19 @@
1
- import { model } from "@medusajs/framework/utils"
2
-
3
- const PayPalWebhookEvent = model.define("paypal_webhook_event", {
4
- id: model.id().primaryKey(),
5
- event_id: model.text().unique(),
6
- event_type: model.text(),
7
- event_version: model.text().nullable(),
8
- transmission_id: model.text().nullable(),
9
- transmission_time: model.dateTime().nullable(),
10
- status: model.text().default("pending"),
11
- attempt_count: model.number().default(0),
12
- next_retry_at: model.dateTime().nullable(),
13
- processed_at: model.dateTime().nullable(),
14
- last_error: model.text().nullable(),
15
- resource_id: model.text().nullable(),
16
- payload: model.json().nullable(),
17
- })
18
-
19
- export default PayPalWebhookEvent
1
+ import { model } from "@medusajs/framework/utils"
2
+
3
+ const PayPalWebhookEvent = model.define("paypal_webhook_event", {
4
+ id: model.id().primaryKey(),
5
+ event_id: model.text().unique(),
6
+ event_type: model.text(),
7
+ event_version: model.text().nullable(),
8
+ transmission_id: model.text().nullable(),
9
+ transmission_time: model.dateTime().nullable(),
10
+ status: model.text().default("pending"),
11
+ attempt_count: model.number().default(0),
12
+ next_retry_at: model.dateTime().nullable(),
13
+ processed_at: model.dateTime().nullable(),
14
+ last_error: model.text().nullable(),
15
+ resource_id: model.text().nullable(),
16
+ payload: model.json().nullable(),
17
+ })
18
+
19
+ export default PayPalWebhookEvent
@@ -1,22 +1,22 @@
1
- # PayPal Payment Provider (Checkout)
2
-
3
- This folder adds a **Payment Module Provider** so PayPal can appear in checkout.
4
-
5
- Register it in `medusa-config.ts` under the Payment module:
6
-
7
- ```ts
8
- {
9
- resolve: "@medusajs/medusa/payment",
10
- options: {
11
- providers: [
12
- {
13
- resolve: "./src/modules/paypal/payment-provider",
14
- id: "paypal",
15
- options: {},
16
- },
17
- ],
18
- },
19
- }
20
- ```
21
-
22
- Then enable PayPal in Admin -> Regions -> Payment Providers (use `paypal`).
1
+ # PayPal Payment Provider (Checkout)
2
+
3
+ This folder adds a **Payment Module Provider** so PayPal can appear in checkout.
4
+
5
+ Register it in `medusa-config.ts` under the Payment module:
6
+
7
+ ```ts
8
+ {
9
+ resolve: "@medusajs/medusa/payment",
10
+ options: {
11
+ providers: [
12
+ {
13
+ resolve: "./src/modules/paypal/payment-provider",
14
+ id: "paypal",
15
+ options: {},
16
+ },
17
+ ],
18
+ },
19
+ }
20
+ ```
21
+
22
+ Then enable PayPal in Admin -> Regions -> Payment Providers (use `paypal`).