0

Post setup intents intent confirm

by
Published Oct 30, 2023

Confirm that your customer intends to set up the 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 setup intents intent confirm
6
 * Confirm that your customer intends to set up the current or
7
provided payment method.
8
 */
9
export async function main(
10
  auth: Stripe,
11
  intent: string,
12
  body: {
13
    client_secret?: string;
14
    expand?: string[];
15
    mandate_data?:
16
      | {
17
          customer_acceptance: {
18
            accepted_at?: number;
19
            offline?: { [k: string]: unknown };
20
            online?: {
21
              ip_address: string;
22
              user_agent: string;
23
              [k: string]: unknown;
24
            };
25
            type: "offline" | "online";
26
            [k: string]: unknown;
27
          };
28
          [k: string]: unknown;
29
        }
30
      | ""
31
      | {
32
          customer_acceptance: {
33
            online: {
34
              ip_address?: string;
35
              user_agent?: string;
36
              [k: string]: unknown;
37
            };
38
            type: "online";
39
            [k: string]: unknown;
40
          };
41
          [k: string]: unknown;
42
        };
43
    payment_method?: string;
44
    payment_method_data?: {
45
      acss_debit?: {
46
        account_number: string;
47
        institution_number: string;
48
        transit_number: string;
49
        [k: string]: unknown;
50
      };
51
      affirm?: { [k: string]: unknown };
52
      afterpay_clearpay?: { [k: string]: unknown };
53
      alipay?: { [k: string]: unknown };
54
      au_becs_debit?: {
55
        account_number: string;
56
        bsb_number: string;
57
        [k: string]: unknown;
58
      };
59
      bacs_debit?: {
60
        account_number?: string;
61
        sort_code?: string;
62
        [k: string]: unknown;
63
      };
64
      bancontact?: { [k: string]: unknown };
65
      billing_details?: {
66
        address?:
67
          | {
68
              city?: string;
69
              country?: string;
70
              line1?: string;
71
              line2?: string;
72
              postal_code?: string;
73
              state?: string;
74
              [k: string]: unknown;
75
            }
76
          | "";
77
        email?: string | "";
78
        name?: string | "";
79
        phone?: string | "";
80
        [k: string]: unknown;
81
      };
82
      blik?: { [k: string]: unknown };
83
      boleto?: { tax_id: string; [k: string]: unknown };
84
      cashapp?: { [k: string]: unknown };
85
      customer_balance?: { [k: string]: unknown };
86
      eps?: {
87
        bank?:
88
          | "arzte_und_apotheker_bank"
89
          | "austrian_anadi_bank_ag"
90
          | "bank_austria"
91
          | "bankhaus_carl_spangler"
92
          | "bankhaus_schelhammer_und_schattera_ag"
93
          | "bawag_psk_ag"
94
          | "bks_bank_ag"
95
          | "brull_kallmus_bank_ag"
96
          | "btv_vier_lander_bank"
97
          | "capital_bank_grawe_gruppe_ag"
98
          | "deutsche_bank_ag"
99
          | "dolomitenbank"
100
          | "easybank_ag"
101
          | "erste_bank_und_sparkassen"
102
          | "hypo_alpeadriabank_international_ag"
103
          | "hypo_bank_burgenland_aktiengesellschaft"
104
          | "hypo_noe_lb_fur_niederosterreich_u_wien"
105
          | "hypo_oberosterreich_salzburg_steiermark"
106
          | "hypo_tirol_bank_ag"
107
          | "hypo_vorarlberg_bank_ag"
108
          | "marchfelder_bank"
109
          | "oberbank_ag"
110
          | "raiffeisen_bankengruppe_osterreich"
111
          | "schoellerbank_ag"
112
          | "sparda_bank_wien"
113
          | "volksbank_gruppe"
114
          | "volkskreditbank_ag"
115
          | "vr_bank_braunau";
116
        [k: string]: unknown;
117
      };
118
      fpx?: {
119
        bank:
120
          | "affin_bank"
121
          | "agrobank"
122
          | "alliance_bank"
123
          | "ambank"
124
          | "bank_islam"
125
          | "bank_muamalat"
126
          | "bank_of_china"
127
          | "bank_rakyat"
128
          | "bsn"
129
          | "cimb"
130
          | "deutsche_bank"
131
          | "hong_leong_bank"
132
          | "hsbc"
133
          | "kfh"
134
          | "maybank2e"
135
          | "maybank2u"
136
          | "ocbc"
137
          | "pb_enterprise"
138
          | "public_bank"
139
          | "rhb"
140
          | "standard_chartered"
141
          | "uob";
142
        [k: string]: unknown;
143
      };
144
      giropay?: { [k: string]: unknown };
145
      grabpay?: { [k: string]: unknown };
146
      ideal?: {
147
        bank?:
148
          | "abn_amro"
149
          | "asn_bank"
150
          | "bunq"
151
          | "handelsbanken"
152
          | "ing"
153
          | "knab"
154
          | "moneyou"
155
          | "n26"
156
          | "nn"
157
          | "rabobank"
158
          | "regiobank"
159
          | "revolut"
160
          | "sns_bank"
161
          | "triodos_bank"
162
          | "van_lanschot"
163
          | "yoursafe";
164
        [k: string]: unknown;
165
      };
166
      interac_present?: { [k: string]: unknown };
167
      klarna?: {
168
        dob?: {
169
          day: number;
170
          month: number;
171
          year: number;
172
          [k: string]: unknown;
173
        };
174
        [k: string]: unknown;
175
      };
176
      konbini?: { [k: string]: unknown };
177
      link?: { [k: string]: unknown };
178
      metadata?: { [k: string]: string };
179
      oxxo?: { [k: string]: unknown };
180
      p24?: {
181
        bank?:
182
          | "alior_bank"
183
          | "bank_millennium"
184
          | "bank_nowy_bfg_sa"
185
          | "bank_pekao_sa"
186
          | "banki_spbdzielcze"
187
          | "blik"
188
          | "bnp_paribas"
189
          | "boz"
190
          | "citi_handlowy"
191
          | "credit_agricole"
192
          | "envelobank"
193
          | "etransfer_pocztowy24"
194
          | "getin_bank"
195
          | "ideabank"
196
          | "ing"
197
          | "inteligo"
198
          | "mbank_mtransfer"
199
          | "nest_przelew"
200
          | "noble_pay"
201
          | "pbac_z_ipko"
202
          | "plus_bank"
203
          | "santander_przelew24"
204
          | "tmobile_usbugi_bankowe"
205
          | "toyota_bank"
206
          | "velobank"
207
          | "volkswagen_bank";
208
        [k: string]: unknown;
209
      };
210
      paynow?: { [k: string]: unknown };
211
      paypal?: { [k: string]: unknown };
212
      pix?: { [k: string]: unknown };
213
      promptpay?: { [k: string]: unknown };
214
      radar_options?: { session?: string; [k: string]: unknown };
215
      revolut_pay?: { [k: string]: unknown };
216
      sepa_debit?: { iban: string; [k: string]: unknown };
217
      sofort?: {
218
        country: "AT" | "BE" | "DE" | "ES" | "IT" | "NL";
219
        [k: string]: unknown;
220
      };
221
      swish?: { [k: string]: unknown };
222
      type:
223
        | "acss_debit"
224
        | "affirm"
225
        | "afterpay_clearpay"
226
        | "alipay"
227
        | "au_becs_debit"
228
        | "bacs_debit"
229
        | "bancontact"
230
        | "blik"
231
        | "boleto"
232
        | "cashapp"
233
        | "customer_balance"
234
        | "eps"
235
        | "fpx"
236
        | "giropay"
237
        | "grabpay"
238
        | "ideal"
239
        | "klarna"
240
        | "konbini"
241
        | "link"
242
        | "oxxo"
243
        | "p24"
244
        | "paynow"
245
        | "paypal"
246
        | "pix"
247
        | "promptpay"
248
        | "revolut_pay"
249
        | "sepa_debit"
250
        | "sofort"
251
        | "swish"
252
        | "us_bank_account"
253
        | "wechat_pay"
254
        | "zip";
255
      us_bank_account?: {
256
        account_holder_type?: "company" | "individual";
257
        account_number?: string;
258
        account_type?: "checking" | "savings";
259
        financial_connections_account?: string;
260
        routing_number?: string;
261
        [k: string]: unknown;
262
      };
263
      wechat_pay?: { [k: string]: unknown };
264
      zip?: { [k: string]: unknown };
265
      [k: string]: unknown;
266
    };
267
    payment_method_options?: {
268
      acss_debit?: {
269
        currency?: "cad" | "usd";
270
        mandate_options?: {
271
          custom_mandate_url?: string | "";
272
          default_for?: ("invoice" | "subscription")[];
273
          interval_description?: string;
274
          payment_schedule?: "combined" | "interval" | "sporadic";
275
          transaction_type?: "business" | "personal";
276
          [k: string]: unknown;
277
        };
278
        verification_method?: "automatic" | "instant" | "microdeposits";
279
        [k: string]: unknown;
280
      };
281
      card?: {
282
        mandate_options?: {
283
          amount: number;
284
          amount_type: "fixed" | "maximum";
285
          currency: string;
286
          description?: string;
287
          end_date?: number;
288
          interval: "day" | "month" | "sporadic" | "week" | "year";
289
          interval_count?: number;
290
          reference: string;
291
          start_date: number;
292
          supported_types?: "india"[];
293
          [k: string]: unknown;
294
        };
295
        network?:
296
          | "amex"
297
          | "cartes_bancaires"
298
          | "diners"
299
          | "discover"
300
          | "eftpos_au"
301
          | "interac"
302
          | "jcb"
303
          | "mastercard"
304
          | "unionpay"
305
          | "unknown"
306
          | "visa";
307
        request_three_d_secure?: "any" | "automatic" | "challenge";
308
        three_d_secure?: {
309
          ares_trans_status?: "A" | "C" | "I" | "N" | "R" | "U" | "Y";
310
          cryptogram?: string;
311
          electronic_commerce_indicator?: "01" | "02" | "05" | "06" | "07";
312
          network_options?: {
313
            cartes_bancaires?: {
314
              cb_avalgo: "0" | "1" | "2" | "3" | "4" | "A";
315
              cb_exemption?: string;
316
              cb_score?: number;
317
              [k: string]: unknown;
318
            };
319
            [k: string]: unknown;
320
          };
321
          requestor_challenge_indicator?: string;
322
          transaction_id?: string;
323
          version?: "1.0.2" | "2.1.0" | "2.2.0";
324
          [k: string]: unknown;
325
        };
326
        [k: string]: unknown;
327
      };
328
      link?: { [k: string]: unknown };
329
      paypal?: { billing_agreement_id?: string; [k: string]: unknown };
330
      sepa_debit?: {
331
        mandate_options?: { [k: string]: unknown };
332
        [k: string]: unknown;
333
      };
334
      us_bank_account?: {
335
        financial_connections?: {
336
          permissions?: (
337
            | "balances"
338
            | "ownership"
339
            | "payment_method"
340
            | "transactions"
341
          )[];
342
          prefetch?: ("balances" | "transactions")[];
343
          return_url?: string;
344
          [k: string]: unknown;
345
        };
346
        mandate_options?: {
347
          collection_method?: "" | "paper";
348
          [k: string]: unknown;
349
        };
350
        networks?: {
351
          requested?: ("ach" | "us_domestic_wire")[];
352
          [k: string]: unknown;
353
        };
354
        verification_method?: "automatic" | "instant" | "microdeposits";
355
        [k: string]: unknown;
356
      };
357
      [k: string]: unknown;
358
    };
359
    return_url?: string;
360
    use_stripe_sdk?: boolean;
361
  }
362
) {
363
  const url = new URL(
364
    `https://api.stripe.com/v1/setup_intents/${intent}/confirm`
365
  );
366

367
  const response = await fetch(url, {
368
    method: "POST",
369
    headers: {
370
      "Content-Type": "application/x-www-form-urlencoded",
371
      Authorization: "Bearer " + auth.token,
372
    },
373
    body: encodeParams(body),
374
  });
375
  if (!response.ok) {
376
    const text = await response.text();
377
    throw new Error(`${response.status} ${text}`);
378
  }
379
  return await response.json();
380
}
381

382
function encodeParams(o: any) {
383
  function iter(o: any, path: string) {
384
    if (Array.isArray(o)) {
385
      o.forEach(function (a) {
386
        iter(a, path + "[]");
387
      });
388
      return;
389
    }
390
    if (o !== null && typeof o === "object") {
391
      Object.keys(o).forEach(function (k) {
392
        iter(o[k], path + "[" + k + "]");
393
      });
394
      return;
395
    }
396
    data.push(path + "=" + o);
397
  }
398
  const data: string[] = [];
399
  Object.keys(o).forEach(function (k) {
400
    if (o[k] !== undefined) {
401
      iter(o[k], k);
402
    }
403
  });
404
  return new URLSearchParams(data.join("&"));
405
}
406