diff --git a/packages/payments-plugin/src/stripe/stripe.controller.ts b/packages/payments-plugin/src/stripe/stripe.controller.ts index 0c80a5d512..2b59cc7c5f 100644 --- a/packages/payments-plugin/src/stripe/stripe.controller.ts +++ b/packages/payments-plugin/src/stripe/stripe.controller.ts @@ -1,5 +1,6 @@ import { Controller, Headers, HttpStatus, Post, Req, Res } from '@nestjs/common'; import type { PaymentMethod, RequestContext } from '@vendure/core'; +import { ChannelService } from '@vendure/core'; import { InternalServerError, LanguageCode, @@ -31,6 +32,7 @@ export class StripeController { private stripeService: StripeService, private requestContextService: RequestContextService, private connection: TransactionalConnection, + private channelService: ChannelService, ) {} @Post('stripe') @@ -57,7 +59,7 @@ export class StripeController { const { metadata: { channelToken, orderCode, orderId } = {} } = paymentIntent; const outerCtx = await this.createContext(channelToken, request); - await this.connection.withTransaction(outerCtx, async ctx => { + await this.connection.withTransaction(outerCtx, async (ctx: RequestContext) => { const order = await this.orderService.findOneByCode(ctx, orderCode); if (!order) { @@ -90,8 +92,13 @@ export class StripeController { } if (order.state !== 'ArrangingPayment') { + // Orders can switch channels (e.g., global to UK store), causing lookups by the original + // channel to fail. Using a default channel avoids "entity-with-id-not-found" errors. + // See https://github.com/vendure-ecommerce/vendure/issues/3072 + const defaultChannel = await this.channelService.getDefaultChannel(ctx); + const ctxWithDefaultChannel = await this.createContext(defaultChannel.token, request); const transitionToStateResult = await this.orderService.transitionToState( - ctx, + ctxWithDefaultChannel, orderId, 'ArrangingPayment', );