fix: Show the Stripe payment error message and change the status to 400 for charge card issues (#22463)

* fix: show stripe payment error message

* Update PaymentService.ts

* Update chargeCard.handler.ts

* Update chargeCard.handler.ts

* Update PaymentService.ts

* update

* update
This commit is contained in:
Anik Dhabal Babu authored and GitHub committed 2025-07-16 09:45:49 +00:00
1 parent a84e8987cb
commit fb59342de4
6 files changed
+48 -13

No files matched your search

@@ -6,6 +6,7 @@ import z from "zod";
import { sendAwaitingPaymentEmailAndSMS } from "@calcom/emails";
import { ErrorCode } from "@calcom/lib/errorCodes";
import { getErrorFromUnknown } from "@calcom/lib/errors";
import { ErrorWithCode } from "@calcom/lib/errors";
import logger from "@calcom/lib/logger";
import { safeStringify } from "@calcom/lib/safeStringify";
import prisma from "@calcom/prisma";
@@ -296,7 +297,28 @@ export class PaymentService implements IAbstractPaymentService {
return paymentData;
} catch (error) {
log.error("Stripe: Could not charge card for payment", _bookingId, safeStringify(error));
throw new Error(ErrorCode.ChargeCardFailure);
const errorMappings = {
"your card was declined": "your_card_was_declined",
"your card does not support this type of purchase":
"your_card_does_not_support_this_type_of_purchase",
"amount must convert to at least": "amount_must_convert_to_at_least",
};
let userMessage = "could_not_charge_card";
if (error instanceof Error) {
const errorMessage = error.message.toLowerCase();
for (const [key, message] of Object.entries(errorMappings)) {
if (errorMessage.includes(key)) {
userMessage = message;
break;
}
}
}
throw new ErrorWithCode(ErrorCode.ChargeCardFailure, userMessage);
}
}
@@ -16,6 +16,7 @@ const test400Codes = [
ErrorCode.BookingNotAllowedByRestrictionSchedule,
ErrorCode.BookerLimitExceeded,
ErrorCode.BookerLimitExceededReschedule,
ErrorCode.ChargeCardFailure,
];
const test404Codes = [
@@ -33,7 +34,6 @@ const test409Codes = [
ErrorCode.NotEnoughAvailableSeats,
ErrorCode.BookingConflict,
ErrorCode.PaymentCreationFailure,
ErrorCode.ChargeCardFailure,
];
describe("getServerErrorFromUnknown", () => {
@@ -112,6 +112,7 @@ function getStatusCode(cause: Error | ErrorWithCode): number {
case ErrorCode.BookerLimitExceeded:
case ErrorCode.BookerLimitExceededReschedule:
case ErrorCode.EventTypeNoHosts:
case ErrorCode.ChargeCardFailure:
return 400;
// 409 Conflict
case ErrorCode.NoAvailableUsersFound:
@@ -122,7 +123,6 @@ function getStatusCode(cause: Error | ErrorWithCode): number {
case ErrorCode.NotEnoughAvailableSeats:
case ErrorCode.BookingConflict:
case ErrorCode.PaymentCreationFailure:
case ErrorCode.ChargeCardFailure:
return 409;
// 404 Not Found
case ErrorCode.EventTypeNotFound:
@@ -1,6 +1,8 @@
import appStore from "@calcom/app-store";
import dayjs from "@calcom/dayjs";
import { sendNoShowFeeChargedEmail } from "@calcom/emails";
import { ErrorCode } from "@calcom/lib/errorCodes";
import { ErrorWithCode } from "@calcom/lib/errors";
import { getTranslation } from "@calcom/lib/server/i18n";
import type { PrismaClient } from "@calcom/prisma";
import type { EventTypeMetadata } from "@calcom/prisma/zod-utils";
@@ -141,9 +143,13 @@ export const chargeCardHandler = async ({ ctx, input }: ChargeCardHandlerOptions
return paymentData;
} catch (err) {
let errorMessage = `Error processing payment with error ${err}`;
if (err instanceof ErrorWithCode && err.code === ErrorCode.ChargeCardFailure) {
errorMessage = err.message;
}
throw new TRPCError({
code: "INTERNAL_SERVER_ERROR",
message: `Error processing payment with error ${err}`,
code: "BAD_REQUEST",
message: tOrganizer(errorMessage),
});
}
};