diff --git a/packages/payment/src/config.ts b/packages/payment/src/config.ts index b60f43b4..716790ff 100644 --- a/packages/payment/src/config.ts +++ b/packages/payment/src/config.ts @@ -50,6 +50,8 @@ export function validatePaymentConfig(config: PaymentConfig) { }); if (value.provider === "razorpay") required(name, { keyId: value.keyId, keySecret: value.keySecret }); + if (value.provider === "razorpay" && config.environment === "production") + required(name, { webhookSecret: value.webhookSecret }); if (value.provider === "paypal") required(name, { clientId: value.clientId, @@ -64,7 +66,7 @@ export function validatePaymentConfig(config: PaymentConfig) { } function namedGateway(name: string, gateway: PaymentGateway): PaymentGateway { - return Object.freeze({ ...gateway, id: name }); + return Object.freeze({ ...gateway, id: name, provider: gateway.provider ?? gateway.id }); } export function paymentOptionsFromConfig( diff --git a/packages/payment/src/core.ts b/packages/payment/src/core.ts index 2c15a8ea..7f00776a 100644 --- a/packages/payment/src/core.ts +++ b/packages/payment/src/core.ts @@ -419,6 +419,7 @@ export function definePayment(options: PaymentOptions) { providers: () => [...adapters.values()].map((adapter) => ({ id: adapter.id, + provider: adapter.provider ?? adapter.id, capabilities: adapter.capabilities, supports: adapter.supports, })), diff --git a/packages/payment/src/types.ts b/packages/payment/src/types.ts index dfd7b71c..bfd44174 100644 --- a/packages/payment/src/types.ts +++ b/packages/payment/src/types.ts @@ -82,6 +82,8 @@ export interface WebhookEvent { export interface PaymentGateway { readonly id: string; + /** Built-in provider type when the id is an application-defined gateway alias. */ + readonly provider?: string; readonly config?: TConfig; readonly capabilities: GatewayCapabilities; readonly supports: GatewaySupport; diff --git a/packages/payment/test/config.test.ts b/packages/payment/test/config.test.ts index f9777456..7a48fda1 100644 --- a/packages/payment/test/config.test.ts +++ b/packages/payment/test/config.test.ts @@ -28,6 +28,7 @@ test("configuration creates any number of named provider gateways", () => { expect(options.default).toBe("india"); expect(options.adapters.map((adapter) => adapter.id)).toEqual(["india", "global"]); + expect(options.adapters.map((adapter) => adapter.provider)).toEqual(["razorpay", "stripe"]); expect(options.webhookSecrets).toEqual({ india: "razorpay-hook", global: "stripe-hook" }); }); diff --git a/packages/payment/test/runtime-api.test.ts b/packages/payment/test/runtime-api.test.ts index e151f97e..0d29736c 100644 --- a/packages/payment/test/runtime-api.test.ts +++ b/packages/payment/test/runtime-api.test.ts @@ -27,6 +27,7 @@ test("package APIs use server subjects and never expose gateway secrets", async const providerBody = await providers.text(); expect(providers.status).toBe(200); expect(providerBody).toContain("testGateway"); + expect(providerBody).toContain('"provider":"sandbox"'); expect(providerBody).not.toContain("server-only"); const denied = await POST({