Skip to content

Commit 39c195b

Browse files
committed
Add getCustomerDefaultPaymentMethod method
1 parent 6645ad4 commit 39c195b

1 file changed

Lines changed: 104 additions & 0 deletions

File tree

src/helpers/stripe_helpers.ts

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,37 @@ export interface StripePaymentMethod {
2222
};
2323
}
2424

25+
export interface StripeDefaultPaymentMethod {
26+
id: string;
27+
type: 'card' | 'us_bank_account';
28+
object?: string;
29+
card?: StripeCard;
30+
us_bank_account?: StripeUSBankAccount;
31+
}
32+
33+
export interface StripeCustomer {
34+
data: {
35+
invoice_settings?: {
36+
default_payment_method?: StripeDefaultPaymentMethod;
37+
};
38+
sources?: {
39+
data: Array<StripeCard & { id?: string; object?: string }>;
40+
};
41+
};
42+
}
43+
44+
export interface CustomerDefaultPaymentMethod {
45+
isPaymentMethod: boolean;
46+
label: string;
47+
last4: string;
48+
expMonth?: number;
49+
expYear?: number;
50+
bankName?: string;
51+
brand?: string;
52+
id: string;
53+
object: string;
54+
}
55+
2556
export class StripeHelpers {
2657
/**
2758
* Returns a formatted card brand label. Abbreviates "American Express" to "Amex".
@@ -74,4 +105,77 @@ export class StripeHelpers {
74105
}
75106
return 'Unknown Card';
76107
}
108+
109+
/**
110+
* Extracts the default payment method from a Stripe customer object
111+
* @param stripeCustomer - A stripe customer object as returned by the API
112+
* @param useFallback - Whether to return a dummy card if no card is found
113+
* @returns Payment method information or null
114+
*/
115+
static getCustomerDefaultPaymentMethod(
116+
stripeCustomer: StripeCustomer | null,
117+
useFallback = false
118+
): CustomerDefaultPaymentMethod | null {
119+
if (!stripeCustomer || !stripeCustomer.data) return null;
120+
121+
const defaultPaymentMethod = stripeCustomer.data.invoice_settings?.default_payment_method;
122+
123+
if (defaultPaymentMethod?.type === 'card' && defaultPaymentMethod.card) {
124+
const { card } = defaultPaymentMethod;
125+
return {
126+
isPaymentMethod: true,
127+
label: StripeHelpers.getCardLabel(card),
128+
last4: card.last4 || '',
129+
expMonth: card.exp_month,
130+
expYear: card.exp_year,
131+
brand: card.brand,
132+
id: defaultPaymentMethod.id,
133+
object: defaultPaymentMethod.object || 'payment_method',
134+
};
135+
} else if (
136+
defaultPaymentMethod?.type === 'us_bank_account' &&
137+
defaultPaymentMethod.us_bank_account
138+
) {
139+
const { us_bank_account } = defaultPaymentMethod;
140+
return {
141+
isPaymentMethod: true,
142+
label: StripeHelpers.getUSBankAccountLabel(us_bank_account),
143+
last4: us_bank_account.last4,
144+
bankName: us_bank_account.bank_name,
145+
id: defaultPaymentMethod.id,
146+
object: defaultPaymentMethod.object || 'payment_method',
147+
};
148+
}
149+
150+
const defaultSource = stripeCustomer.data.sources?.data?.[0];
151+
152+
if (defaultSource && 'last4' in defaultSource && 'exp_month' in defaultSource) {
153+
const card = defaultSource as StripeCard & { id?: string; object?: string };
154+
return {
155+
isPaymentMethod: false,
156+
label: StripeHelpers.getCardLabel(card),
157+
last4: card.last4 || '',
158+
expMonth: card.exp_month,
159+
expYear: card.exp_year,
160+
brand: card.brand,
161+
id: card.id || '',
162+
object: card.object || 'card',
163+
};
164+
}
165+
166+
if (useFallback) {
167+
return {
168+
isPaymentMethod: false,
169+
label: 'Unknown Card',
170+
last4: 'XXXX',
171+
expMonth: 0,
172+
expYear: 0,
173+
brand: 'Unknown',
174+
id: 'N/A',
175+
object: 'card',
176+
};
177+
}
178+
179+
return null;
180+
}
77181
}

0 commit comments

Comments
 (0)