Post payment links

Creates a payment link.

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 links
6
 * Creates a payment link.
7
 */
8
export async function main(
9
  auth: Stripe,
10
  body: {
11
    after_completion?: {
12
      hosted_confirmation?: { custom_message?: string; [k: string]: unknown };
13
      redirect?: { url: string; [k: string]: unknown };
14
      type: "hosted_confirmation" | "redirect";
15
      [k: string]: unknown;
16
    };
17
    allow_promotion_codes?: boolean;
18
    application_fee_amount?: number;
19
    application_fee_percent?: number;
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
    consent_collection?: {
31
      payment_method_reuse_agreement?: {
32
        position: "auto" | "hidden";
33
        [k: string]: unknown;
34
      };
35
      promotions?: "auto" | "none";
36
      terms_of_service?: "none" | "required";
37
      [k: string]: unknown;
38
    };
39
    currency?: string;
40
    custom_fields?: {
41
      dropdown?: {
42
        options: { label: string; value: string; [k: string]: unknown }[];
43
        [k: string]: unknown;
44
      };
45
      key: string;
46
      label: { custom: string; type: "custom"; [k: string]: unknown };
47
      numeric?: {
48
        maximum_length?: number;
49
        minimum_length?: number;
50
        [k: string]: unknown;
51
      };
52
      optional?: boolean;
53
      text?: {
54
        maximum_length?: number;
55
        minimum_length?: number;
56
        [k: string]: unknown;
57
      };
58
      type: "dropdown" | "numeric" | "text";
59
      [k: string]: unknown;
60
    }[];
61
    custom_text?: {
62
      after_submit?: { message: string; [k: string]: unknown } | "";
63
      shipping_address?: { message: string; [k: string]: unknown } | "";
64
      submit?: { message: string; [k: string]: unknown } | "";
65
      terms_of_service_acceptance?:
66
        | { message: string; [k: string]: unknown }
67
        | "";
68
      [k: string]: unknown;
69
    };
70
    customer_creation?: "always" | "if_required";
71
    expand?: string[];
72
    inactive_message?: string;
73
    invoice_creation?: {
74
      enabled: boolean;
75
      invoice_data?: {
76
        account_tax_ids?: string[] | "";
77
        custom_fields?:
78
          | { name: string; value: string; [k: string]: unknown }[]
79
          | "";
80
        description?: string;
81
        footer?: string;
82
        issuer?: {
83
          account?: string;
84
          type: "account" | "self";
85
          [k: string]: unknown;
86
        };
87
        metadata?: { [k: string]: string } | "";
88
        rendering_options?:
89
          | {
90
              amount_tax_display?: "" | "exclude_tax" | "include_inclusive_tax";
91
              [k: string]: unknown;
92
            }
93
          | "";
94
        [k: string]: unknown;
95
      };
96
      [k: string]: unknown;
97
    };
98
    line_items: {
99
      adjustable_quantity?: {
100
        enabled: boolean;
101
        maximum?: number;
102
        minimum?: number;
103
        [k: string]: unknown;
104
      };
105
      price: string;
106
      quantity: number;
107
      [k: string]: unknown;
108
    }[];
109
    metadata?: { [k: string]: string };
110
    on_behalf_of?: string;
111
    payment_intent_data?: {
112
      capture_method?: "automatic" | "automatic_async" | "manual";
113
      description?: string;
114
      metadata?: { [k: string]: string };
115
      setup_future_usage?: "off_session" | "on_session";
116
      statement_descriptor?: string;
117
      statement_descriptor_suffix?: string;
118
      transfer_group?: string;
119
      [k: string]: unknown;
120
    };
121
    payment_method_collection?: "always" | "if_required";
122
    payment_method_types?: (
123
      | "affirm"
124
      | "afterpay_clearpay"
125
      | "alipay"
126
      | "au_becs_debit"
127
      | "bacs_debit"
128
      | "bancontact"
129
      | "blik"
130
      | "boleto"
131
      | "card"
132
      | "cashapp"
133
      | "eps"
134
      | "fpx"
135
      | "giropay"
136
      | "grabpay"
137
      | "ideal"
138
      | "klarna"
139
      | "konbini"
140
      | "link"
141
      | "oxxo"
142
      | "p24"
143
      | "paynow"
144
      | "paypal"
145
      | "pix"
146
      | "promptpay"
147
      | "sepa_debit"
148
      | "sofort"
149
      | "swish"
150
      | "us_bank_account"
151
      | "wechat_pay"
152
    )[];
153
    phone_number_collection?: { enabled: boolean; [k: string]: unknown };
154
    restrictions?: {
155
      completed_sessions: { limit: number; [k: string]: unknown };
156
      [k: string]: unknown;
157
    };
158
    shipping_address_collection?: {
159
      allowed_countries: (
160
        | "AC"
161
        | "AD"
162
        | "AE"
163
        | "AF"
164
        | "AG"
165
        | "AI"
166
        | "AL"
167
        | "AM"
168
        | "AO"
169
        | "AQ"
170
        | "AR"
171
        | "AT"
172
        | "AU"
173
        | "AW"
174
        | "AX"
175
        | "AZ"
176
        | "BA"
177
        | "BB"
178
        | "BD"
179
        | "BE"
180
        | "BF"
181
        | "BG"
182
        | "BH"
183
        | "BI"
184
        | "BJ"
185
        | "BL"
186
        | "BM"
187
        | "BN"
188
        | "BO"
189
        | "BQ"
190
        | "BR"
191
        | "BS"
192
        | "BT"
193
        | "BV"
194
        | "BW"
195
        | "BY"
196
        | "BZ"
197
        | "CA"
198
        | "CD"
199
        | "CF"
200
        | "CG"
201
        | "CH"
202
        | "CI"
203
        | "CK"
204
        | "CL"
205
        | "CM"
206
        | "CN"
207
        | "CO"
208
        | "CR"
209
        | "CV"
210
        | "CW"
211
        | "CY"
212
        | "CZ"
213
        | "DE"
214
        | "DJ"
215
        | "DK"
216
        | "DM"
217
        | "DO"
218
        | "DZ"
219
        | "EC"
220
        | "EE"
221
        | "EG"
222
        | "EH"
223
        | "ER"
224
        | "ES"
225
        | "ET"
226
        | "FI"
227
        | "FJ"
228
        | "FK"
229
        | "FO"
230
        | "FR"
231
        | "GA"
232
        | "GB"
233
        | "GD"
234
        | "GE"
235
        | "GF"
236
        | "GG"
237
        | "GH"
238
        | "GI"
239
        | "GL"
240
        | "GM"
241
        | "GN"
242
        | "GP"
243
        | "GQ"
244
        | "GR"
245
        | "GS"
246
        | "GT"
247
        | "GU"
248
        | "GW"
249
        | "GY"
250
        | "HK"
251
        | "HN"
252
        | "HR"
253
        | "HT"
254
        | "HU"
255
        | "ID"
256
        | "IE"
257
        | "IL"
258
        | "IM"
259
        | "IN"
260
        | "IO"
261
        | "IQ"
262
        | "IS"
263
        | "IT"
264
        | "JE"
265
        | "JM"
266
        | "JO"
267
        | "JP"
268
        | "KE"
269
        | "KG"
270
        | "KH"
271
        | "KI"
272
        | "KM"
273
        | "KN"
274
        | "KR"
275
        | "KW"
276
        | "KY"
277
        | "KZ"
278
        | "LA"
279
        | "LB"
280
        | "LC"
281
        | "LI"
282
        | "LK"
283
        | "LR"
284
        | "LS"
285
        | "LT"
286
        | "LU"
287
        | "LV"
288
        | "LY"
289
        | "MA"
290
        | "MC"
291
        | "MD"
292
        | "ME"
293
        | "MF"
294
        | "MG"
295
        | "MK"
296
        | "ML"
297
        | "MM"
298
        | "MN"
299
        | "MO"
300
        | "MQ"
301
        | "MR"
302
        | "MS"
303
        | "MT"
304
        | "MU"
305
        | "MV"
306
        | "MW"
307
        | "MX"
308
        | "MY"
309
        | "MZ"
310
        | "NA"
311
        | "NC"
312
        | "NE"
313
        | "NG"
314
        | "NI"
315
        | "NL"
316
        | "NO"
317
        | "NP"
318
        | "NR"
319
        | "NU"
320
        | "NZ"
321
        | "OM"
322
        | "PA"
323
        | "PE"
324
        | "PF"
325
        | "PG"
326
        | "PH"
327
        | "PK"
328
        | "PL"
329
        | "PM"
330
        | "PN"
331
        | "PR"
332
        | "PS"
333
        | "PT"
334
        | "PY"
335
        | "QA"
336
        | "RE"
337
        | "RO"
338
        | "RS"
339
        | "RU"
340
        | "RW"
341
        | "SA"
342
        | "SB"
343
        | "SC"
344
        | "SE"
345
        | "SG"
346
        | "SH"
347
        | "SI"
348
        | "SJ"
349
        | "SK"
350
        | "SL"
351
        | "SM"
352
        | "SN"
353
        | "SO"
354
        | "SR"
355
        | "SS"
356
        | "ST"
357
        | "SV"
358
        | "SX"
359
        | "SZ"
360
        | "TA"
361
        | "TC"
362
        | "TD"
363
        | "TF"
364
        | "TG"
365
        | "TH"
366
        | "TJ"
367
        | "TK"
368
        | "TL"
369
        | "TM"
370
        | "TN"
371
        | "TO"
372
        | "TR"
373
        | "TT"
374
        | "TV"
375
        | "TW"
376
        | "TZ"
377
        | "UA"
378
        | "UG"
379
        | "US"
380
        | "UY"
381
        | "UZ"
382
        | "VA"
383
        | "VC"
384
        | "VE"
385
        | "VG"
386
        | "VN"
387
        | "VU"
388
        | "WF"
389
        | "WS"
390
        | "XK"
391
        | "YE"
392
        | "YT"
393
        | "ZA"
394
        | "ZM"
395
        | "ZW"
396
        | "ZZ"
397
      )[];
398
      [k: string]: unknown;
399
    };
400
    shipping_options?: { shipping_rate?: string; [k: string]: unknown }[];
401
    submit_type?: "auto" | "book" | "donate" | "pay";
402
    subscription_data?: {
403
      description?: string;
404
      invoice_settings?: {
405
        issuer?: {
406
          account?: string;
407
          type: "account" | "self";
408
          [k: string]: unknown;
409
        };
410
        [k: string]: unknown;
411
      };
412
      metadata?: { [k: string]: string };
413
      trial_period_days?: number;
414
      trial_settings?: {
415
        end_behavior: {
416
          missing_payment_method: "cancel" | "create_invoice" | "pause";
417
          [k: string]: unknown;
418
        };
419
        [k: string]: unknown;
420
      };
421
      [k: string]: unknown;
422
    };
423
    tax_id_collection?: { enabled: boolean; [k: string]: unknown };
424
    transfer_data?: {
425
      amount?: number;
426
      destination: string;
427
      [k: string]: unknown;
428
    };
429
  }
430
) {
431
  const url = new URL(`https://api.stripe.com/v1/payment_links`);
432

433
  const response = await fetch(url, {
434
    method: "POST",
435
    headers: {
436
      "Content-Type": "application/x-www-form-urlencoded",
437
      Authorization: "Bearer " + auth.token,
438
    },
439
    body: encodeParams(body),
440
  });
441
  if (!response.ok) {
442
    const text = await response.text();
443
    throw new Error(`${response.status} ${text}`);
444
  }
445
  return await response.json();
446
}
447

448
function encodeParams(o: any) {
449
  function iter(o: any, path: string) {
450
    if (Array.isArray(o)) {
451
      o.forEach(function (a) {
452
        iter(a, path + "[]");
453
      });
454
      return;
455
    }
456
    if (o !== null && typeof o === "object") {
457
      Object.keys(o).forEach(function (k) {
458
        iter(o[k], path + "[" + k + "]");
459
      });
460
      return;
461
    }
462
    data.push(path + "=" + o);
463
  }
464
  const data: string[] = [];
465
  Object.keys(o).forEach(function (k) {
466
    if (o[k] !== undefined) {
467
      iter(o[k], k);
468
    }
469
  });
470
  return new URLSearchParams(data.join("&"));
471
}
472