1 | type Stripe = { |
2 | token: string; |
3 | }; |
4 | |
5 | * Post setup intents |
6 | * Creates a SetupIntent object. |
7 |
|
8 | After you create the SetupIntent, attach a payment method and confirm |
9 | it to collect any required permissions to charge the payment method later. |
10 | */ |
11 | export async function main( |
12 | auth: Stripe, |
13 | body: { |
14 | attach_to_self?: boolean; |
15 | automatic_payment_methods?: { |
16 | allow_redirects?: "always" | "never"; |
17 | enabled: boolean; |
18 | [k: string]: unknown; |
19 | }; |
20 | confirm?: boolean; |
21 | customer?: string; |
22 | description?: string; |
23 | expand?: string[]; |
24 | flow_directions?: ("inbound" | "outbound")[]; |
25 | mandate_data?: |
26 | | { |
27 | customer_acceptance: { |
28 | accepted_at?: number; |
29 | offline?: { [k: string]: unknown }; |
30 | online?: { |
31 | ip_address: string; |
32 | user_agent: string; |
33 | [k: string]: unknown; |
34 | }; |
35 | type: "offline" | "online"; |
36 | [k: string]: unknown; |
37 | }; |
38 | [k: string]: unknown; |
39 | } |
40 | | ""; |
41 | metadata?: { [k: string]: string }; |
42 | on_behalf_of?: string; |
43 | payment_method?: string; |
44 | payment_method_configuration?: string; |
45 | payment_method_data?: { |
46 | acss_debit?: { |
47 | account_number: string; |
48 | institution_number: string; |
49 | transit_number: string; |
50 | [k: string]: unknown; |
51 | }; |
52 | affirm?: { [k: string]: unknown }; |
53 | afterpay_clearpay?: { [k: string]: unknown }; |
54 | alipay?: { [k: string]: unknown }; |
55 | au_becs_debit?: { |
56 | account_number: string; |
57 | bsb_number: string; |
58 | [k: string]: unknown; |
59 | }; |
60 | bacs_debit?: { |
61 | account_number?: string; |
62 | sort_code?: string; |
63 | [k: string]: unknown; |
64 | }; |
65 | bancontact?: { [k: string]: unknown }; |
66 | billing_details?: { |
67 | address?: |
68 | | { |
69 | city?: string; |
70 | country?: string; |
71 | line1?: string; |
72 | line2?: string; |
73 | postal_code?: string; |
74 | state?: string; |
75 | [k: string]: unknown; |
76 | } |
77 | | ""; |
78 | email?: string | ""; |
79 | name?: string | ""; |
80 | phone?: string | ""; |
81 | [k: string]: unknown; |
82 | }; |
83 | blik?: { [k: string]: unknown }; |
84 | boleto?: { tax_id: string; [k: string]: unknown }; |
85 | cashapp?: { [k: string]: unknown }; |
86 | customer_balance?: { [k: string]: unknown }; |
87 | eps?: { |
88 | bank?: |
89 | | "arzte_und_apotheker_bank" |
90 | | "austrian_anadi_bank_ag" |
91 | | "bank_austria" |
92 | | "bankhaus_carl_spangler" |
93 | | "bankhaus_schelhammer_und_schattera_ag" |
94 | | "bawag_psk_ag" |
95 | | "bks_bank_ag" |
96 | | "brull_kallmus_bank_ag" |
97 | | "btv_vier_lander_bank" |
98 | | "capital_bank_grawe_gruppe_ag" |
99 | | "deutsche_bank_ag" |
100 | | "dolomitenbank" |
101 | | "easybank_ag" |
102 | | "erste_bank_und_sparkassen" |
103 | | "hypo_alpeadriabank_international_ag" |
104 | | "hypo_bank_burgenland_aktiengesellschaft" |
105 | | "hypo_noe_lb_fur_niederosterreich_u_wien" |
106 | | "hypo_oberosterreich_salzburg_steiermark" |
107 | | "hypo_tirol_bank_ag" |
108 | | "hypo_vorarlberg_bank_ag" |
109 | | "marchfelder_bank" |
110 | | "oberbank_ag" |
111 | | "raiffeisen_bankengruppe_osterreich" |
112 | | "schoellerbank_ag" |
113 | | "sparda_bank_wien" |
114 | | "volksbank_gruppe" |
115 | | "volkskreditbank_ag" |
116 | | "vr_bank_braunau"; |
117 | [k: string]: unknown; |
118 | }; |
119 | fpx?: { |
120 | bank: |
121 | | "affin_bank" |
122 | | "agrobank" |
123 | | "alliance_bank" |
124 | | "ambank" |
125 | | "bank_islam" |
126 | | "bank_muamalat" |
127 | | "bank_of_china" |
128 | | "bank_rakyat" |
129 | | "bsn" |
130 | | "cimb" |
131 | | "deutsche_bank" |
132 | | "hong_leong_bank" |
133 | | "hsbc" |
134 | | "kfh" |
135 | | "maybank2e" |
136 | | "maybank2u" |
137 | | "ocbc" |
138 | | "pb_enterprise" |
139 | | "public_bank" |
140 | | "rhb" |
141 | | "standard_chartered" |
142 | | "uob"; |
143 | [k: string]: unknown; |
144 | }; |
145 | giropay?: { [k: string]: unknown }; |
146 | grabpay?: { [k: string]: unknown }; |
147 | ideal?: { |
148 | bank?: |
149 | | "abn_amro" |
150 | | "asn_bank" |
151 | | "bunq" |
152 | | "handelsbanken" |
153 | | "ing" |
154 | | "knab" |
155 | | "moneyou" |
156 | | "n26" |
157 | | "nn" |
158 | | "rabobank" |
159 | | "regiobank" |
160 | | "revolut" |
161 | | "sns_bank" |
162 | | "triodos_bank" |
163 | | "van_lanschot" |
164 | | "yoursafe"; |
165 | [k: string]: unknown; |
166 | }; |
167 | interac_present?: { [k: string]: unknown }; |
168 | klarna?: { |
169 | dob?: { |
170 | day: number; |
171 | month: number; |
172 | year: number; |
173 | [k: string]: unknown; |
174 | }; |
175 | [k: string]: unknown; |
176 | }; |
177 | konbini?: { [k: string]: unknown }; |
178 | link?: { [k: string]: unknown }; |
179 | metadata?: { [k: string]: string }; |
180 | oxxo?: { [k: string]: unknown }; |
181 | p24?: { |
182 | bank?: |
183 | | "alior_bank" |
184 | | "bank_millennium" |
185 | | "bank_nowy_bfg_sa" |
186 | | "bank_pekao_sa" |
187 | | "banki_spbdzielcze" |
188 | | "blik" |
189 | | "bnp_paribas" |
190 | | "boz" |
191 | | "citi_handlowy" |
192 | | "credit_agricole" |
193 | | "envelobank" |
194 | | "etransfer_pocztowy24" |
195 | | "getin_bank" |
196 | | "ideabank" |
197 | | "ing" |
198 | | "inteligo" |
199 | | "mbank_mtransfer" |
200 | | "nest_przelew" |
201 | | "noble_pay" |
202 | | "pbac_z_ipko" |
203 | | "plus_bank" |
204 | | "santander_przelew24" |
205 | | "tmobile_usbugi_bankowe" |
206 | | "toyota_bank" |
207 | | "velobank" |
208 | | "volkswagen_bank"; |
209 | [k: string]: unknown; |
210 | }; |
211 | paynow?: { [k: string]: unknown }; |
212 | paypal?: { [k: string]: unknown }; |
213 | pix?: { [k: string]: unknown }; |
214 | promptpay?: { [k: string]: unknown }; |
215 | radar_options?: { session?: string; [k: string]: unknown }; |
216 | revolut_pay?: { [k: string]: unknown }; |
217 | sepa_debit?: { iban: string; [k: string]: unknown }; |
218 | sofort?: { |
219 | country: "AT" | "BE" | "DE" | "ES" | "IT" | "NL"; |
220 | [k: string]: unknown; |
221 | }; |
222 | swish?: { [k: string]: unknown }; |
223 | type: |
224 | | "acss_debit" |
225 | | "affirm" |
226 | | "afterpay_clearpay" |
227 | | "alipay" |
228 | | "au_becs_debit" |
229 | | "bacs_debit" |
230 | | "bancontact" |
231 | | "blik" |
232 | | "boleto" |
233 | | "cashapp" |
234 | | "customer_balance" |
235 | | "eps" |
236 | | "fpx" |
237 | | "giropay" |
238 | | "grabpay" |
239 | | "ideal" |
240 | | "klarna" |
241 | | "konbini" |
242 | | "link" |
243 | | "oxxo" |
244 | | "p24" |
245 | | "paynow" |
246 | | "paypal" |
247 | | "pix" |
248 | | "promptpay" |
249 | | "revolut_pay" |
250 | | "sepa_debit" |
251 | | "sofort" |
252 | | "swish" |
253 | | "us_bank_account" |
254 | | "wechat_pay" |
255 | | "zip"; |
256 | us_bank_account?: { |
257 | account_holder_type?: "company" | "individual"; |
258 | account_number?: string; |
259 | account_type?: "checking" | "savings"; |
260 | financial_connections_account?: string; |
261 | routing_number?: string; |
262 | [k: string]: unknown; |
263 | }; |
264 | wechat_pay?: { [k: string]: unknown }; |
265 | zip?: { [k: string]: unknown }; |
266 | [k: string]: unknown; |
267 | }; |
268 | payment_method_options?: { |
269 | acss_debit?: { |
270 | currency?: "cad" | "usd"; |
271 | mandate_options?: { |
272 | custom_mandate_url?: string | ""; |
273 | default_for?: ("invoice" | "subscription")[]; |
274 | interval_description?: string; |
275 | payment_schedule?: "combined" | "interval" | "sporadic"; |
276 | transaction_type?: "business" | "personal"; |
277 | [k: string]: unknown; |
278 | }; |
279 | verification_method?: "automatic" | "instant" | "microdeposits"; |
280 | [k: string]: unknown; |
281 | }; |
282 | card?: { |
283 | mandate_options?: { |
284 | amount: number; |
285 | amount_type: "fixed" | "maximum"; |
286 | currency: string; |
287 | description?: string; |
288 | end_date?: number; |
289 | interval: "day" | "month" | "sporadic" | "week" | "year"; |
290 | interval_count?: number; |
291 | reference: string; |
292 | start_date: number; |
293 | supported_types?: "india"[]; |
294 | [k: string]: unknown; |
295 | }; |
296 | network?: |
297 | | "amex" |
298 | | "cartes_bancaires" |
299 | | "diners" |
300 | | "discover" |
301 | | "eftpos_au" |
302 | | "interac" |
303 | | "jcb" |
304 | | "mastercard" |
305 | | "unionpay" |
306 | | "unknown" |
307 | | "visa"; |
308 | request_three_d_secure?: "any" | "automatic" | "challenge"; |
309 | three_d_secure?: { |
310 | ares_trans_status?: "A" | "C" | "I" | "N" | "R" | "U" | "Y"; |
311 | cryptogram?: string; |
312 | electronic_commerce_indicator?: "01" | "02" | "05" | "06" | "07"; |
313 | network_options?: { |
314 | cartes_bancaires?: { |
315 | cb_avalgo: "0" | "1" | "2" | "3" | "4" | "A"; |
316 | cb_exemption?: string; |
317 | cb_score?: number; |
318 | [k: string]: unknown; |
319 | }; |
320 | [k: string]: unknown; |
321 | }; |
322 | requestor_challenge_indicator?: string; |
323 | transaction_id?: string; |
324 | version?: "1.0.2" | "2.1.0" | "2.2.0"; |
325 | [k: string]: unknown; |
326 | }; |
327 | [k: string]: unknown; |
328 | }; |
329 | link?: { [k: string]: unknown }; |
330 | paypal?: { billing_agreement_id?: string; [k: string]: unknown }; |
331 | sepa_debit?: { |
332 | mandate_options?: { [k: string]: unknown }; |
333 | [k: string]: unknown; |
334 | }; |
335 | us_bank_account?: { |
336 | financial_connections?: { |
337 | permissions?: ( |
338 | | "balances" |
339 | | "ownership" |
340 | | "payment_method" |
341 | | "transactions" |
342 | )[]; |
343 | prefetch?: ("balances" | "transactions")[]; |
344 | return_url?: string; |
345 | [k: string]: unknown; |
346 | }; |
347 | mandate_options?: { |
348 | collection_method?: "" | "paper"; |
349 | [k: string]: unknown; |
350 | }; |
351 | networks?: { |
352 | requested?: ("ach" | "us_domestic_wire")[]; |
353 | [k: string]: unknown; |
354 | }; |
355 | verification_method?: "automatic" | "instant" | "microdeposits"; |
356 | [k: string]: unknown; |
357 | }; |
358 | [k: string]: unknown; |
359 | }; |
360 | payment_method_types?: string[]; |
361 | return_url?: string; |
362 | single_use?: { amount: number; currency: string; [k: string]: unknown }; |
363 | usage?: "off_session" | "on_session"; |
364 | use_stripe_sdk?: boolean; |
365 | } |
366 | ) { |
367 | const url = new URL(`https://api.stripe.com/v1/setup_intents`); |
368 |
|
369 | const response = await fetch(url, { |
370 | method: "POST", |
371 | headers: { |
372 | "Content-Type": "application/x-www-form-urlencoded", |
373 | Authorization: "Bearer " + auth.token, |
374 | }, |
375 | body: encodeParams(body), |
376 | }); |
377 | if (!response.ok) { |
378 | const text = await response.text(); |
379 | throw new Error(`${response.status} ${text}`); |
380 | } |
381 | return await response.json(); |
382 | } |
383 |
|
384 | function encodeParams(o: any) { |
385 | function iter(o: any, path: string) { |
386 | if (Array.isArray(o)) { |
387 | o.forEach(function (a) { |
388 | iter(a, path + "[]"); |
389 | }); |
390 | return; |
391 | } |
392 | if (o !== null && typeof o === "object") { |
393 | Object.keys(o).forEach(function (k) { |
394 | iter(o[k], path + "[" + k + "]"); |
395 | }); |
396 | return; |
397 | } |
398 | data.push(path + "=" + o); |
399 | } |
400 | const data: string[] = []; |
401 | Object.keys(o).forEach(function (k) { |
402 | if (o[k] !== undefined) { |
403 | iter(o[k], k); |
404 | } |
405 | }); |
406 | return new URLSearchParams(data.join("&")); |
407 | } |
408 |
|