@open-mercato/gateway-stripe 0.6.6 → 0.6.7-develop.6553.1.2ec7246e04
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/modules/gateway_stripe/lib/adapters/v2023-10-16.js +1 -1
- package/dist/modules/gateway_stripe/lib/adapters/v2023-10-16.js.map +2 -2
- package/dist/modules/gateway_stripe/lib/adapters/v2024-12-18.js +1 -1
- package/dist/modules/gateway_stripe/lib/adapters/v2024-12-18.js.map +2 -2
- package/dist/modules/gateway_stripe/lib/adapters/v2025-02-24.acacia.js +1 -1
- package/dist/modules/gateway_stripe/lib/adapters/v2025-02-24.acacia.js.map +2 -2
- package/package.json +8 -7
- package/src/modules/gateway_stripe/__tests__/adapter-idempotency.test.ts +42 -0
- package/src/modules/gateway_stripe/lib/adapters/v2023-10-16.ts +1 -1
- package/src/modules/gateway_stripe/lib/adapters/v2024-12-18.ts +1 -1
- package/src/modules/gateway_stripe/lib/adapters/v2025-02-24.acacia.ts +1 -1
|
@@ -26,7 +26,7 @@ const stripeAdapterV20231016 = {
|
|
|
26
26
|
}),
|
|
27
27
|
payment_method_types: input.paymentTypes ?? ["card"],
|
|
28
28
|
description: input.description
|
|
29
|
-
});
|
|
29
|
+
}, input.idempotencyKey ? { idempotencyKey: input.idempotencyKey } : void 0);
|
|
30
30
|
return {
|
|
31
31
|
sessionId: paymentIntent.id,
|
|
32
32
|
clientSecret: paymentIntent.client_secret ?? void 0,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/modules/gateway_stripe/lib/adapters/v2023-10-16.ts"],
|
|
4
|
-
"sourcesContent": ["import type {\n GatewayAdapter,\n CreateSessionInput,\n CreateSessionResult,\n CaptureInput,\n CaptureResult,\n RefundInput,\n RefundResult,\n CancelInput,\n CancelResult,\n GetStatusInput,\n GatewayPaymentStatus,\n VerifyWebhookInput,\n WebhookEvent,\n UnifiedPaymentStatus,\n} from '@open-mercato/shared/modules/payment_gateways/types'\nimport { resolveStripeClient } from '../client'\nimport { mapRefundReason, mapStripeStatus, mapWebhookEventToStatus } from '../status-map'\nimport {\n toCents,\n fromCents,\n buildStripeMetadata,\n normalizeStripePaymentElementSettings,\n resolveStripeRendererKey,\n} from '../shared'\nimport { verifyStripeWebhook } from '../webhook-handler'\n\nexport const stripeAdapterV20231016: GatewayAdapter = {\n providerKey: 'stripe',\n\n async createSession(input: CreateSessionInput): Promise<CreateSessionResult> {\n const stripe = resolveStripeClient(input.credentials, '2023-10-16')\n const rendererKey = resolveStripeRendererKey(input.presentation)\n const rendererSettings = normalizeStripePaymentElementSettings(input.presentation?.rendererSettings)\n\n const paymentIntent = await stripe.paymentIntents.create({\n amount: toCents(input.amount, input.currencyCode),\n currency: input.currencyCode.toLowerCase(),\n capture_method: input.captureMethod ?? 'automatic',\n metadata: buildStripeMetadata({\n paymentId: input.paymentId,\n tenantId: input.tenantId,\n organizationId: input.organizationId,\n orderId: input.orderId,\n }),\n payment_method_types: input.paymentTypes ?? ['card'],\n description: input.description,\n })\n\n return {\n sessionId: paymentIntent.id,\n clientSecret: paymentIntent.client_secret ?? undefined,\n status: mapStripeStatus(paymentIntent.status),\n providerData: {\n paymentIntentId: paymentIntent.id,\n publishableKey: typeof input.credentials.publishableKey === 'string'\n ? input.credentials.publishableKey\n : undefined,\n },\n clientSession: paymentIntent.client_secret && typeof input.credentials.publishableKey === 'string'\n ? {\n type: 'embedded',\n rendererKey,\n payload: {\n clientSecret: paymentIntent.client_secret,\n publishableKey: input.credentials.publishableKey,\n },\n settings: rendererSettings,\n }\n : undefined,\n }\n },\n\n async capture(input: CaptureInput): Promise<CaptureResult> {\n const stripe = resolveStripeClient(input.credentials, '2023-10-16')\n const paymentIntent = input.amount\n ? await stripe.paymentIntents.retrieve(input.sessionId)\n : null\n const captured = await stripe.paymentIntents.capture(input.sessionId, {\n amount_to_capture: input.amount && paymentIntent\n ? toCents(input.amount, paymentIntent.currency)\n : undefined,\n })\n return {\n status: mapStripeStatus(captured.status),\n capturedAmount: fromCents(captured.amount_received, captured.currency),\n providerData: { chargeId: captured.latest_charge },\n }\n },\n\n async refund(input: RefundInput): Promise<RefundResult> {\n const stripe = resolveStripeClient(input.credentials, '2023-10-16')\n const paymentIntent = input.amount\n ? await stripe.paymentIntents.retrieve(input.sessionId)\n : null\n const refund = await stripe.refunds.create({\n payment_intent: input.sessionId,\n amount: input.amount && paymentIntent\n ? toCents(input.amount, paymentIntent.currency)\n : undefined,\n reason: mapRefundReason(input.reason),\n })\n return {\n refundId: refund.id,\n status: refund.status === 'succeeded' ? 'refunded' : 'pending',\n refundedAmount: fromCents(refund.amount, refund.currency),\n }\n },\n\n async cancel(input: CancelInput): Promise<CancelResult> {\n const stripe = resolveStripeClient(input.credentials, '2023-10-16')\n const cancelled = await stripe.paymentIntents.cancel(input.sessionId)\n return { status: mapStripeStatus(cancelled.status) }\n },\n\n async getStatus(input: GetStatusInput): Promise<GatewayPaymentStatus> {\n const stripe = resolveStripeClient(input.credentials, '2023-10-16')\n const pi = await stripe.paymentIntents.retrieve(input.sessionId)\n return {\n status: mapStripeStatus(pi.status),\n amount: fromCents(pi.amount, pi.currency),\n amountReceived: fromCents(pi.amount_received, pi.currency),\n currencyCode: pi.currency.toUpperCase(),\n }\n },\n\n async verifyWebhook(input: VerifyWebhookInput): Promise<WebhookEvent> {\n return verifyStripeWebhook(input)\n },\n\n mapStatus(providerStatus: string, eventType?: string): UnifiedPaymentStatus {\n if (eventType) {\n const mappedEvent = mapWebhookEventToStatus(eventType)\n if (mappedEvent) return mappedEvent\n }\n return mapStripeStatus(providerStatus)\n },\n}\n"],
|
|
5
|
-
"mappings": "AAgBA,SAAS,2BAA2B;AACpC,SAAS,iBAAiB,iBAAiB,+BAA+B;AAC1E;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,2BAA2B;AAE7B,MAAM,yBAAyC;AAAA,EACpD,aAAa;AAAA,EAEb,MAAM,cAAc,OAAyD;AAC3E,UAAM,SAAS,oBAAoB,MAAM,aAAa,YAAY;AAClE,UAAM,cAAc,yBAAyB,MAAM,YAAY;AAC/D,UAAM,mBAAmB,sCAAsC,MAAM,cAAc,gBAAgB;AAEnG,UAAM,gBAAgB,MAAM,OAAO,eAAe,OAAO;AAAA,MACvD,QAAQ,QAAQ,MAAM,QAAQ,MAAM,YAAY;AAAA,MAChD,UAAU,MAAM,aAAa,YAAY;AAAA,MACzC,gBAAgB,MAAM,iBAAiB;AAAA,MACvC,UAAU,oBAAoB;AAAA,QAC5B,WAAW,MAAM;AAAA,QACjB,UAAU,MAAM;AAAA,QAChB,gBAAgB,MAAM;AAAA,QACtB,SAAS,MAAM;AAAA,MACjB,CAAC;AAAA,MACD,sBAAsB,MAAM,gBAAgB,CAAC,MAAM;AAAA,MACnD,aAAa,MAAM;AAAA,IACrB,
|
|
4
|
+
"sourcesContent": ["import type {\n GatewayAdapter,\n CreateSessionInput,\n CreateSessionResult,\n CaptureInput,\n CaptureResult,\n RefundInput,\n RefundResult,\n CancelInput,\n CancelResult,\n GetStatusInput,\n GatewayPaymentStatus,\n VerifyWebhookInput,\n WebhookEvent,\n UnifiedPaymentStatus,\n} from '@open-mercato/shared/modules/payment_gateways/types'\nimport { resolveStripeClient } from '../client'\nimport { mapRefundReason, mapStripeStatus, mapWebhookEventToStatus } from '../status-map'\nimport {\n toCents,\n fromCents,\n buildStripeMetadata,\n normalizeStripePaymentElementSettings,\n resolveStripeRendererKey,\n} from '../shared'\nimport { verifyStripeWebhook } from '../webhook-handler'\n\nexport const stripeAdapterV20231016: GatewayAdapter = {\n providerKey: 'stripe',\n\n async createSession(input: CreateSessionInput): Promise<CreateSessionResult> {\n const stripe = resolveStripeClient(input.credentials, '2023-10-16')\n const rendererKey = resolveStripeRendererKey(input.presentation)\n const rendererSettings = normalizeStripePaymentElementSettings(input.presentation?.rendererSettings)\n\n const paymentIntent = await stripe.paymentIntents.create({\n amount: toCents(input.amount, input.currencyCode),\n currency: input.currencyCode.toLowerCase(),\n capture_method: input.captureMethod ?? 'automatic',\n metadata: buildStripeMetadata({\n paymentId: input.paymentId,\n tenantId: input.tenantId,\n organizationId: input.organizationId,\n orderId: input.orderId,\n }),\n payment_method_types: input.paymentTypes ?? ['card'],\n description: input.description,\n }, input.idempotencyKey ? { idempotencyKey: input.idempotencyKey } : undefined)\n\n return {\n sessionId: paymentIntent.id,\n clientSecret: paymentIntent.client_secret ?? undefined,\n status: mapStripeStatus(paymentIntent.status),\n providerData: {\n paymentIntentId: paymentIntent.id,\n publishableKey: typeof input.credentials.publishableKey === 'string'\n ? input.credentials.publishableKey\n : undefined,\n },\n clientSession: paymentIntent.client_secret && typeof input.credentials.publishableKey === 'string'\n ? {\n type: 'embedded',\n rendererKey,\n payload: {\n clientSecret: paymentIntent.client_secret,\n publishableKey: input.credentials.publishableKey,\n },\n settings: rendererSettings,\n }\n : undefined,\n }\n },\n\n async capture(input: CaptureInput): Promise<CaptureResult> {\n const stripe = resolveStripeClient(input.credentials, '2023-10-16')\n const paymentIntent = input.amount\n ? await stripe.paymentIntents.retrieve(input.sessionId)\n : null\n const captured = await stripe.paymentIntents.capture(input.sessionId, {\n amount_to_capture: input.amount && paymentIntent\n ? toCents(input.amount, paymentIntent.currency)\n : undefined,\n })\n return {\n status: mapStripeStatus(captured.status),\n capturedAmount: fromCents(captured.amount_received, captured.currency),\n providerData: { chargeId: captured.latest_charge },\n }\n },\n\n async refund(input: RefundInput): Promise<RefundResult> {\n const stripe = resolveStripeClient(input.credentials, '2023-10-16')\n const paymentIntent = input.amount\n ? await stripe.paymentIntents.retrieve(input.sessionId)\n : null\n const refund = await stripe.refunds.create({\n payment_intent: input.sessionId,\n amount: input.amount && paymentIntent\n ? toCents(input.amount, paymentIntent.currency)\n : undefined,\n reason: mapRefundReason(input.reason),\n })\n return {\n refundId: refund.id,\n status: refund.status === 'succeeded' ? 'refunded' : 'pending',\n refundedAmount: fromCents(refund.amount, refund.currency),\n }\n },\n\n async cancel(input: CancelInput): Promise<CancelResult> {\n const stripe = resolveStripeClient(input.credentials, '2023-10-16')\n const cancelled = await stripe.paymentIntents.cancel(input.sessionId)\n return { status: mapStripeStatus(cancelled.status) }\n },\n\n async getStatus(input: GetStatusInput): Promise<GatewayPaymentStatus> {\n const stripe = resolveStripeClient(input.credentials, '2023-10-16')\n const pi = await stripe.paymentIntents.retrieve(input.sessionId)\n return {\n status: mapStripeStatus(pi.status),\n amount: fromCents(pi.amount, pi.currency),\n amountReceived: fromCents(pi.amount_received, pi.currency),\n currencyCode: pi.currency.toUpperCase(),\n }\n },\n\n async verifyWebhook(input: VerifyWebhookInput): Promise<WebhookEvent> {\n return verifyStripeWebhook(input)\n },\n\n mapStatus(providerStatus: string, eventType?: string): UnifiedPaymentStatus {\n if (eventType) {\n const mappedEvent = mapWebhookEventToStatus(eventType)\n if (mappedEvent) return mappedEvent\n }\n return mapStripeStatus(providerStatus)\n },\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -27,7 +27,7 @@ const stripeAdapterV20241218 = {
|
|
|
27
27
|
}),
|
|
28
28
|
payment_method_types: input.paymentTypes ?? ["card"],
|
|
29
29
|
description: input.description
|
|
30
|
-
});
|
|
30
|
+
}, input.idempotencyKey ? { idempotencyKey: input.idempotencyKey } : void 0);
|
|
31
31
|
return {
|
|
32
32
|
sessionId: paymentIntent.id,
|
|
33
33
|
clientSecret: paymentIntent.client_secret ?? void 0,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/modules/gateway_stripe/lib/adapters/v2024-12-18.ts"],
|
|
4
|
-
"sourcesContent": ["import type {\n GatewayAdapter,\n CreateSessionInput,\n CreateSessionResult,\n CaptureInput,\n CaptureResult,\n RefundInput,\n RefundResult,\n CancelInput,\n CancelResult,\n GetStatusInput,\n GatewayPaymentStatus,\n VerifyWebhookInput,\n WebhookEvent,\n UnifiedPaymentStatus,\n} from '@open-mercato/shared/modules/payment_gateways/types'\nimport { resolveStripeClient } from '../client'\nimport { mapRefundReason, mapStripeStatus, mapWebhookEventToStatus } from '../status-map'\nimport {\n toCents,\n fromCents,\n buildStripeMetadata,\n normalizeStripePaymentElementSettings,\n resolveStripeRendererKey,\n} from '../shared'\nimport { verifyStripeWebhook } from '../webhook-handler'\n\nconst STRIPE_API_VERSION = '2024-12-18'\n\nexport const stripeAdapterV20241218: GatewayAdapter = {\n providerKey: 'stripe',\n\n async createSession(input: CreateSessionInput): Promise<CreateSessionResult> {\n const stripe = resolveStripeClient(input.credentials, STRIPE_API_VERSION)\n const rendererKey = resolveStripeRendererKey(input.presentation)\n const rendererSettings = normalizeStripePaymentElementSettings(input.presentation?.rendererSettings)\n\n const paymentIntent = await stripe.paymentIntents.create({\n amount: toCents(input.amount, input.currencyCode),\n currency: input.currencyCode.toLowerCase(),\n capture_method: input.captureMethod ?? 'automatic',\n metadata: buildStripeMetadata({\n paymentId: input.paymentId,\n tenantId: input.tenantId,\n organizationId: input.organizationId,\n orderId: input.orderId,\n }),\n payment_method_types: input.paymentTypes ?? ['card'],\n description: input.description,\n })\n\n return {\n sessionId: paymentIntent.id,\n clientSecret: paymentIntent.client_secret ?? undefined,\n status: mapStripeStatus(paymentIntent.status),\n providerData: {\n paymentIntentId: paymentIntent.id,\n publishableKey: typeof input.credentials.publishableKey === 'string'\n ? input.credentials.publishableKey\n : undefined,\n },\n clientSession: paymentIntent.client_secret && typeof input.credentials.publishableKey === 'string'\n ? {\n type: 'embedded',\n rendererKey,\n payload: {\n clientSecret: paymentIntent.client_secret,\n publishableKey: input.credentials.publishableKey,\n },\n settings: rendererSettings,\n }\n : undefined,\n }\n },\n\n async capture(input: CaptureInput): Promise<CaptureResult> {\n const stripe = resolveStripeClient(input.credentials, STRIPE_API_VERSION)\n const paymentIntent = input.amount\n ? await stripe.paymentIntents.retrieve(input.sessionId)\n : null\n\n const captured = await stripe.paymentIntents.capture(input.sessionId, {\n amount_to_capture: input.amount && paymentIntent\n ? toCents(input.amount, paymentIntent.currency)\n : undefined,\n })\n\n const capturedCurrencyCode = captured.currency.toUpperCase()\n\n return {\n status: mapStripeStatus(captured.status),\n capturedAmount: fromCents(captured.amount_received, capturedCurrencyCode),\n providerData: { chargeId: captured.latest_charge },\n }\n },\n\n async refund(input: RefundInput): Promise<RefundResult> {\n const stripe = resolveStripeClient(input.credentials, STRIPE_API_VERSION)\n const paymentIntent = input.amount\n ? await stripe.paymentIntents.retrieve(input.sessionId)\n : null\n\n const refund = await stripe.refunds.create({\n payment_intent: input.sessionId,\n amount: input.amount && paymentIntent\n ? toCents(input.amount, paymentIntent.currency)\n : undefined,\n reason: mapRefundReason(input.reason),\n metadata: input.metadata as Record<string, string> | undefined,\n })\n\n const refundCurrencyCode = refund.currency.toUpperCase()\n\n return {\n refundId: refund.id,\n status: refund.status === 'succeeded' ? 'refunded' : 'pending',\n refundedAmount: fromCents(refund.amount, refundCurrencyCode),\n }\n },\n\n async cancel(input: CancelInput): Promise<CancelResult> {\n const stripe = resolveStripeClient(input.credentials, STRIPE_API_VERSION)\n\n const cancelled = await stripe.paymentIntents.cancel(input.sessionId, {\n cancellation_reason: 'requested_by_customer',\n })\n\n return {\n status: mapStripeStatus(cancelled.status),\n }\n },\n\n async getStatus(input: GetStatusInput): Promise<GatewayPaymentStatus> {\n const stripe = resolveStripeClient(input.credentials, STRIPE_API_VERSION)\n\n const pi = await stripe.paymentIntents.retrieve(input.sessionId)\n return {\n status: mapStripeStatus(pi.status),\n amount: fromCents(pi.amount, pi.currency),\n amountReceived: fromCents(pi.amount_received, pi.currency),\n currencyCode: pi.currency.toUpperCase(),\n }\n },\n\n async verifyWebhook(input: VerifyWebhookInput): Promise<WebhookEvent> {\n return verifyStripeWebhook(input)\n },\n\n mapStatus(providerStatus: string, eventType?: string): UnifiedPaymentStatus {\n if (eventType) {\n const mappedEvent = mapWebhookEventToStatus(eventType)\n if (mappedEvent) return mappedEvent\n }\n return mapStripeStatus(providerStatus)\n },\n}\n"],
|
|
5
|
-
"mappings": "AAgBA,SAAS,2BAA2B;AACpC,SAAS,iBAAiB,iBAAiB,+BAA+B;AAC1E;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,2BAA2B;AAEpC,MAAM,qBAAqB;AAEpB,MAAM,yBAAyC;AAAA,EACpD,aAAa;AAAA,EAEb,MAAM,cAAc,OAAyD;AAC3E,UAAM,SAAS,oBAAoB,MAAM,aAAa,kBAAkB;AACxE,UAAM,cAAc,yBAAyB,MAAM,YAAY;AAC/D,UAAM,mBAAmB,sCAAsC,MAAM,cAAc,gBAAgB;AAEnG,UAAM,gBAAgB,MAAM,OAAO,eAAe,OAAO;AAAA,MACvD,QAAQ,QAAQ,MAAM,QAAQ,MAAM,YAAY;AAAA,MAChD,UAAU,MAAM,aAAa,YAAY;AAAA,MACzC,gBAAgB,MAAM,iBAAiB;AAAA,MACvC,UAAU,oBAAoB;AAAA,QAC5B,WAAW,MAAM;AAAA,QACjB,UAAU,MAAM;AAAA,QAChB,gBAAgB,MAAM;AAAA,QACtB,SAAS,MAAM;AAAA,MACjB,CAAC;AAAA,MACD,sBAAsB,MAAM,gBAAgB,CAAC,MAAM;AAAA,MACnD,aAAa,MAAM;AAAA,IACrB,
|
|
4
|
+
"sourcesContent": ["import type {\n GatewayAdapter,\n CreateSessionInput,\n CreateSessionResult,\n CaptureInput,\n CaptureResult,\n RefundInput,\n RefundResult,\n CancelInput,\n CancelResult,\n GetStatusInput,\n GatewayPaymentStatus,\n VerifyWebhookInput,\n WebhookEvent,\n UnifiedPaymentStatus,\n} from '@open-mercato/shared/modules/payment_gateways/types'\nimport { resolveStripeClient } from '../client'\nimport { mapRefundReason, mapStripeStatus, mapWebhookEventToStatus } from '../status-map'\nimport {\n toCents,\n fromCents,\n buildStripeMetadata,\n normalizeStripePaymentElementSettings,\n resolveStripeRendererKey,\n} from '../shared'\nimport { verifyStripeWebhook } from '../webhook-handler'\n\nconst STRIPE_API_VERSION = '2024-12-18'\n\nexport const stripeAdapterV20241218: GatewayAdapter = {\n providerKey: 'stripe',\n\n async createSession(input: CreateSessionInput): Promise<CreateSessionResult> {\n const stripe = resolveStripeClient(input.credentials, STRIPE_API_VERSION)\n const rendererKey = resolveStripeRendererKey(input.presentation)\n const rendererSettings = normalizeStripePaymentElementSettings(input.presentation?.rendererSettings)\n\n const paymentIntent = await stripe.paymentIntents.create({\n amount: toCents(input.amount, input.currencyCode),\n currency: input.currencyCode.toLowerCase(),\n capture_method: input.captureMethod ?? 'automatic',\n metadata: buildStripeMetadata({\n paymentId: input.paymentId,\n tenantId: input.tenantId,\n organizationId: input.organizationId,\n orderId: input.orderId,\n }),\n payment_method_types: input.paymentTypes ?? ['card'],\n description: input.description,\n }, input.idempotencyKey ? { idempotencyKey: input.idempotencyKey } : undefined)\n\n return {\n sessionId: paymentIntent.id,\n clientSecret: paymentIntent.client_secret ?? undefined,\n status: mapStripeStatus(paymentIntent.status),\n providerData: {\n paymentIntentId: paymentIntent.id,\n publishableKey: typeof input.credentials.publishableKey === 'string'\n ? input.credentials.publishableKey\n : undefined,\n },\n clientSession: paymentIntent.client_secret && typeof input.credentials.publishableKey === 'string'\n ? {\n type: 'embedded',\n rendererKey,\n payload: {\n clientSecret: paymentIntent.client_secret,\n publishableKey: input.credentials.publishableKey,\n },\n settings: rendererSettings,\n }\n : undefined,\n }\n },\n\n async capture(input: CaptureInput): Promise<CaptureResult> {\n const stripe = resolveStripeClient(input.credentials, STRIPE_API_VERSION)\n const paymentIntent = input.amount\n ? await stripe.paymentIntents.retrieve(input.sessionId)\n : null\n\n const captured = await stripe.paymentIntents.capture(input.sessionId, {\n amount_to_capture: input.amount && paymentIntent\n ? toCents(input.amount, paymentIntent.currency)\n : undefined,\n })\n\n const capturedCurrencyCode = captured.currency.toUpperCase()\n\n return {\n status: mapStripeStatus(captured.status),\n capturedAmount: fromCents(captured.amount_received, capturedCurrencyCode),\n providerData: { chargeId: captured.latest_charge },\n }\n },\n\n async refund(input: RefundInput): Promise<RefundResult> {\n const stripe = resolveStripeClient(input.credentials, STRIPE_API_VERSION)\n const paymentIntent = input.amount\n ? await stripe.paymentIntents.retrieve(input.sessionId)\n : null\n\n const refund = await stripe.refunds.create({\n payment_intent: input.sessionId,\n amount: input.amount && paymentIntent\n ? toCents(input.amount, paymentIntent.currency)\n : undefined,\n reason: mapRefundReason(input.reason),\n metadata: input.metadata as Record<string, string> | undefined,\n })\n\n const refundCurrencyCode = refund.currency.toUpperCase()\n\n return {\n refundId: refund.id,\n status: refund.status === 'succeeded' ? 'refunded' : 'pending',\n refundedAmount: fromCents(refund.amount, refundCurrencyCode),\n }\n },\n\n async cancel(input: CancelInput): Promise<CancelResult> {\n const stripe = resolveStripeClient(input.credentials, STRIPE_API_VERSION)\n\n const cancelled = await stripe.paymentIntents.cancel(input.sessionId, {\n cancellation_reason: 'requested_by_customer',\n })\n\n return {\n status: mapStripeStatus(cancelled.status),\n }\n },\n\n async getStatus(input: GetStatusInput): Promise<GatewayPaymentStatus> {\n const stripe = resolveStripeClient(input.credentials, STRIPE_API_VERSION)\n\n const pi = await stripe.paymentIntents.retrieve(input.sessionId)\n return {\n status: mapStripeStatus(pi.status),\n amount: fromCents(pi.amount, pi.currency),\n amountReceived: fromCents(pi.amount_received, pi.currency),\n currencyCode: pi.currency.toUpperCase(),\n }\n },\n\n async verifyWebhook(input: VerifyWebhookInput): Promise<WebhookEvent> {\n return verifyStripeWebhook(input)\n },\n\n mapStatus(providerStatus: string, eventType?: string): UnifiedPaymentStatus {\n if (eventType) {\n const mappedEvent = mapWebhookEventToStatus(eventType)\n if (mappedEvent) return mappedEvent\n }\n return mapStripeStatus(providerStatus)\n },\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -27,7 +27,7 @@ const stripeAdapterV20250224Acacia = {
|
|
|
27
27
|
}),
|
|
28
28
|
payment_method_types: input.paymentTypes ?? ["card"],
|
|
29
29
|
description: input.description
|
|
30
|
-
});
|
|
30
|
+
}, input.idempotencyKey ? { idempotencyKey: input.idempotencyKey } : void 0);
|
|
31
31
|
return {
|
|
32
32
|
sessionId: paymentIntent.id,
|
|
33
33
|
clientSecret: paymentIntent.client_secret ?? void 0,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/modules/gateway_stripe/lib/adapters/v2025-02-24.acacia.ts"],
|
|
4
|
-
"sourcesContent": ["import type {\n GatewayAdapter,\n CreateSessionInput,\n CreateSessionResult,\n CaptureInput,\n CaptureResult,\n RefundInput,\n RefundResult,\n CancelInput,\n CancelResult,\n GetStatusInput,\n GatewayPaymentStatus,\n VerifyWebhookInput,\n WebhookEvent,\n UnifiedPaymentStatus,\n} from '@open-mercato/shared/modules/payment_gateways/types'\nimport { resolveStripeClient } from '../client'\nimport { mapRefundReason, mapStripeStatus, mapWebhookEventToStatus } from '../status-map'\nimport {\n toCents,\n fromCents,\n buildStripeMetadata,\n normalizeStripePaymentElementSettings,\n resolveStripeRendererKey,\n} from '../shared'\nimport { verifyStripeWebhook } from '../webhook-handler'\n\nconst STRIPE_API_VERSION = '2025-02-24.acacia'\n\nexport const stripeAdapterV20250224Acacia: GatewayAdapter = {\n providerKey: 'stripe',\n\n async createSession(input: CreateSessionInput): Promise<CreateSessionResult> {\n const stripe = resolveStripeClient(input.credentials, STRIPE_API_VERSION)\n const rendererKey = resolveStripeRendererKey(input.presentation)\n const rendererSettings = normalizeStripePaymentElementSettings(input.presentation?.rendererSettings)\n\n const paymentIntent = await stripe.paymentIntents.create({\n amount: toCents(input.amount, input.currencyCode),\n currency: input.currencyCode.toLowerCase(),\n capture_method: input.captureMethod ?? 'automatic',\n metadata: buildStripeMetadata({\n paymentId: input.paymentId,\n tenantId: input.tenantId,\n organizationId: input.organizationId,\n orderId: input.orderId,\n }),\n payment_method_types: input.paymentTypes ?? ['card'],\n description: input.description,\n })\n\n return {\n sessionId: paymentIntent.id,\n clientSecret: paymentIntent.client_secret ?? undefined,\n status: mapStripeStatus(paymentIntent.status),\n providerData: {\n paymentIntentId: paymentIntent.id,\n publishableKey: typeof input.credentials.publishableKey === 'string'\n ? input.credentials.publishableKey\n : undefined,\n },\n clientSession: paymentIntent.client_secret && typeof input.credentials.publishableKey === 'string'\n ? {\n type: 'embedded',\n rendererKey,\n payload: {\n clientSecret: paymentIntent.client_secret,\n publishableKey: input.credentials.publishableKey,\n },\n settings: rendererSettings,\n }\n : undefined,\n }\n },\n\n async capture(input: CaptureInput): Promise<CaptureResult> {\n const stripe = resolveStripeClient(input.credentials, STRIPE_API_VERSION)\n const paymentIntent = input.amount\n ? await stripe.paymentIntents.retrieve(input.sessionId)\n : null\n\n const captured = await stripe.paymentIntents.capture(input.sessionId, {\n amount_to_capture: input.amount && paymentIntent\n ? toCents(input.amount, paymentIntent.currency)\n : undefined,\n })\n\n return {\n status: mapStripeStatus(captured.status),\n capturedAmount: fromCents(captured.amount_received, captured.currency),\n providerData: { chargeId: captured.latest_charge },\n }\n },\n\n async refund(input: RefundInput): Promise<RefundResult> {\n const stripe = resolveStripeClient(input.credentials, STRIPE_API_VERSION)\n const paymentIntent = input.amount\n ? await stripe.paymentIntents.retrieve(input.sessionId)\n : null\n\n const refund = await stripe.refunds.create({\n payment_intent: input.sessionId,\n amount: input.amount && paymentIntent\n ? toCents(input.amount, paymentIntent.currency)\n : undefined,\n reason: mapRefundReason(input.reason),\n metadata: input.metadata as Record<string, string> | undefined,\n })\n\n return {\n refundId: refund.id,\n status: refund.status === 'succeeded' ? 'refunded' : 'pending',\n refundedAmount: fromCents(refund.amount, refund.currency),\n }\n },\n\n async cancel(input: CancelInput): Promise<CancelResult> {\n const stripe = resolveStripeClient(input.credentials, STRIPE_API_VERSION)\n\n const cancelled = await stripe.paymentIntents.cancel(input.sessionId, {\n cancellation_reason: 'requested_by_customer',\n })\n\n return {\n status: mapStripeStatus(cancelled.status),\n }\n },\n\n async getStatus(input: GetStatusInput): Promise<GatewayPaymentStatus> {\n const stripe = resolveStripeClient(input.credentials, STRIPE_API_VERSION)\n\n const pi = await stripe.paymentIntents.retrieve(input.sessionId)\n return {\n status: mapStripeStatus(pi.status),\n amount: fromCents(pi.amount, pi.currency),\n amountReceived: fromCents(pi.amount_received, pi.currency),\n currencyCode: pi.currency.toUpperCase(),\n }\n },\n\n async verifyWebhook(input: VerifyWebhookInput): Promise<WebhookEvent> {\n return verifyStripeWebhook(input)\n },\n\n mapStatus(providerStatus: string, eventType?: string): UnifiedPaymentStatus {\n if (eventType) {\n const mappedEvent = mapWebhookEventToStatus(eventType)\n if (mappedEvent) return mappedEvent\n }\n return mapStripeStatus(providerStatus)\n },\n}\n"],
|
|
5
|
-
"mappings": "AAgBA,SAAS,2BAA2B;AACpC,SAAS,iBAAiB,iBAAiB,+BAA+B;AAC1E;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,2BAA2B;AAEpC,MAAM,qBAAqB;AAEpB,MAAM,+BAA+C;AAAA,EAC1D,aAAa;AAAA,EAEb,MAAM,cAAc,OAAyD;AAC3E,UAAM,SAAS,oBAAoB,MAAM,aAAa,kBAAkB;AACxE,UAAM,cAAc,yBAAyB,MAAM,YAAY;AAC/D,UAAM,mBAAmB,sCAAsC,MAAM,cAAc,gBAAgB;AAEnG,UAAM,gBAAgB,MAAM,OAAO,eAAe,OAAO;AAAA,MACvD,QAAQ,QAAQ,MAAM,QAAQ,MAAM,YAAY;AAAA,MAChD,UAAU,MAAM,aAAa,YAAY;AAAA,MACzC,gBAAgB,MAAM,iBAAiB;AAAA,MACvC,UAAU,oBAAoB;AAAA,QAC5B,WAAW,MAAM;AAAA,QACjB,UAAU,MAAM;AAAA,QAChB,gBAAgB,MAAM;AAAA,QACtB,SAAS,MAAM;AAAA,MACjB,CAAC;AAAA,MACD,sBAAsB,MAAM,gBAAgB,CAAC,MAAM;AAAA,MACnD,aAAa,MAAM;AAAA,IACrB,
|
|
4
|
+
"sourcesContent": ["import type {\n GatewayAdapter,\n CreateSessionInput,\n CreateSessionResult,\n CaptureInput,\n CaptureResult,\n RefundInput,\n RefundResult,\n CancelInput,\n CancelResult,\n GetStatusInput,\n GatewayPaymentStatus,\n VerifyWebhookInput,\n WebhookEvent,\n UnifiedPaymentStatus,\n} from '@open-mercato/shared/modules/payment_gateways/types'\nimport { resolveStripeClient } from '../client'\nimport { mapRefundReason, mapStripeStatus, mapWebhookEventToStatus } from '../status-map'\nimport {\n toCents,\n fromCents,\n buildStripeMetadata,\n normalizeStripePaymentElementSettings,\n resolveStripeRendererKey,\n} from '../shared'\nimport { verifyStripeWebhook } from '../webhook-handler'\n\nconst STRIPE_API_VERSION = '2025-02-24.acacia'\n\nexport const stripeAdapterV20250224Acacia: GatewayAdapter = {\n providerKey: 'stripe',\n\n async createSession(input: CreateSessionInput): Promise<CreateSessionResult> {\n const stripe = resolveStripeClient(input.credentials, STRIPE_API_VERSION)\n const rendererKey = resolveStripeRendererKey(input.presentation)\n const rendererSettings = normalizeStripePaymentElementSettings(input.presentation?.rendererSettings)\n\n const paymentIntent = await stripe.paymentIntents.create({\n amount: toCents(input.amount, input.currencyCode),\n currency: input.currencyCode.toLowerCase(),\n capture_method: input.captureMethod ?? 'automatic',\n metadata: buildStripeMetadata({\n paymentId: input.paymentId,\n tenantId: input.tenantId,\n organizationId: input.organizationId,\n orderId: input.orderId,\n }),\n payment_method_types: input.paymentTypes ?? ['card'],\n description: input.description,\n }, input.idempotencyKey ? { idempotencyKey: input.idempotencyKey } : undefined)\n\n return {\n sessionId: paymentIntent.id,\n clientSecret: paymentIntent.client_secret ?? undefined,\n status: mapStripeStatus(paymentIntent.status),\n providerData: {\n paymentIntentId: paymentIntent.id,\n publishableKey: typeof input.credentials.publishableKey === 'string'\n ? input.credentials.publishableKey\n : undefined,\n },\n clientSession: paymentIntent.client_secret && typeof input.credentials.publishableKey === 'string'\n ? {\n type: 'embedded',\n rendererKey,\n payload: {\n clientSecret: paymentIntent.client_secret,\n publishableKey: input.credentials.publishableKey,\n },\n settings: rendererSettings,\n }\n : undefined,\n }\n },\n\n async capture(input: CaptureInput): Promise<CaptureResult> {\n const stripe = resolveStripeClient(input.credentials, STRIPE_API_VERSION)\n const paymentIntent = input.amount\n ? await stripe.paymentIntents.retrieve(input.sessionId)\n : null\n\n const captured = await stripe.paymentIntents.capture(input.sessionId, {\n amount_to_capture: input.amount && paymentIntent\n ? toCents(input.amount, paymentIntent.currency)\n : undefined,\n })\n\n return {\n status: mapStripeStatus(captured.status),\n capturedAmount: fromCents(captured.amount_received, captured.currency),\n providerData: { chargeId: captured.latest_charge },\n }\n },\n\n async refund(input: RefundInput): Promise<RefundResult> {\n const stripe = resolveStripeClient(input.credentials, STRIPE_API_VERSION)\n const paymentIntent = input.amount\n ? await stripe.paymentIntents.retrieve(input.sessionId)\n : null\n\n const refund = await stripe.refunds.create({\n payment_intent: input.sessionId,\n amount: input.amount && paymentIntent\n ? toCents(input.amount, paymentIntent.currency)\n : undefined,\n reason: mapRefundReason(input.reason),\n metadata: input.metadata as Record<string, string> | undefined,\n })\n\n return {\n refundId: refund.id,\n status: refund.status === 'succeeded' ? 'refunded' : 'pending',\n refundedAmount: fromCents(refund.amount, refund.currency),\n }\n },\n\n async cancel(input: CancelInput): Promise<CancelResult> {\n const stripe = resolveStripeClient(input.credentials, STRIPE_API_VERSION)\n\n const cancelled = await stripe.paymentIntents.cancel(input.sessionId, {\n cancellation_reason: 'requested_by_customer',\n })\n\n return {\n status: mapStripeStatus(cancelled.status),\n }\n },\n\n async getStatus(input: GetStatusInput): Promise<GatewayPaymentStatus> {\n const stripe = resolveStripeClient(input.credentials, STRIPE_API_VERSION)\n\n const pi = await stripe.paymentIntents.retrieve(input.sessionId)\n return {\n status: mapStripeStatus(pi.status),\n amount: fromCents(pi.amount, pi.currency),\n amountReceived: fromCents(pi.amount_received, pi.currency),\n currencyCode: pi.currency.toUpperCase(),\n }\n },\n\n async verifyWebhook(input: VerifyWebhookInput): Promise<WebhookEvent> {\n return verifyStripeWebhook(input)\n },\n\n mapStatus(providerStatus: string, eventType?: string): UnifiedPaymentStatus {\n if (eventType) {\n const mappedEvent = mapWebhookEventToStatus(eventType)\n if (mappedEvent) return mappedEvent\n }\n return mapStripeStatus(providerStatus)\n },\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@open-mercato/gateway-stripe",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.7-develop.6553.1.2ec7246e04",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -62,21 +62,21 @@
|
|
|
62
62
|
}
|
|
63
63
|
},
|
|
64
64
|
"dependencies": {
|
|
65
|
-
"@open-mercato/core": "0.6.
|
|
66
|
-
"@open-mercato/queue": "0.6.
|
|
67
|
-
"@open-mercato/ui": "0.6.
|
|
65
|
+
"@open-mercato/core": "0.6.7-develop.6553.1.2ec7246e04",
|
|
66
|
+
"@open-mercato/queue": "0.6.7-develop.6553.1.2ec7246e04",
|
|
67
|
+
"@open-mercato/ui": "0.6.7-develop.6553.1.2ec7246e04",
|
|
68
68
|
"@stripe/react-stripe-js": "^6.6.0",
|
|
69
69
|
"@stripe/stripe-js": "^9.8.0",
|
|
70
70
|
"stripe": "^22.3.0"
|
|
71
71
|
},
|
|
72
72
|
"peerDependencies": {
|
|
73
73
|
"@mikro-orm/postgresql": "^7.0.14",
|
|
74
|
-
"@open-mercato/shared": "0.6.
|
|
74
|
+
"@open-mercato/shared": "0.6.7-develop.6553.1.2ec7246e04",
|
|
75
75
|
"react": "^19.0.0",
|
|
76
76
|
"react-dom": "^19.0.0"
|
|
77
77
|
},
|
|
78
78
|
"devDependencies": {
|
|
79
|
-
"@open-mercato/shared": "0.6.
|
|
79
|
+
"@open-mercato/shared": "0.6.7-develop.6553.1.2ec7246e04",
|
|
80
80
|
"@types/jest": "^30.0.0",
|
|
81
81
|
"@types/react": "^19.2.17",
|
|
82
82
|
"@types/react-dom": "^19.2.3",
|
|
@@ -95,5 +95,6 @@
|
|
|
95
95
|
"type": "git",
|
|
96
96
|
"url": "https://github.com/open-mercato/open-mercato",
|
|
97
97
|
"directory": "packages/gateway-stripe"
|
|
98
|
-
}
|
|
98
|
+
},
|
|
99
|
+
"stableVersion": "0.6.6"
|
|
99
100
|
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { CreateSessionInput, GatewayAdapter } from '@open-mercato/shared/modules/payment_gateways/types'
|
|
2
|
+
import { resolveStripeClient } from '../lib/client'
|
|
3
|
+
import { stripeAdapterV20231016 } from '../lib/adapters/v2023-10-16'
|
|
4
|
+
import { stripeAdapterV20241218 } from '../lib/adapters/v2024-12-18'
|
|
5
|
+
import { stripeAdapterV20250224Acacia } from '../lib/adapters/v2025-02-24.acacia'
|
|
6
|
+
|
|
7
|
+
jest.mock('../lib/client', () => ({
|
|
8
|
+
resolveStripeClient: jest.fn(),
|
|
9
|
+
}))
|
|
10
|
+
|
|
11
|
+
const adapters: Array<[string, GatewayAdapter]> = [
|
|
12
|
+
['2023-10-16', stripeAdapterV20231016],
|
|
13
|
+
['2024-12-18', stripeAdapterV20241218],
|
|
14
|
+
['2025-02-24.acacia', stripeAdapterV20250224Acacia],
|
|
15
|
+
]
|
|
16
|
+
|
|
17
|
+
describe.each(adapters)('Stripe adapter %s session idempotency', (_version, adapter) => {
|
|
18
|
+
it('passes the stable operation key to Stripe PaymentIntent creation', async () => {
|
|
19
|
+
const create = jest.fn(async () => ({
|
|
20
|
+
id: 'pi_123',
|
|
21
|
+
client_secret: 'secret_123',
|
|
22
|
+
status: 'requires_payment_method',
|
|
23
|
+
}))
|
|
24
|
+
;(resolveStripeClient as jest.Mock).mockReturnValue({ paymentIntents: { create } })
|
|
25
|
+
const input = {
|
|
26
|
+
paymentId: '11111111-1111-4111-8111-111111111111',
|
|
27
|
+
tenantId: '22222222-2222-4222-8222-222222222222',
|
|
28
|
+
organizationId: '33333333-3333-4333-8333-333333333333',
|
|
29
|
+
amount: 25,
|
|
30
|
+
currencyCode: 'USD',
|
|
31
|
+
credentials: { secretKey: 'sk_test', publishableKey: 'pk_test' },
|
|
32
|
+
idempotencyKey: 'om-payment-session:stable-operation-key',
|
|
33
|
+
} as CreateSessionInput & { idempotencyKey: string }
|
|
34
|
+
|
|
35
|
+
await adapter.createSession(input)
|
|
36
|
+
|
|
37
|
+
expect(create).toHaveBeenCalledWith(
|
|
38
|
+
expect.any(Object),
|
|
39
|
+
{ idempotencyKey: 'om-payment-session:stable-operation-key' },
|
|
40
|
+
)
|
|
41
|
+
})
|
|
42
|
+
})
|
|
@@ -45,7 +45,7 @@ export const stripeAdapterV20231016: GatewayAdapter = {
|
|
|
45
45
|
}),
|
|
46
46
|
payment_method_types: input.paymentTypes ?? ['card'],
|
|
47
47
|
description: input.description,
|
|
48
|
-
})
|
|
48
|
+
}, input.idempotencyKey ? { idempotencyKey: input.idempotencyKey } : undefined)
|
|
49
49
|
|
|
50
50
|
return {
|
|
51
51
|
sessionId: paymentIntent.id,
|
|
@@ -47,7 +47,7 @@ export const stripeAdapterV20241218: GatewayAdapter = {
|
|
|
47
47
|
}),
|
|
48
48
|
payment_method_types: input.paymentTypes ?? ['card'],
|
|
49
49
|
description: input.description,
|
|
50
|
-
})
|
|
50
|
+
}, input.idempotencyKey ? { idempotencyKey: input.idempotencyKey } : undefined)
|
|
51
51
|
|
|
52
52
|
return {
|
|
53
53
|
sessionId: paymentIntent.id,
|
|
@@ -47,7 +47,7 @@ export const stripeAdapterV20250224Acacia: GatewayAdapter = {
|
|
|
47
47
|
}),
|
|
48
48
|
payment_method_types: input.paymentTypes ?? ['card'],
|
|
49
49
|
description: input.description,
|
|
50
|
-
})
|
|
50
|
+
}, input.idempotencyKey ? { idempotencyKey: input.idempotencyKey } : undefined)
|
|
51
51
|
|
|
52
52
|
return {
|
|
53
53
|
sessionId: paymentIntent.id,
|