1 | type Stripe = { |
2 | token: string; |
3 | }; |
4 | |
5 | * Post payment methods |
6 | * Creates a PaymentMethod object. Read the Stripe.js reference to learn how to create PaymentMethods via Stripe.js. |
7 |
|
8 | Instead of creating a PaymentMethod directly, we recommend using the PaymentIntents API to accept a payment immediately or the SetupIntent API to collect payment method details ahead of a future payment. |
9 | */ |
10 | export async function main( |
11 | auth: Stripe, |
12 | body: { |
13 | acss_debit?: { |
14 | account_number: string; |
15 | institution_number: string; |
16 | transit_number: string; |
17 | [k: string]: unknown; |
18 | }; |
19 | affirm?: { [k: string]: unknown }; |
20 | afterpay_clearpay?: { [k: string]: unknown }; |
21 | alipay?: { [k: string]: unknown }; |
22 | au_becs_debit?: { |
23 | account_number: string; |
24 | bsb_number: string; |
25 | [k: string]: unknown; |
26 | }; |
27 | bacs_debit?: { |
28 | account_number?: string; |
29 | sort_code?: string; |
30 | [k: string]: unknown; |
31 | }; |
32 | bancontact?: { [k: string]: unknown }; |
33 | billing_details?: { |
34 | address?: |
35 | | { |
36 | city?: string; |
37 | country?: string; |
38 | line1?: string; |
39 | line2?: string; |
40 | postal_code?: string; |
41 | state?: string; |
42 | [k: string]: unknown; |
43 | } |
44 | | ""; |
45 | email?: string | ""; |
46 | name?: string | ""; |
47 | phone?: string | ""; |
48 | [k: string]: unknown; |
49 | }; |
50 | blik?: { [k: string]: unknown }; |
51 | boleto?: { tax_id: string; [k: string]: unknown }; |
52 | card?: |
53 | | { |
54 | cvc?: string; |
55 | exp_month: number; |
56 | exp_year: number; |
57 | networks?: { |
58 | preferred?: "cartes_bancaires" | "mastercard" | "visa"; |
59 | [k: string]: unknown; |
60 | }; |
61 | number: string; |
62 | [k: string]: unknown; |
63 | } |
64 | | { token: string; [k: string]: unknown }; |
65 | cashapp?: { [k: string]: unknown }; |
66 | customer?: string; |
67 | customer_balance?: { [k: string]: unknown }; |
68 | eps?: { |
69 | bank?: |
70 | | "arzte_und_apotheker_bank" |
71 | | "austrian_anadi_bank_ag" |
72 | | "bank_austria" |
73 | | "bankhaus_carl_spangler" |
74 | | "bankhaus_schelhammer_und_schattera_ag" |
75 | | "bawag_psk_ag" |
76 | | "bks_bank_ag" |
77 | | "brull_kallmus_bank_ag" |
78 | | "btv_vier_lander_bank" |
79 | | "capital_bank_grawe_gruppe_ag" |
80 | | "deutsche_bank_ag" |
81 | | "dolomitenbank" |
82 | | "easybank_ag" |
83 | | "erste_bank_und_sparkassen" |
84 | | "hypo_alpeadriabank_international_ag" |
85 | | "hypo_bank_burgenland_aktiengesellschaft" |
86 | | "hypo_noe_lb_fur_niederosterreich_u_wien" |
87 | | "hypo_oberosterreich_salzburg_steiermark" |
88 | | "hypo_tirol_bank_ag" |
89 | | "hypo_vorarlberg_bank_ag" |
90 | | "marchfelder_bank" |
91 | | "oberbank_ag" |
92 | | "raiffeisen_bankengruppe_osterreich" |
93 | | "schoellerbank_ag" |
94 | | "sparda_bank_wien" |
95 | | "volksbank_gruppe" |
96 | | "volkskreditbank_ag" |
97 | | "vr_bank_braunau"; |
98 | [k: string]: unknown; |
99 | }; |
100 | expand?: string[]; |
101 | fpx?: { |
102 | bank: |
103 | | "affin_bank" |
104 | | "agrobank" |
105 | | "alliance_bank" |
106 | | "ambank" |
107 | | "bank_islam" |
108 | | "bank_muamalat" |
109 | | "bank_of_china" |
110 | | "bank_rakyat" |
111 | | "bsn" |
112 | | "cimb" |
113 | | "deutsche_bank" |
114 | | "hong_leong_bank" |
115 | | "hsbc" |
116 | | "kfh" |
117 | | "maybank2e" |
118 | | "maybank2u" |
119 | | "ocbc" |
120 | | "pb_enterprise" |
121 | | "public_bank" |
122 | | "rhb" |
123 | | "standard_chartered" |
124 | | "uob"; |
125 | [k: string]: unknown; |
126 | }; |
127 | giropay?: { [k: string]: unknown }; |
128 | grabpay?: { [k: string]: unknown }; |
129 | ideal?: { |
130 | bank?: |
131 | | "abn_amro" |
132 | | "asn_bank" |
133 | | "bunq" |
134 | | "handelsbanken" |
135 | | "ing" |
136 | | "knab" |
137 | | "moneyou" |
138 | | "n26" |
139 | | "nn" |
140 | | "rabobank" |
141 | | "regiobank" |
142 | | "revolut" |
143 | | "sns_bank" |
144 | | "triodos_bank" |
145 | | "van_lanschot" |
146 | | "yoursafe"; |
147 | [k: string]: unknown; |
148 | }; |
149 | interac_present?: { [k: string]: unknown }; |
150 | klarna?: { |
151 | dob?: { day: number; month: number; year: number; [k: string]: unknown }; |
152 | [k: string]: unknown; |
153 | }; |
154 | konbini?: { [k: string]: unknown }; |
155 | link?: { [k: string]: unknown }; |
156 | metadata?: { [k: string]: string }; |
157 | oxxo?: { [k: string]: unknown }; |
158 | p24?: { |
159 | bank?: |
160 | | "alior_bank" |
161 | | "bank_millennium" |
162 | | "bank_nowy_bfg_sa" |
163 | | "bank_pekao_sa" |
164 | | "banki_spbdzielcze" |
165 | | "blik" |
166 | | "bnp_paribas" |
167 | | "boz" |
168 | | "citi_handlowy" |
169 | | "credit_agricole" |
170 | | "envelobank" |
171 | | "etransfer_pocztowy24" |
172 | | "getin_bank" |
173 | | "ideabank" |
174 | | "ing" |
175 | | "inteligo" |
176 | | "mbank_mtransfer" |
177 | | "nest_przelew" |
178 | | "noble_pay" |
179 | | "pbac_z_ipko" |
180 | | "plus_bank" |
181 | | "santander_przelew24" |
182 | | "tmobile_usbugi_bankowe" |
183 | | "toyota_bank" |
184 | | "velobank" |
185 | | "volkswagen_bank"; |
186 | [k: string]: unknown; |
187 | }; |
188 | payment_method?: string; |
189 | paynow?: { [k: string]: unknown }; |
190 | paypal?: { [k: string]: unknown }; |
191 | pix?: { [k: string]: unknown }; |
192 | promptpay?: { [k: string]: unknown }; |
193 | radar_options?: { session?: string; [k: string]: unknown }; |
194 | revolut_pay?: { [k: string]: unknown }; |
195 | sepa_debit?: { iban: string; [k: string]: unknown }; |
196 | sofort?: { |
197 | country: "AT" | "BE" | "DE" | "ES" | "IT" | "NL"; |
198 | [k: string]: unknown; |
199 | }; |
200 | swish?: { [k: string]: unknown }; |
201 | type?: |
202 | | "acss_debit" |
203 | | "affirm" |
204 | | "afterpay_clearpay" |
205 | | "alipay" |
206 | | "au_becs_debit" |
207 | | "bacs_debit" |
208 | | "bancontact" |
209 | | "blik" |
210 | | "boleto" |
211 | | "card" |
212 | | "cashapp" |
213 | | "customer_balance" |
214 | | "eps" |
215 | | "fpx" |
216 | | "giropay" |
217 | | "grabpay" |
218 | | "ideal" |
219 | | "klarna" |
220 | | "konbini" |
221 | | "link" |
222 | | "oxxo" |
223 | | "p24" |
224 | | "paynow" |
225 | | "paypal" |
226 | | "pix" |
227 | | "promptpay" |
228 | | "revolut_pay" |
229 | | "sepa_debit" |
230 | | "sofort" |
231 | | "swish" |
232 | | "us_bank_account" |
233 | | "wechat_pay" |
234 | | "zip"; |
235 | us_bank_account?: { |
236 | account_holder_type?: "company" | "individual"; |
237 | account_number?: string; |
238 | account_type?: "checking" | "savings"; |
239 | financial_connections_account?: string; |
240 | routing_number?: string; |
241 | [k: string]: unknown; |
242 | }; |
243 | wechat_pay?: { [k: string]: unknown }; |
244 | zip?: { [k: string]: unknown }; |
245 | } |
246 | ) { |
247 | const url = new URL(`https://api.stripe.com/v1/payment_methods`); |
248 |
|
249 | const response = await fetch(url, { |
250 | method: "POST", |
251 | headers: { |
252 | "Content-Type": "application/x-www-form-urlencoded", |
253 | Authorization: "Bearer " + auth.token, |
254 | }, |
255 | body: encodeParams(body), |
256 | }); |
257 | if (!response.ok) { |
258 | const text = await response.text(); |
259 | throw new Error(`${response.status} ${text}`); |
260 | } |
261 | return await response.json(); |
262 | } |
263 |
|
264 | function encodeParams(o: any) { |
265 | function iter(o: any, path: string) { |
266 | if (Array.isArray(o)) { |
267 | o.forEach(function (a) { |
268 | iter(a, path + "[]"); |
269 | }); |
270 | return; |
271 | } |
272 | if (o !== null && typeof o === "object") { |
273 | Object.keys(o).forEach(function (k) { |
274 | iter(o[k], path + "[" + k + "]"); |
275 | }); |
276 | return; |
277 | } |
278 | data.push(path + "=" + o); |
279 | } |
280 | const data: string[] = []; |
281 | Object.keys(o).forEach(function (k) { |
282 | if (o[k] !== undefined) { |
283 | iter(o[k], k); |
284 | } |
285 | }); |
286 | return new URLSearchParams(data.join("&")); |
287 | } |
288 |
|