From 6a7a98301dd86fbf8e28a13e6dd70290f5eefa0c Mon Sep 17 00:00:00 2001 From: Tuna Date: Thu, 25 Sep 2025 17:02:06 +0700 Subject: [PATCH 1/3] fix: correct return for update card payment --- .../src/SubscriptionController.test.ts | 12 ++++++------ .../src/SubscriptionController.ts | 14 +++++++++----- .../src/SubscriptionService.ts | 17 ++++++++++++----- packages/subscription-controller/src/types.ts | 8 ++++++-- 4 files changed, 33 insertions(+), 18 deletions(-) diff --git a/packages/subscription-controller/src/SubscriptionController.test.ts b/packages/subscription-controller/src/SubscriptionController.test.ts index 2e8fc1a22f..e36989e73e 100644 --- a/packages/subscription-controller/src/SubscriptionController.test.ts +++ b/packages/subscription-controller/src/SubscriptionController.test.ts @@ -1014,12 +1014,15 @@ describe('SubscriptionController', () => { describe('updatePaymentMethod', () => { it('should update card payment method successfully', async () => { await withController(async ({ controller, mockService }) => { - mockService.updatePaymentMethodCard.mockResolvedValue({}); + const redirectUrl = 'https://redirect.com'; + mockService.updatePaymentMethodCard.mockResolvedValue({ + redirectUrl, + }); mockService.getSubscriptions.mockResolvedValue( MOCK_GET_SUBSCRIPTIONS_RESPONSE, ); - await controller.updatePaymentMethod({ + const result = await controller.updatePaymentMethod({ subscriptionId: 'sub_123456789', paymentType: PAYMENT_TYPES.byCard, recurringInterval: RECURRING_INTERVALS.month, @@ -1029,10 +1032,7 @@ describe('SubscriptionController', () => { subscriptionId: 'sub_123456789', recurringInterval: RECURRING_INTERVALS.month, }); - - expect(controller.state.subscriptions).toStrictEqual([ - MOCK_SUBSCRIPTION, - ]); + expect(result).toStrictEqual({ redirectUrl }); }); }); diff --git a/packages/subscription-controller/src/SubscriptionController.ts b/packages/subscription-controller/src/SubscriptionController.ts index 06adda1c07..0ad0076b81 100644 --- a/packages/subscription-controller/src/SubscriptionController.ts +++ b/packages/subscription-controller/src/SubscriptionController.ts @@ -18,6 +18,7 @@ import type { ProductPrice, StartCryptoSubscriptionRequest, TokenPaymentInfo, + UpdatePaymentMethodCardResponse, UpdatePaymentMethodOpts, } from './types'; import { @@ -384,17 +385,20 @@ export class SubscriptionController extends BaseController< }; } - async updatePaymentMethod(opts: UpdatePaymentMethodOpts) { + async updatePaymentMethod( + opts: UpdatePaymentMethodOpts, + ): Promise { if (opts.paymentType === PAYMENT_TYPES.byCard) { const { paymentType, ...cardRequest } = opts; - await this.#subscriptionService.updatePaymentMethodCard(cardRequest); + return await this.#subscriptionService.updatePaymentMethodCard( + cardRequest, + ); } else if (opts.paymentType === PAYMENT_TYPES.byCrypto) { const { paymentType, ...cryptoRequest } = opts; await this.#subscriptionService.updatePaymentMethodCrypto(cryptoRequest); - } else { - throw new Error('Invalid payment type'); + return await this.getSubscriptions(); } - await this.getSubscriptions(); + throw new Error('Invalid payment type'); } /** diff --git a/packages/subscription-controller/src/SubscriptionService.ts b/packages/subscription-controller/src/SubscriptionService.ts index 72327d8807..d342eec6f9 100644 --- a/packages/subscription-controller/src/SubscriptionService.ts +++ b/packages/subscription-controller/src/SubscriptionService.ts @@ -18,6 +18,7 @@ import type { StartSubscriptionResponse, Subscription, UpdatePaymentMethodCardRequest, + UpdatePaymentMethodCardResponse, UpdatePaymentMethodCryptoRequest, } from './types'; @@ -78,12 +79,18 @@ export class SubscriptionService implements ISubscriptionService { return await this.#makeRequest(path, 'POST', request); } - async updatePaymentMethodCard(request: UpdatePaymentMethodCardRequest) { + async updatePaymentMethodCard( + request: UpdatePaymentMethodCardRequest, + ): Promise { const path = `subscriptions/${request.subscriptionId}/payment-method/card`; - await this.#makeRequest(path, 'PATCH', { - ...request, - subscriptionId: undefined, - }); + return await this.#makeRequest( + path, + 'PATCH', + { + ...request, + subscriptionId: undefined, + }, + ); } async updatePaymentMethodCrypto(request: UpdatePaymentMethodCryptoRequest) { diff --git a/packages/subscription-controller/src/types.ts b/packages/subscription-controller/src/types.ts index b69a3fb624..adba95a61c 100644 --- a/packages/subscription-controller/src/types.ts +++ b/packages/subscription-controller/src/types.ts @@ -77,7 +77,7 @@ export type Subscription = { trialPeriodDays?: number; trialStart?: string; // ISO 8601 trialEnd?: string; // ISO 8601 - /** is subscription ending soon */ + /** Crypto payment only: next billing cycle date (e.g after 12 months) */ endDate?: string; // ISO 8601 billingCycles?: number; }; @@ -239,7 +239,7 @@ export type ISubscriptionService = { ): Promise; updatePaymentMethodCard( request: UpdatePaymentMethodCardRequest, - ): Promise; + ): Promise; updatePaymentMethodCrypto( request: UpdatePaymentMethodCryptoRequest, ): Promise; @@ -266,6 +266,10 @@ export type UpdatePaymentMethodCardRequest = { successUrl?: string; }; +export type UpdatePaymentMethodCardResponse = { + redirectUrl: string; +}; + export type UpdatePaymentMethodCryptoRequest = { subscriptionId: string; chainId: Hex; From 24798885b1a0d735ffccac38558296ab37278f22 Mon Sep 17 00:00:00 2001 From: Tuna Date: Thu, 25 Sep 2025 17:02:13 +0700 Subject: [PATCH 2/3] fix: export missing action --- packages/subscription-controller/src/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/subscription-controller/src/index.ts b/packages/subscription-controller/src/index.ts index 36ac501244..f722dfc205 100644 --- a/packages/subscription-controller/src/index.ts +++ b/packages/subscription-controller/src/index.ts @@ -8,6 +8,7 @@ export type { SubscriptionControllerGetPricingAction, SubscriptionControllerGetCryptoApproveTransactionParamsAction, SubscriptionControllerStartSubscriptionWithCryptoAction, + SubscriptionControllerUpdatePaymentMethodAction, SubscriptionControllerGetStateAction, SubscriptionControllerMessenger, SubscriptionControllerOptions, From 43e9c54a880db677aca70ba15ea348068d0632e3 Mon Sep 17 00:00:00 2001 From: Tuna Date: Thu, 25 Sep 2025 17:04:49 +0700 Subject: [PATCH 3/3] chore: update changelog --- packages/subscription-controller/CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/subscription-controller/CHANGELOG.md b/packages/subscription-controller/CHANGELOG.md index d7ca822577..2bd033cb57 100644 --- a/packages/subscription-controller/CHANGELOG.md +++ b/packages/subscription-controller/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Changed + +- `updatePaymentMethod` return `redirectUrl` for card payment ([#6726](https://github.com/MetaMask/core/pull/6726)) + ## [0.3.0] ### Added