@@ -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+
2556export 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