1 | type Stripe = { |
2 | token: string; |
3 | }; |
4 | |
5 | * Post checkout sessions |
6 | * Creates a Session object. |
7 | */ |
8 | export async function main( |
9 | auth: Stripe, |
10 | body: { |
11 | after_expiration?: { |
12 | recovery?: { |
13 | allow_promotion_codes?: boolean; |
14 | enabled: boolean; |
15 | [k: string]: unknown; |
16 | }; |
17 | [k: string]: unknown; |
18 | }; |
19 | allow_promotion_codes?: boolean; |
20 | automatic_tax?: { |
21 | enabled: boolean; |
22 | liability?: { |
23 | account?: string; |
24 | type: "account" | "self"; |
25 | [k: string]: unknown; |
26 | }; |
27 | [k: string]: unknown; |
28 | }; |
29 | billing_address_collection?: "auto" | "required"; |
30 | cancel_url?: string; |
31 | client_reference_id?: string; |
32 | consent_collection?: { |
33 | payment_method_reuse_agreement?: { |
34 | position: "auto" | "hidden"; |
35 | [k: string]: unknown; |
36 | }; |
37 | promotions?: "auto" | "none"; |
38 | terms_of_service?: "none" | "required"; |
39 | [k: string]: unknown; |
40 | }; |
41 | currency?: string; |
42 | custom_fields?: { |
43 | dropdown?: { |
44 | options: { label: string; value: string; [k: string]: unknown }[]; |
45 | [k: string]: unknown; |
46 | }; |
47 | key: string; |
48 | label: { custom: string; type: "custom"; [k: string]: unknown }; |
49 | numeric?: { |
50 | maximum_length?: number; |
51 | minimum_length?: number; |
52 | [k: string]: unknown; |
53 | }; |
54 | optional?: boolean; |
55 | text?: { |
56 | maximum_length?: number; |
57 | minimum_length?: number; |
58 | [k: string]: unknown; |
59 | }; |
60 | type: "dropdown" | "numeric" | "text"; |
61 | [k: string]: unknown; |
62 | }[]; |
63 | custom_text?: { |
64 | after_submit?: { message: string; [k: string]: unknown } | ""; |
65 | shipping_address?: { message: string; [k: string]: unknown } | ""; |
66 | submit?: { message: string; [k: string]: unknown } | ""; |
67 | terms_of_service_acceptance?: |
68 | | { message: string; [k: string]: unknown } |
69 | | ""; |
70 | [k: string]: unknown; |
71 | }; |
72 | customer?: string; |
73 | customer_creation?: "always" | "if_required"; |
74 | customer_email?: string; |
75 | customer_update?: { |
76 | address?: "auto" | "never"; |
77 | name?: "auto" | "never"; |
78 | shipping?: "auto" | "never"; |
79 | [k: string]: unknown; |
80 | }; |
81 | discounts?: { |
82 | coupon?: string; |
83 | promotion_code?: string; |
84 | [k: string]: unknown; |
85 | }[]; |
86 | expand?: string[]; |
87 | expires_at?: number; |
88 | invoice_creation?: { |
89 | enabled: boolean; |
90 | invoice_data?: { |
91 | account_tax_ids?: string[] | ""; |
92 | custom_fields?: |
93 | | { name: string; value: string; [k: string]: unknown }[] |
94 | | ""; |
95 | description?: string; |
96 | footer?: string; |
97 | issuer?: { |
98 | account?: string; |
99 | type: "account" | "self"; |
100 | [k: string]: unknown; |
101 | }; |
102 | metadata?: { [k: string]: string }; |
103 | rendering_options?: |
104 | | { |
105 | amount_tax_display?: "" | "exclude_tax" | "include_inclusive_tax"; |
106 | [k: string]: unknown; |
107 | } |
108 | | ""; |
109 | [k: string]: unknown; |
110 | }; |
111 | [k: string]: unknown; |
112 | }; |
113 | line_items?: { |
114 | adjustable_quantity?: { |
115 | enabled: boolean; |
116 | maximum?: number; |
117 | minimum?: number; |
118 | [k: string]: unknown; |
119 | }; |
120 | dynamic_tax_rates?: string[]; |
121 | price?: string; |
122 | price_data?: { |
123 | currency: string; |
124 | product?: string; |
125 | product_data?: { |
126 | description?: string; |
127 | images?: string[]; |
128 | metadata?: { [k: string]: string }; |
129 | name: string; |
130 | tax_code?: string; |
131 | [k: string]: unknown; |
132 | }; |
133 | recurring?: { |
134 | interval: "day" | "month" | "week" | "year"; |
135 | interval_count?: number; |
136 | [k: string]: unknown; |
137 | }; |
138 | tax_behavior?: "exclusive" | "inclusive" | "unspecified"; |
139 | unit_amount?: number; |
140 | unit_amount_decimal?: string; |
141 | [k: string]: unknown; |
142 | }; |
143 | quantity?: number; |
144 | tax_rates?: string[]; |
145 | [k: string]: unknown; |
146 | }[]; |
147 | locale?: |
148 | | "auto" |
149 | | "bg" |
150 | | "cs" |
151 | | "da" |
152 | | "de" |
153 | | "el" |
154 | | "en" |
155 | | "en-GB" |
156 | | "es" |
157 | | "es-419" |
158 | | "et" |
159 | | "fi" |
160 | | "fil" |
161 | | "fr" |
162 | | "fr-CA" |
163 | | "hr" |
164 | | "hu" |
165 | | "id" |
166 | | "it" |
167 | | "ja" |
168 | | "ko" |
169 | | "lt" |
170 | | "lv" |
171 | | "ms" |
172 | | "mt" |
173 | | "nb" |
174 | | "nl" |
175 | | "pl" |
176 | | "pt" |
177 | | "pt-BR" |
178 | | "ro" |
179 | | "ru" |
180 | | "sk" |
181 | | "sl" |
182 | | "sv" |
183 | | "th" |
184 | | "tr" |
185 | | "vi" |
186 | | "zh" |
187 | | "zh-HK" |
188 | | "zh-TW"; |
189 | metadata?: { [k: string]: string }; |
190 | mode?: "payment" | "setup" | "subscription"; |
191 | payment_intent_data?: { |
192 | application_fee_amount?: number; |
193 | capture_method?: "automatic" | "automatic_async" | "manual"; |
194 | description?: string; |
195 | metadata?: { [k: string]: string }; |
196 | on_behalf_of?: string; |
197 | receipt_email?: string; |
198 | setup_future_usage?: "off_session" | "on_session"; |
199 | shipping?: { |
200 | address: { |
201 | city?: string; |
202 | country?: string; |
203 | line1: string; |
204 | line2?: string; |
205 | postal_code?: string; |
206 | state?: string; |
207 | [k: string]: unknown; |
208 | }; |
209 | carrier?: string; |
210 | name: string; |
211 | phone?: string; |
212 | tracking_number?: string; |
213 | [k: string]: unknown; |
214 | }; |
215 | statement_descriptor?: string; |
216 | statement_descriptor_suffix?: string; |
217 | transfer_data?: { |
218 | amount?: number; |
219 | destination: string; |
220 | [k: string]: unknown; |
221 | }; |
222 | transfer_group?: string; |
223 | [k: string]: unknown; |
224 | }; |
225 | payment_method_collection?: "always" | "if_required"; |
226 | payment_method_configuration?: string; |
227 | payment_method_options?: { |
228 | acss_debit?: { |
229 | currency?: "cad" | "usd"; |
230 | mandate_options?: { |
231 | custom_mandate_url?: string | ""; |
232 | default_for?: ("invoice" | "subscription")[]; |
233 | interval_description?: string; |
234 | payment_schedule?: "combined" | "interval" | "sporadic"; |
235 | transaction_type?: "business" | "personal"; |
236 | [k: string]: unknown; |
237 | }; |
238 | setup_future_usage?: "none" | "off_session" | "on_session"; |
239 | verification_method?: "automatic" | "instant" | "microdeposits"; |
240 | [k: string]: unknown; |
241 | }; |
242 | affirm?: { setup_future_usage?: "none"; [k: string]: unknown }; |
243 | afterpay_clearpay?: { setup_future_usage?: "none"; [k: string]: unknown }; |
244 | alipay?: { setup_future_usage?: "none"; [k: string]: unknown }; |
245 | au_becs_debit?: { setup_future_usage?: "none"; [k: string]: unknown }; |
246 | bacs_debit?: { |
247 | setup_future_usage?: "none" | "off_session" | "on_session"; |
248 | [k: string]: unknown; |
249 | }; |
250 | bancontact?: { setup_future_usage?: "none"; [k: string]: unknown }; |
251 | boleto?: { |
252 | expires_after_days?: number; |
253 | setup_future_usage?: "none" | "off_session" | "on_session"; |
254 | [k: string]: unknown; |
255 | }; |
256 | card?: { |
257 | installments?: { enabled?: boolean; [k: string]: unknown }; |
258 | request_three_d_secure?: "any" | "automatic" | "challenge"; |
259 | setup_future_usage?: "off_session" | "on_session"; |
260 | statement_descriptor_suffix_kana?: string; |
261 | statement_descriptor_suffix_kanji?: string; |
262 | [k: string]: unknown; |
263 | }; |
264 | cashapp?: { |
265 | setup_future_usage?: "none" | "off_session" | "on_session"; |
266 | [k: string]: unknown; |
267 | }; |
268 | customer_balance?: { |
269 | bank_transfer?: { |
270 | eu_bank_transfer?: { country: string; [k: string]: unknown }; |
271 | requested_address_types?: ( |
272 | | "aba" |
273 | | "iban" |
274 | | "sepa" |
275 | | "sort_code" |
276 | | "spei" |
277 | | "swift" |
278 | | "zengin" |
279 | )[]; |
280 | type: |
281 | | "eu_bank_transfer" |
282 | | "gb_bank_transfer" |
283 | | "jp_bank_transfer" |
284 | | "mx_bank_transfer" |
285 | | "us_bank_transfer"; |
286 | [k: string]: unknown; |
287 | }; |
288 | funding_type?: "bank_transfer"; |
289 | setup_future_usage?: "none"; |
290 | [k: string]: unknown; |
291 | }; |
292 | eps?: { setup_future_usage?: "none"; [k: string]: unknown }; |
293 | fpx?: { setup_future_usage?: "none"; [k: string]: unknown }; |
294 | giropay?: { setup_future_usage?: "none"; [k: string]: unknown }; |
295 | grabpay?: { setup_future_usage?: "none"; [k: string]: unknown }; |
296 | ideal?: { setup_future_usage?: "none"; [k: string]: unknown }; |
297 | klarna?: { setup_future_usage?: "none"; [k: string]: unknown }; |
298 | konbini?: { |
299 | expires_after_days?: number; |
300 | setup_future_usage?: "none"; |
301 | [k: string]: unknown; |
302 | }; |
303 | link?: { |
304 | setup_future_usage?: "none" | "off_session"; |
305 | [k: string]: unknown; |
306 | }; |
307 | oxxo?: { |
308 | expires_after_days?: number; |
309 | setup_future_usage?: "none"; |
310 | [k: string]: unknown; |
311 | }; |
312 | p24?: { |
313 | setup_future_usage?: "none"; |
314 | tos_shown_and_accepted?: boolean; |
315 | [k: string]: unknown; |
316 | }; |
317 | paynow?: { setup_future_usage?: "none"; [k: string]: unknown }; |
318 | paypal?: { |
319 | capture_method?: "" | "manual"; |
320 | preferred_locale?: |
321 | | "cs-CZ" |
322 | | "da-DK" |
323 | | "de-AT" |
324 | | "de-DE" |
325 | | "de-LU" |
326 | | "el-GR" |
327 | | "en-GB" |
328 | | "en-US" |
329 | | "es-ES" |
330 | | "fi-FI" |
331 | | "fr-BE" |
332 | | "fr-FR" |
333 | | "fr-LU" |
334 | | "hu-HU" |
335 | | "it-IT" |
336 | | "nl-BE" |
337 | | "nl-NL" |
338 | | "pl-PL" |
339 | | "pt-PT" |
340 | | "sk-SK" |
341 | | "sv-SE"; |
342 | reference?: string; |
343 | risk_correlation_id?: string; |
344 | setup_future_usage?: "" | "none" | "off_session"; |
345 | [k: string]: unknown; |
346 | }; |
347 | pix?: { expires_after_seconds?: number; [k: string]: unknown }; |
348 | revolut_pay?: { |
349 | setup_future_usage?: "none" | "off_session"; |
350 | [k: string]: unknown; |
351 | }; |
352 | sepa_debit?: { |
353 | setup_future_usage?: "none" | "off_session" | "on_session"; |
354 | [k: string]: unknown; |
355 | }; |
356 | sofort?: { setup_future_usage?: "none"; [k: string]: unknown }; |
357 | swish?: { reference?: string | ""; [k: string]: unknown }; |
358 | us_bank_account?: { |
359 | financial_connections?: { |
360 | permissions?: ( |
361 | | "balances" |
362 | | "ownership" |
363 | | "payment_method" |
364 | | "transactions" |
365 | )[]; |
366 | prefetch?: ("balances" | "transactions")[]; |
367 | [k: string]: unknown; |
368 | }; |
369 | setup_future_usage?: "none" | "off_session" | "on_session"; |
370 | verification_method?: "automatic" | "instant"; |
371 | [k: string]: unknown; |
372 | }; |
373 | wechat_pay?: { |
374 | app_id?: string; |
375 | client: "android" | "ios" | "web"; |
376 | setup_future_usage?: "none"; |
377 | [k: string]: unknown; |
378 | }; |
379 | [k: string]: unknown; |
380 | }; |
381 | payment_method_types?: ( |
382 | | "acss_debit" |
383 | | "affirm" |
384 | | "afterpay_clearpay" |
385 | | "alipay" |
386 | | "au_becs_debit" |
387 | | "bacs_debit" |
388 | | "bancontact" |
389 | | "blik" |
390 | | "boleto" |
391 | | "card" |
392 | | "cashapp" |
393 | | "customer_balance" |
394 | | "eps" |
395 | | "fpx" |
396 | | "giropay" |
397 | | "grabpay" |
398 | | "ideal" |
399 | | "klarna" |
400 | | "konbini" |
401 | | "link" |
402 | | "oxxo" |
403 | | "p24" |
404 | | "paynow" |
405 | | "paypal" |
406 | | "pix" |
407 | | "promptpay" |
408 | | "revolut_pay" |
409 | | "sepa_debit" |
410 | | "sofort" |
411 | | "swish" |
412 | | "us_bank_account" |
413 | | "wechat_pay" |
414 | | "zip" |
415 | )[]; |
416 | phone_number_collection?: { enabled: boolean; [k: string]: unknown }; |
417 | redirect_on_completion?: "always" | "if_required" | "never"; |
418 | return_url?: string; |
419 | setup_intent_data?: { |
420 | description?: string; |
421 | metadata?: { [k: string]: string }; |
422 | on_behalf_of?: string; |
423 | [k: string]: unknown; |
424 | }; |
425 | shipping_address_collection?: { |
426 | allowed_countries: ( |
427 | | "AC" |
428 | | "AD" |
429 | | "AE" |
430 | | "AF" |
431 | | "AG" |
432 | | "AI" |
433 | | "AL" |
434 | | "AM" |
435 | | "AO" |
436 | | "AQ" |
437 | | "AR" |
438 | | "AT" |
439 | | "AU" |
440 | | "AW" |
441 | | "AX" |
442 | | "AZ" |
443 | | "BA" |
444 | | "BB" |
445 | | "BD" |
446 | | "BE" |
447 | | "BF" |
448 | | "BG" |
449 | | "BH" |
450 | | "BI" |
451 | | "BJ" |
452 | | "BL" |
453 | | "BM" |
454 | | "BN" |
455 | | "BO" |
456 | | "BQ" |
457 | | "BR" |
458 | | "BS" |
459 | | "BT" |
460 | | "BV" |
461 | | "BW" |
462 | | "BY" |
463 | | "BZ" |
464 | | "CA" |
465 | | "CD" |
466 | | "CF" |
467 | | "CG" |
468 | | "CH" |
469 | | "CI" |
470 | | "CK" |
471 | | "CL" |
472 | | "CM" |
473 | | "CN" |
474 | | "CO" |
475 | | "CR" |
476 | | "CV" |
477 | | "CW" |
478 | | "CY" |
479 | | "CZ" |
480 | | "DE" |
481 | | "DJ" |
482 | | "DK" |
483 | | "DM" |
484 | | "DO" |
485 | | "DZ" |
486 | | "EC" |
487 | | "EE" |
488 | | "EG" |
489 | | "EH" |
490 | | "ER" |
491 | | "ES" |
492 | | "ET" |
493 | | "FI" |
494 | | "FJ" |
495 | | "FK" |
496 | | "FO" |
497 | | "FR" |
498 | | "GA" |
499 | | "GB" |
500 | | "GD" |
501 | | "GE" |
502 | | "GF" |
503 | | "GG" |
504 | | "GH" |
505 | | "GI" |
506 | | "GL" |
507 | | "GM" |
508 | | "GN" |
509 | | "GP" |
510 | | "GQ" |
511 | | "GR" |
512 | | "GS" |
513 | | "GT" |
514 | | "GU" |
515 | | "GW" |
516 | | "GY" |
517 | | "HK" |
518 | | "HN" |
519 | | "HR" |
520 | | "HT" |
521 | | "HU" |
522 | | "ID" |
523 | | "IE" |
524 | | "IL" |
525 | | "IM" |
526 | | "IN" |
527 | | "IO" |
528 | | "IQ" |
529 | | "IS" |
530 | | "IT" |
531 | | "JE" |
532 | | "JM" |
533 | | "JO" |
534 | | "JP" |
535 | | "KE" |
536 | | "KG" |
537 | | "KH" |
538 | | "KI" |
539 | | "KM" |
540 | | "KN" |
541 | | "KR" |
542 | | "KW" |
543 | | "KY" |
544 | | "KZ" |
545 | | "LA" |
546 | | "LB" |
547 | | "LC" |
548 | | "LI" |
549 | | "LK" |
550 | | "LR" |
551 | | "LS" |
552 | | "LT" |
553 | | "LU" |
554 | | "LV" |
555 | | "LY" |
556 | | "MA" |
557 | | "MC" |
558 | | "MD" |
559 | | "ME" |
560 | | "MF" |
561 | | "MG" |
562 | | "MK" |
563 | | "ML" |
564 | | "MM" |
565 | | "MN" |
566 | | "MO" |
567 | | "MQ" |
568 | | "MR" |
569 | | "MS" |
570 | | "MT" |
571 | | "MU" |
572 | | "MV" |
573 | | "MW" |
574 | | "MX" |
575 | | "MY" |
576 | | "MZ" |
577 | | "NA" |
578 | | "NC" |
579 | | "NE" |
580 | | "NG" |
581 | | "NI" |
582 | | "NL" |
583 | | "NO" |
584 | | "NP" |
585 | | "NR" |
586 | | "NU" |
587 | | "NZ" |
588 | | "OM" |
589 | | "PA" |
590 | | "PE" |
591 | | "PF" |
592 | | "PG" |
593 | | "PH" |
594 | | "PK" |
595 | | "PL" |
596 | | "PM" |
597 | | "PN" |
598 | | "PR" |
599 | | "PS" |
600 | | "PT" |
601 | | "PY" |
602 | | "QA" |
603 | | "RE" |
604 | | "RO" |
605 | | "RS" |
606 | | "RU" |
607 | | "RW" |
608 | | "SA" |
609 | | "SB" |
610 | | "SC" |
611 | | "SE" |
612 | | "SG" |
613 | | "SH" |
614 | | "SI" |
615 | | "SJ" |
616 | | "SK" |
617 | | "SL" |
618 | | "SM" |
619 | | "SN" |
620 | | "SO" |
621 | | "SR" |
622 | | "SS" |
623 | | "ST" |
624 | | "SV" |
625 | | "SX" |
626 | | "SZ" |
627 | | "TA" |
628 | | "TC" |
629 | | "TD" |
630 | | "TF" |
631 | | "TG" |
632 | | "TH" |
633 | | "TJ" |
634 | | "TK" |
635 | | "TL" |
636 | | "TM" |
637 | | "TN" |
638 | | "TO" |
639 | | "TR" |
640 | | "TT" |
641 | | "TV" |
642 | | "TW" |
643 | | "TZ" |
644 | | "UA" |
645 | | "UG" |
646 | | "US" |
647 | | "UY" |
648 | | "UZ" |
649 | | "VA" |
650 | | "VC" |
651 | | "VE" |
652 | | "VG" |
653 | | "VN" |
654 | | "VU" |
655 | | "WF" |
656 | | "WS" |
657 | | "XK" |
658 | | "YE" |
659 | | "YT" |
660 | | "ZA" |
661 | | "ZM" |
662 | | "ZW" |
663 | | "ZZ" |
664 | )[]; |
665 | [k: string]: unknown; |
666 | }; |
667 | shipping_options?: { |
668 | shipping_rate?: string; |
669 | shipping_rate_data?: { |
670 | delivery_estimate?: { |
671 | maximum?: { |
672 | unit: "business_day" | "day" | "hour" | "month" | "week"; |
673 | value: number; |
674 | [k: string]: unknown; |
675 | }; |
676 | minimum?: { |
677 | unit: "business_day" | "day" | "hour" | "month" | "week"; |
678 | value: number; |
679 | [k: string]: unknown; |
680 | }; |
681 | [k: string]: unknown; |
682 | }; |
683 | display_name: string; |
684 | fixed_amount?: { |
685 | amount: number; |
686 | currency: string; |
687 | currency_options?: { |
688 | [k: string]: { |
689 | amount: number; |
690 | tax_behavior?: "exclusive" | "inclusive" | "unspecified"; |
691 | [k: string]: unknown; |
692 | }; |
693 | }; |
694 | [k: string]: unknown; |
695 | }; |
696 | metadata?: { [k: string]: string }; |
697 | tax_behavior?: "exclusive" | "inclusive" | "unspecified"; |
698 | tax_code?: string; |
699 | type?: "fixed_amount"; |
700 | [k: string]: unknown; |
701 | }; |
702 | [k: string]: unknown; |
703 | }[]; |
704 | submit_type?: "auto" | "book" | "donate" | "pay"; |
705 | subscription_data?: { |
706 | application_fee_percent?: number; |
707 | billing_cycle_anchor?: number; |
708 | default_tax_rates?: string[]; |
709 | description?: string; |
710 | invoice_settings?: { |
711 | issuer?: { |
712 | account?: string; |
713 | type: "account" | "self"; |
714 | [k: string]: unknown; |
715 | }; |
716 | [k: string]: unknown; |
717 | }; |
718 | metadata?: { [k: string]: string }; |
719 | on_behalf_of?: string; |
720 | proration_behavior?: "create_prorations" | "none"; |
721 | transfer_data?: { |
722 | amount_percent?: number; |
723 | destination: string; |
724 | [k: string]: unknown; |
725 | }; |
726 | trial_end?: number; |
727 | trial_period_days?: number; |
728 | trial_settings?: { |
729 | end_behavior: { |
730 | missing_payment_method: "cancel" | "create_invoice" | "pause"; |
731 | [k: string]: unknown; |
732 | }; |
733 | [k: string]: unknown; |
734 | }; |
735 | [k: string]: unknown; |
736 | }; |
737 | success_url?: string; |
738 | tax_id_collection?: { enabled: boolean; [k: string]: unknown }; |
739 | ui_mode?: "embedded" | "hosted"; |
740 | } |
741 | ) { |
742 | const url = new URL(`https://api.stripe.com/v1/checkout/sessions`); |
743 |
|
744 | const response = await fetch(url, { |
745 | method: "POST", |
746 | headers: { |
747 | "Content-Type": "application/x-www-form-urlencoded", |
748 | Authorization: "Bearer " + auth.token, |
749 | }, |
750 | body: encodeParams(body), |
751 | }); |
752 | if (!response.ok) { |
753 | const text = await response.text(); |
754 | throw new Error(`${response.status} ${text}`); |
755 | } |
756 | return await response.json(); |
757 | } |
758 |
|
759 | function encodeParams(o: any) { |
760 | function iter(o: any, path: string) { |
761 | if (Array.isArray(o)) { |
762 | o.forEach(function (a) { |
763 | iter(a, path + "[]"); |
764 | }); |
765 | return; |
766 | } |
767 | if (o !== null && typeof o === "object") { |
768 | Object.keys(o).forEach(function (k) { |
769 | iter(o[k], path + "[" + k + "]"); |
770 | }); |
771 | return; |
772 | } |
773 | data.push(path + "=" + o); |
774 | } |
775 | const data: string[] = []; |
776 | Object.keys(o).forEach(function (k) { |
777 | if (o[k] !== undefined) { |
778 | iter(o[k], k); |
779 | } |
780 | }); |
781 | return new URLSearchParams(data.join("&")); |
782 | } |
783 |
|