0

Post payment intents intent confirm

by
Published Oct 30, 2023

Confirm that your customer intends to pay with current or provided payment method.

Script stripe Verified

The script

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