Post checkout sessions

Creates a Session object.

Script stripe Verified

by hugo697 ยท 10/30/2023

The script

Submitted by hugo697 Typescript (fetch-only)
Verified 368 days ago
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