Post payment intents

Creates a PaymentIntent object. After the PaymentIntent is created, attach a payment method and confirm to continue the payment. Learn more about the available payment flows with the Payment Intents API. When you use confirm=true during creation, it’s equivalent to creating and confirming the PaymentIntent in the same call. You can use any parameters available in the confirm API when you supply confirm=true.

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 payment intents
6
 * Creates a PaymentIntent object.
7

8
After the PaymentIntent is created, attach a payment method and confirm
9
to continue the payment. Learn more about the available payment flows
10
with the Payment Intents API.
11

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

703
  const response = await fetch(url, {
704
    method: "POST",
705
    headers: {
706
      "Content-Type": "application/x-www-form-urlencoded",
707
      Authorization: "Bearer " + auth.token,
708
    },
709
    body: encodeParams(body),
710
  });
711
  if (!response.ok) {
712
    const text = await response.text();
713
    throw new Error(`${response.status} ${text}`);
714
  }
715
  return await response.json();
716
}
717

718
function encodeParams(o: any) {
719
  function iter(o: any, path: string) {
720
    if (Array.isArray(o)) {
721
      o.forEach(function (a) {
722
        iter(a, path + "[]");
723
      });
724
      return;
725
    }
726
    if (o !== null && typeof o === "object") {
727
      Object.keys(o).forEach(function (k) {
728
        iter(o[k], path + "[" + k + "]");
729
      });
730
      return;
731
    }
732
    data.push(path + "=" + o);
733
  }
734
  const data: string[] = [];
735
  Object.keys(o).forEach(function (k) {
736
    if (o[k] !== undefined) {
737
      iter(o[k], k);
738
    }
739
  });
740
  return new URLSearchParams(data.join("&"));
741
}
742