Medusa v2 Payment Processing
Before writing code
Fetch live docs:
- Web-search
site:docs.medusajs.com payment modulefor payment data model and service methods - Web-search
site:docs.medusajs.com payment providerfor the provider abstraction layer - Web-search
site:docs.medusajs.com stripe paymentfor Stripe integration setup - Fetch
https://docs.medusajs.com/resources/references/paymentand review theIPaymentModuleServiceinterface - Web-search
medusajs v2 AbstractPaymentProvider 2026for latest provider interface
Payment Module Architecture
Entity Relationships
| Entity | Contains | Key Fields | |--------|----------|------------| | PaymentCollection | Sessions, Payments | status, amount, currency_code | | PaymentSession | Provider data | provider_id, status, amount, data (JSON) | | Payment | Captures, Refunds | provider_id, amount, captured_at |
Module Links
Cart Module ──link──> Payment Module (payment collection)
Order Module ──link──> Payment Module (payment collection)
Region Module ──link──> Payment Module (available providers)
Fetch live docs for exact link definitions and how payment collections bridge carts and orders.
Payment Lifecycle
PaymentSession Statuses
| Status | Meaning | |--------|---------| | pending | Session initialized, awaiting customer action | | requires_more | Additional steps needed (e.g., 3DS) | | authorized | Payment authorized, funds reserved | | canceled | Payment voided/canceled | | error | Payment failed |
Payment Statuses
After authorization, a Payment entity is created from the session:
| Status | Meaning | |--------|---------| | captured | Funds captured to merchant | | partially_refunded | Partial refund issued | | refunded | Full refund issued |
Payment Provider Abstraction
All payment providers extend AbstractPaymentProvider:
// Skeleton: custom payment provider
// Fetch live docs for AbstractPaymentProvider interface
class MyPaymentProvider extends AbstractPaymentProvider {
// Implement: initiatePayment, authorizePayment,
// capturePayment, refundPayment, cancelPayment
// Fetch live docs for exact method signatures
}
Key Provider Methods
| Method | Purpose | |--------|---------| | initiatePayment | Create payment session with provider | | authorizePayment | Authorize payment (reserve funds) | | capturePayment | Capture authorized payment | | refundPayment | Refund captured payment | | cancelPayment | Cancel/void payment | | deletePayment | Clean up provider-side session | | getPaymentStatus | Query current status from provider | | updatePayment | Update an existing payment session | | retrievePayment | Retrieve payment data from provider | | getWebhookActionAndData | Parse incoming webhook events |
Fetch live docs for the full method list — the provider interface has additional methods beyond those listed above (e.g.,createAccountHolder,listPaymentMethods,savePaymentMethod). Always verify the currentAbstractPaymentProviderinterface.
Stripe Integration
| Configuration | Description | |---------------|-------------| | apiKey | Stripe secret key | | webhookSecret | Stripe webhook signing secret | | capture | Auto-capture or manual (true/false) |
Stripe Webhook Events
| Event | Medusa Action | |-------|---------------| | payment_intent.succeeded | Mark session authorized/captured | | payment_intent.payment_failed | Mark session errored | | charge.refunded | Mark refund completed |
Fetch live docs for Stripe provider configuration options and webhook endpoint setup.
PayPal Integration
| Configuration | Description | |---------------|-------------| | clientId | PayPal client ID | | clientSecret | PayPal client secret | | sandbox | Use sandbox environment (true/false) |
Fetch live docs for PayPal provider options, redirect handling, and webhook configuration.
Payment Workflows
| Workflow | Purpose | |----------|---------| | createPaymentCollectionForCartWorkflow | Create collection linked to cart | | initializePaymentSessionWorkflow | Start session with specific provider | | authorizePaymentSessionWorkflow | Authorize a pending session | | capturePaymentWorkflow | Capture an authorized payment | | refundPaymentWorkflow | Refund a captured payment | | cancelPaymentWorkflow | Cancel/void a payment |
Key Service Methods
| Operation | Method | |-----------|--------| | Create collection | paymentModuleService.createPaymentCollections() | | Create session | paymentModuleService.createPaymentSession() | | Authorize session | paymentModuleService.authorizePaymentSession() | | Capture payment | paymentModuleService.capturePayment() | | Refund payment | paymentModuleService.refundPayment() |
Fetch live docs for workflow input shapes and provider-specific data requirements.
Admin API Routes
| Route Pattern | Method | Purpose | |---------------|--------|---------| | /admin/payments | GET | List payments | | /admin/payments/:id | GET | Retrieve payment | | /admin/payments/:id/capture | POST | Capture payment | | /admin/payments/:id/refund | POST | Refund payment |
Best Practices
Provider Implementation
- Always extend
AbstractPaymentProvider— do not implement from scratch - Store provider-specific data in the session
datafield (not in metadata) - Handle
requires_morestatus for providers with multi-step flows (3DS, redirect) - Implement idempotent operations — captures and refunds may be retried
Webhook Handling
- Validate webhook signatures before processing events
- Use idempotency keys to prevent duplicate payment processing
- Log all webhook events for audit trails and debugging
- Handle out-of-order webhook delivery gracefully
Security
- Never store raw API keys in code — use environment variables
- Never expose payment session secrets to the client
- Use HTTPS-only webhook endpoints
- Implement amount validation — verify captured amount matches the order total
Testing
- Use provider sandbox/test modes during development
- Test the full lifecycle: initiate -> authorize -> capture -> refund
- Test error scenarios: declined cards, insufficient funds, network timeouts
Fetch the Medusa v2 payment module documentation and provider interface references for exact method signatures, webhook configuration, and provider registration patterns before implementing.