1 | type Stripe = { |
2 | token: string; |
3 | }; |
4 | |
5 | * Post payment intents intent confirm |
6 | * Confirm that your customer intends to pay with current or provided |
7 | payment method. |
8 | */ |
9 | export async function main( |
10 | auth: Stripe, |
11 | intent: string, |
12 | body: { |
13 | capture_method?: "automatic" | "automatic_async" | "manual"; |
14 | client_secret?: string; |
15 | error_on_requires_action?: boolean; |
16 | expand?: string[]; |
17 | mandate?: string; |
18 | mandate_data?: |
19 | | { |
20 | customer_acceptance: { |
21 | accepted_at?: number; |
22 | offline?: { [k: string]: unknown }; |
23 | online?: { |
24 | ip_address: string; |
25 | user_agent: string; |
26 | [k: string]: unknown; |
27 | }; |
28 | type: "offline" | "online"; |
29 | [k: string]: unknown; |
30 | }; |
31 | [k: string]: unknown; |
32 | } |
33 | | "" |
34 | | { |
35 | customer_acceptance: { |
36 | online: { |
37 | ip_address?: string; |
38 | user_agent?: string; |
39 | [k: string]: unknown; |
40 | }; |
41 | type: "online"; |
42 | [k: string]: unknown; |
43 | }; |
44 | [k: string]: unknown; |
45 | }; |
46 | off_session?: boolean | ("one_off" | "recurring"); |
47 | payment_method?: string; |
48 | payment_method_data?: { |
49 | acss_debit?: { |
50 | account_number: string; |
51 | institution_number: string; |
52 | transit_number: string; |
53 | [k: string]: unknown; |
54 | }; |
55 | affirm?: { [k: string]: unknown }; |
56 | afterpay_clearpay?: { [k: string]: unknown }; |
57 | alipay?: { [k: string]: unknown }; |
58 | au_becs_debit?: { |
59 | account_number: string; |
60 | bsb_number: string; |
61 | [k: string]: unknown; |
62 | }; |
63 | bacs_debit?: { |
64 | account_number?: string; |
65 | sort_code?: string; |
66 | [k: string]: unknown; |
67 | }; |
68 | bancontact?: { [k: string]: unknown }; |
69 | billing_details?: { |
70 | address?: |
71 | | { |
72 | city?: string; |
73 | country?: string; |
74 | line1?: string; |
75 | line2?: string; |
76 | postal_code?: string; |
77 | state?: string; |
78 | [k: string]: unknown; |
79 | } |
80 | | ""; |
81 | email?: string | ""; |
82 | name?: string | ""; |
83 | phone?: string | ""; |
84 | [k: string]: unknown; |
85 | }; |
86 | blik?: { [k: string]: unknown }; |
87 | boleto?: { tax_id: string; [k: string]: unknown }; |
88 | cashapp?: { [k: string]: unknown }; |
89 | customer_balance?: { [k: string]: unknown }; |
90 | eps?: { |
91 | bank?: |
92 | | "arzte_und_apotheker_bank" |
93 | | "austrian_anadi_bank_ag" |
94 | | "bank_austria" |
95 | | "bankhaus_carl_spangler" |
96 | | "bankhaus_schelhammer_und_schattera_ag" |
97 | | "bawag_psk_ag" |
98 | | "bks_bank_ag" |
99 | | "brull_kallmus_bank_ag" |
100 | | "btv_vier_lander_bank" |
101 | | "capital_bank_grawe_gruppe_ag" |
102 | | "deutsche_bank_ag" |
103 | | "dolomitenbank" |
104 | | "easybank_ag" |
105 | | "erste_bank_und_sparkassen" |
106 | | "hypo_alpeadriabank_international_ag" |
107 | | "hypo_bank_burgenland_aktiengesellschaft" |
108 | | "hypo_noe_lb_fur_niederosterreich_u_wien" |
109 | | "hypo_oberosterreich_salzburg_steiermark" |
110 | | "hypo_tirol_bank_ag" |
111 | | "hypo_vorarlberg_bank_ag" |
112 | | "marchfelder_bank" |
113 | | "oberbank_ag" |
114 | | "raiffeisen_bankengruppe_osterreich" |
115 | | "schoellerbank_ag" |
116 | | "sparda_bank_wien" |
117 | | "volksbank_gruppe" |
118 | | "volkskreditbank_ag" |
119 | | "vr_bank_braunau"; |
120 | [k: string]: unknown; |
121 | }; |
122 | fpx?: { |
123 | bank: |
124 | | "affin_bank" |
125 | | "agrobank" |
126 | | "alliance_bank" |
127 | | "ambank" |
128 | | "bank_islam" |
129 | | "bank_muamalat" |
130 | | "bank_of_china" |
131 | | "bank_rakyat" |
132 | | "bsn" |
133 | | "cimb" |
134 | | "deutsche_bank" |
135 | | "hong_leong_bank" |
136 | | "hsbc" |
137 | | "kfh" |
138 | | "maybank2e" |
139 | | "maybank2u" |
140 | | "ocbc" |
141 | | "pb_enterprise" |
142 | | "public_bank" |
143 | | "rhb" |
144 | | "standard_chartered" |
145 | | "uob"; |
146 | [k: string]: unknown; |
147 | }; |
148 | giropay?: { [k: string]: unknown }; |
149 | grabpay?: { [k: string]: unknown }; |
150 | ideal?: { |
151 | bank?: |
152 | | "abn_amro" |
153 | | "asn_bank" |
154 | | "bunq" |
155 | | "handelsbanken" |
156 | | "ing" |
157 | | "knab" |
158 | | "moneyou" |
159 | | "n26" |
160 | | "nn" |
161 | | "rabobank" |
162 | | "regiobank" |
163 | | "revolut" |
164 | | "sns_bank" |
165 | | "triodos_bank" |
166 | | "van_lanschot" |
167 | | "yoursafe"; |
168 | [k: string]: unknown; |
169 | }; |
170 | interac_present?: { [k: string]: unknown }; |
171 | klarna?: { |
172 | dob?: { |
173 | day: number; |
174 | month: number; |
175 | year: number; |
176 | [k: string]: unknown; |
177 | }; |
178 | [k: string]: unknown; |
179 | }; |
180 | konbini?: { [k: string]: unknown }; |
181 | link?: { [k: string]: unknown }; |
182 | metadata?: { [k: string]: string }; |
183 | oxxo?: { [k: string]: unknown }; |
184 | p24?: { |
185 | bank?: |
186 | | "alior_bank" |
187 | | "bank_millennium" |
188 | | "bank_nowy_bfg_sa" |
189 | | "bank_pekao_sa" |
190 | | "banki_spbdzielcze" |
191 | | "blik" |
192 | | "bnp_paribas" |
193 | | "boz" |
194 | | "citi_handlowy" |
195 | | "credit_agricole" |
196 | | "envelobank" |
197 | | "etransfer_pocztowy24" |
198 | | "getin_bank" |
199 | | "ideabank" |
200 | | "ing" |
201 | | "inteligo" |
202 | | "mbank_mtransfer" |
203 | | "nest_przelew" |
204 | | "noble_pay" |
205 | | "pbac_z_ipko" |
206 | | "plus_bank" |
207 | | "santander_przelew24" |
208 | | "tmobile_usbugi_bankowe" |
209 | | "toyota_bank" |
210 | | "velobank" |
211 | | "volkswagen_bank"; |
212 | [k: string]: unknown; |
213 | }; |
214 | paynow?: { [k: string]: unknown }; |
215 | paypal?: { [k: string]: unknown }; |
216 | pix?: { [k: string]: unknown }; |
217 | promptpay?: { [k: string]: unknown }; |
218 | radar_options?: { session?: string; [k: string]: unknown }; |
219 | revolut_pay?: { [k: string]: unknown }; |
220 | sepa_debit?: { iban: string; [k: string]: unknown }; |
221 | sofort?: { |
222 | country: "AT" | "BE" | "DE" | "ES" | "IT" | "NL"; |
223 | [k: string]: unknown; |
224 | }; |
225 | swish?: { [k: string]: unknown }; |
226 | type: |
227 | | "acss_debit" |
228 | | "affirm" |
229 | | "afterpay_clearpay" |
230 | | "alipay" |
231 | | "au_becs_debit" |
232 | | "bacs_debit" |
233 | | "bancontact" |
234 | | "blik" |
235 | | "boleto" |
236 | | "cashapp" |
237 | | "customer_balance" |
238 | | "eps" |
239 | | "fpx" |
240 | | "giropay" |
241 | | "grabpay" |
242 | | "ideal" |
243 | | "klarna" |
244 | | "konbini" |
245 | | "link" |
246 | | "oxxo" |
247 | | "p24" |
248 | | "paynow" |
249 | | "paypal" |
250 | | "pix" |
251 | | "promptpay" |
252 | | "revolut_pay" |
253 | | "sepa_debit" |
254 | | "sofort" |
255 | | "swish" |
256 | | "us_bank_account" |
257 | | "wechat_pay" |
258 | | "zip"; |
259 | us_bank_account?: { |
260 | account_holder_type?: "company" | "individual"; |
261 | account_number?: string; |
262 | account_type?: "checking" | "savings"; |
263 | financial_connections_account?: string; |
264 | routing_number?: string; |
265 | [k: string]: unknown; |
266 | }; |
267 | wechat_pay?: { [k: string]: unknown }; |
268 | zip?: { [k: string]: unknown }; |
269 | [k: string]: unknown; |
270 | }; |
271 | payment_method_options?: { |
272 | acss_debit?: |
273 | | { |
274 | mandate_options?: { |
275 | custom_mandate_url?: string | ""; |
276 | interval_description?: string; |
277 | payment_schedule?: "combined" | "interval" | "sporadic"; |
278 | transaction_type?: "business" | "personal"; |
279 | [k: string]: unknown; |
280 | }; |
281 | setup_future_usage?: "" | "none" | "off_session" | "on_session"; |
282 | verification_method?: "automatic" | "instant" | "microdeposits"; |
283 | [k: string]: unknown; |
284 | } |
285 | | ""; |
286 | affirm?: |
287 | | { |
288 | capture_method?: "" | "manual"; |
289 | preferred_locale?: string; |
290 | setup_future_usage?: "none"; |
291 | [k: string]: unknown; |
292 | } |
293 | | ""; |
294 | afterpay_clearpay?: |
295 | | { |
296 | capture_method?: "" | "manual"; |
297 | reference?: string; |
298 | setup_future_usage?: "none"; |
299 | [k: string]: unknown; |
300 | } |
301 | | ""; |
302 | alipay?: |
303 | | { |
304 | setup_future_usage?: "" | "none" | "off_session"; |
305 | [k: string]: unknown; |
306 | } |
307 | | ""; |
308 | au_becs_debit?: |
309 | | { |
310 | setup_future_usage?: "" | "none" | "off_session" | "on_session"; |
311 | [k: string]: unknown; |
312 | } |
313 | | ""; |
314 | bacs_debit?: |
315 | | { |
316 | setup_future_usage?: "" | "none" | "off_session" | "on_session"; |
317 | [k: string]: unknown; |
318 | } |
319 | | ""; |
320 | bancontact?: |
321 | | { |
322 | preferred_language?: "de" | "en" | "fr" | "nl"; |
323 | setup_future_usage?: "" | "none" | "off_session"; |
324 | [k: string]: unknown; |
325 | } |
326 | | ""; |
327 | blik?: |
328 | | { |
329 | code?: string; |
330 | setup_future_usage?: "" | "none"; |
331 | [k: string]: unknown; |
332 | } |
333 | | ""; |
334 | boleto?: |
335 | | { |
336 | expires_after_days?: number; |
337 | setup_future_usage?: "" | "none" | "off_session" | "on_session"; |
338 | [k: string]: unknown; |
339 | } |
340 | | ""; |
341 | card?: |
342 | | { |
343 | capture_method?: "" | "manual"; |
344 | cvc_token?: string; |
345 | installments?: { |
346 | enabled?: boolean; |
347 | plan?: |
348 | | { |
349 | count: number; |
350 | interval: "month"; |
351 | type: "fixed_count"; |
352 | [k: string]: unknown; |
353 | } |
354 | | ""; |
355 | [k: string]: unknown; |
356 | }; |
357 | mandate_options?: { |
358 | amount: number; |
359 | amount_type: "fixed" | "maximum"; |
360 | description?: string; |
361 | end_date?: number; |
362 | interval: "day" | "month" | "sporadic" | "week" | "year"; |
363 | interval_count?: number; |
364 | reference: string; |
365 | start_date: number; |
366 | supported_types?: "india"[]; |
367 | [k: string]: unknown; |
368 | }; |
369 | network?: |
370 | | "amex" |
371 | | "cartes_bancaires" |
372 | | "diners" |
373 | | "discover" |
374 | | "eftpos_au" |
375 | | "interac" |
376 | | "jcb" |
377 | | "mastercard" |
378 | | "unionpay" |
379 | | "unknown" |
380 | | "visa"; |
381 | request_extended_authorization?: "if_available" | "never"; |
382 | request_incremental_authorization?: "if_available" | "never"; |
383 | request_multicapture?: "if_available" | "never"; |
384 | request_overcapture?: "if_available" | "never"; |
385 | request_three_d_secure?: "any" | "automatic" | "challenge"; |
386 | require_cvc_recollection?: boolean; |
387 | setup_future_usage?: "" | "none" | "off_session" | "on_session"; |
388 | statement_descriptor_suffix_kana?: string | ""; |
389 | statement_descriptor_suffix_kanji?: string | ""; |
390 | three_d_secure?: { |
391 | ares_trans_status?: "A" | "C" | "I" | "N" | "R" | "U" | "Y"; |
392 | cryptogram: string; |
393 | electronic_commerce_indicator?: "01" | "02" | "05" | "06" | "07"; |
394 | exemption_indicator?: "low_risk" | "none"; |
395 | network_options?: { |
396 | cartes_bancaires?: { |
397 | cb_avalgo: "0" | "1" | "2" | "3" | "4" | "A"; |
398 | cb_exemption?: string; |
399 | cb_score?: number; |
400 | [k: string]: unknown; |
401 | }; |
402 | [k: string]: unknown; |
403 | }; |
404 | requestor_challenge_indicator?: string; |
405 | transaction_id: string; |
406 | version: "1.0.2" | "2.1.0" | "2.2.0"; |
407 | [k: string]: unknown; |
408 | }; |
409 | [k: string]: unknown; |
410 | } |
411 | | ""; |
412 | card_present?: |
413 | | { |
414 | request_extended_authorization?: boolean; |
415 | request_incremental_authorization_support?: boolean; |
416 | [k: string]: unknown; |
417 | } |
418 | | ""; |
419 | cashapp?: |
420 | | { |
421 | capture_method?: "" | "manual"; |
422 | setup_future_usage?: "" | "none" | "off_session" | "on_session"; |
423 | [k: string]: unknown; |
424 | } |
425 | | ""; |
426 | customer_balance?: |
427 | | { |
428 | bank_transfer?: { |
429 | eu_bank_transfer?: { country: string; [k: string]: unknown }; |
430 | requested_address_types?: ( |
431 | | "aba" |
432 | | "iban" |
433 | | "sepa" |
434 | | "sort_code" |
435 | | "spei" |
436 | | "swift" |
437 | | "zengin" |
438 | )[]; |
439 | type: |
440 | | "eu_bank_transfer" |
441 | | "gb_bank_transfer" |
442 | | "jp_bank_transfer" |
443 | | "mx_bank_transfer" |
444 | | "us_bank_transfer"; |
445 | [k: string]: unknown; |
446 | }; |
447 | funding_type?: "bank_transfer"; |
448 | setup_future_usage?: "none"; |
449 | [k: string]: unknown; |
450 | } |
451 | | ""; |
452 | eps?: { setup_future_usage?: "none"; [k: string]: unknown } | ""; |
453 | fpx?: { setup_future_usage?: "none"; [k: string]: unknown } | ""; |
454 | giropay?: { setup_future_usage?: "none"; [k: string]: unknown } | ""; |
455 | grabpay?: { setup_future_usage?: "none"; [k: string]: unknown } | ""; |
456 | ideal?: |
457 | | { |
458 | setup_future_usage?: "" | "none" | "off_session"; |
459 | [k: string]: unknown; |
460 | } |
461 | | ""; |
462 | interac_present?: { [k: string]: unknown } | ""; |
463 | klarna?: |
464 | | { |
465 | capture_method?: "" | "manual"; |
466 | preferred_locale?: |
467 | | "cs-CZ" |
468 | | "da-DK" |
469 | | "de-AT" |
470 | | "de-CH" |
471 | | "de-DE" |
472 | | "el-GR" |
473 | | "en-AT" |
474 | | "en-AU" |
475 | | "en-BE" |
476 | | "en-CA" |
477 | | "en-CH" |
478 | | "en-CZ" |
479 | | "en-DE" |
480 | | "en-DK" |
481 | | "en-ES" |
482 | | "en-FI" |
483 | | "en-FR" |
484 | | "en-GB" |
485 | | "en-GR" |
486 | | "en-IE" |
487 | | "en-IT" |
488 | | "en-NL" |
489 | | "en-NO" |
490 | | "en-NZ" |
491 | | "en-PL" |
492 | | "en-PT" |
493 | | "en-SE" |
494 | | "en-US" |
495 | | "es-ES" |
496 | | "es-US" |
497 | | "fi-FI" |
498 | | "fr-BE" |
499 | | "fr-CA" |
500 | | "fr-CH" |
501 | | "fr-FR" |
502 | | "it-CH" |
503 | | "it-IT" |
504 | | "nb-NO" |
505 | | "nl-BE" |
506 | | "nl-NL" |
507 | | "pl-PL" |
508 | | "pt-PT" |
509 | | "sv-FI" |
510 | | "sv-SE"; |
511 | setup_future_usage?: "none"; |
512 | [k: string]: unknown; |
513 | } |
514 | | ""; |
515 | konbini?: |
516 | | { |
517 | confirmation_number?: string | ""; |
518 | expires_after_days?: number | ""; |
519 | expires_at?: number | ""; |
520 | product_description?: string | ""; |
521 | setup_future_usage?: "none"; |
522 | [k: string]: unknown; |
523 | } |
524 | | ""; |
525 | link?: |
526 | | { |
527 | capture_method?: "" | "manual"; |
528 | setup_future_usage?: "" | "none" | "off_session"; |
529 | [k: string]: unknown; |
530 | } |
531 | | ""; |
532 | oxxo?: |
533 | | { |
534 | expires_after_days?: number; |
535 | setup_future_usage?: "none"; |
536 | [k: string]: unknown; |
537 | } |
538 | | ""; |
539 | p24?: |
540 | | { |
541 | setup_future_usage?: "none"; |
542 | tos_shown_and_accepted?: boolean; |
543 | [k: string]: unknown; |
544 | } |
545 | | ""; |
546 | paynow?: { setup_future_usage?: "none"; [k: string]: unknown } | ""; |
547 | paypal?: |
548 | | { |
549 | capture_method?: "" | "manual"; |
550 | preferred_locale?: |
551 | | "cs-CZ" |
552 | | "da-DK" |
553 | | "de-AT" |
554 | | "de-DE" |
555 | | "de-LU" |
556 | | "el-GR" |
557 | | "en-GB" |
558 | | "en-US" |
559 | | "es-ES" |
560 | | "fi-FI" |
561 | | "fr-BE" |
562 | | "fr-FR" |
563 | | "fr-LU" |
564 | | "hu-HU" |
565 | | "it-IT" |
566 | | "nl-BE" |
567 | | "nl-NL" |
568 | | "pl-PL" |
569 | | "pt-PT" |
570 | | "sk-SK" |
571 | | "sv-SE"; |
572 | reference?: string; |
573 | risk_correlation_id?: string; |
574 | setup_future_usage?: "" | "none" | "off_session"; |
575 | [k: string]: unknown; |
576 | } |
577 | | ""; |
578 | pix?: |
579 | | { |
580 | expires_after_seconds?: number; |
581 | expires_at?: number; |
582 | setup_future_usage?: "none"; |
583 | [k: string]: unknown; |
584 | } |
585 | | ""; |
586 | promptpay?: { setup_future_usage?: "none"; [k: string]: unknown } | ""; |
587 | revolut_pay?: |
588 | | { |
589 | setup_future_usage?: "" | "none" | "off_session"; |
590 | [k: string]: unknown; |
591 | } |
592 | | ""; |
593 | sepa_debit?: |
594 | | { |
595 | mandate_options?: { [k: string]: unknown }; |
596 | setup_future_usage?: "" | "none" | "off_session" | "on_session"; |
597 | [k: string]: unknown; |
598 | } |
599 | | ""; |
600 | sofort?: |
601 | | { |
602 | preferred_language?: |
603 | | "" |
604 | | "de" |
605 | | "en" |
606 | | "es" |
607 | | "fr" |
608 | | "it" |
609 | | "nl" |
610 | | "pl"; |
611 | setup_future_usage?: "" | "none" | "off_session"; |
612 | [k: string]: unknown; |
613 | } |
614 | | ""; |
615 | swish?: |
616 | | { |
617 | reference?: string | ""; |
618 | setup_future_usage?: "none"; |
619 | [k: string]: unknown; |
620 | } |
621 | | ""; |
622 | us_bank_account?: |
623 | | { |
624 | financial_connections?: { |
625 | permissions?: ( |
626 | | "balances" |
627 | | "ownership" |
628 | | "payment_method" |
629 | | "transactions" |
630 | )[]; |
631 | prefetch?: ("balances" | "transactions")[]; |
632 | return_url?: string; |
633 | [k: string]: unknown; |
634 | }; |
635 | mandate_options?: { |
636 | collection_method?: "" | "paper"; |
637 | [k: string]: unknown; |
638 | }; |
639 | networks?: { |
640 | requested?: ("ach" | "us_domestic_wire")[]; |
641 | [k: string]: unknown; |
642 | }; |
643 | preferred_settlement_speed?: "" | "fastest" | "standard"; |
644 | setup_future_usage?: "" | "none" | "off_session" | "on_session"; |
645 | verification_method?: "automatic" | "instant" | "microdeposits"; |
646 | [k: string]: unknown; |
647 | } |
648 | | ""; |
649 | wechat_pay?: |
650 | | { |
651 | app_id?: string; |
652 | client: "android" | "ios" | "web"; |
653 | setup_future_usage?: "none"; |
654 | [k: string]: unknown; |
655 | } |
656 | | ""; |
657 | zip?: { setup_future_usage?: "none"; [k: string]: unknown } | ""; |
658 | [k: string]: unknown; |
659 | }; |
660 | payment_method_types?: string[]; |
661 | radar_options?: { session?: string; [k: string]: unknown }; |
662 | receipt_email?: string | ""; |
663 | return_url?: string; |
664 | setup_future_usage?: "" | "off_session" | "on_session"; |
665 | shipping?: |
666 | | { |
667 | address: { |
668 | city?: string; |
669 | country?: string; |
670 | line1?: string; |
671 | line2?: string; |
672 | postal_code?: string; |
673 | state?: string; |
674 | [k: string]: unknown; |
675 | }; |
676 | carrier?: string; |
677 | name: string; |
678 | phone?: string; |
679 | tracking_number?: string; |
680 | [k: string]: unknown; |
681 | } |
682 | | ""; |
683 | use_stripe_sdk?: boolean; |
684 | } |
685 | ) { |
686 | const url = new URL( |
687 | `https://api.stripe.com/v1/payment_intents/${intent}/confirm` |
688 | ); |
689 |
|
690 | const response = await fetch(url, { |
691 | method: "POST", |
692 | headers: { |
693 | "Content-Type": "application/x-www-form-urlencoded", |
694 | Authorization: "Bearer " + auth.token, |
695 | }, |
696 | body: encodeParams(body), |
697 | }); |
698 | if (!response.ok) { |
699 | const text = await response.text(); |
700 | throw new Error(`${response.status} ${text}`); |
701 | } |
702 | return await response.json(); |
703 | } |
704 |
|
705 | function encodeParams(o: any) { |
706 | function iter(o: any, path: string) { |
707 | if (Array.isArray(o)) { |
708 | o.forEach(function (a) { |
709 | iter(a, path + "[]"); |
710 | }); |
711 | return; |
712 | } |
713 | if (o !== null && typeof o === "object") { |
714 | Object.keys(o).forEach(function (k) { |
715 | iter(o[k], path + "[" + k + "]"); |
716 | }); |
717 | return; |
718 | } |
719 | data.push(path + "=" + o); |
720 | } |
721 | const data: string[] = []; |
722 | Object.keys(o).forEach(function (k) { |
723 | if (o[k] !== undefined) { |
724 | iter(o[k], k); |
725 | } |
726 | }); |
727 | return new URLSearchParams(data.join("&")); |
728 | } |
729 |
|