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 |
|