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