1 | type Stripe = { |
2 | token: string; |
3 | }; |
4 | |
5 | * Post customers |
6 | * Creates a new customer object. |
7 | */ |
8 | export async function main( |
9 | auth: Stripe, |
10 | body: { |
11 | address?: |
12 | | { |
13 | city?: string; |
14 | country?: string; |
15 | line1?: string; |
16 | line2?: string; |
17 | postal_code?: string; |
18 | state?: string; |
19 | [k: string]: unknown; |
20 | } |
21 | | ""; |
22 | balance?: number; |
23 | cash_balance?: { |
24 | settings?: { |
25 | reconciliation_mode?: "automatic" | "manual" | "merchant_default"; |
26 | [k: string]: unknown; |
27 | }; |
28 | [k: string]: unknown; |
29 | }; |
30 | coupon?: string; |
31 | description?: string; |
32 | email?: string; |
33 | expand?: string[]; |
34 | invoice_prefix?: string; |
35 | invoice_settings?: { |
36 | custom_fields?: |
37 | | { name: string; value: string; [k: string]: unknown }[] |
38 | | ""; |
39 | default_payment_method?: string; |
40 | footer?: string; |
41 | rendering_options?: |
42 | | { |
43 | amount_tax_display?: "" | "exclude_tax" | "include_inclusive_tax"; |
44 | [k: string]: unknown; |
45 | } |
46 | | ""; |
47 | [k: string]: unknown; |
48 | }; |
49 | metadata?: { [k: string]: string } | ""; |
50 | name?: string; |
51 | next_invoice_sequence?: number; |
52 | payment_method?: string; |
53 | phone?: string; |
54 | preferred_locales?: string[]; |
55 | promotion_code?: string; |
56 | shipping?: |
57 | | { |
58 | address: { |
59 | city?: string; |
60 | country?: string; |
61 | line1?: string; |
62 | line2?: string; |
63 | postal_code?: string; |
64 | state?: string; |
65 | [k: string]: unknown; |
66 | }; |
67 | name: string; |
68 | phone?: string; |
69 | [k: string]: unknown; |
70 | } |
71 | | ""; |
72 | source?: string; |
73 | tax?: { |
74 | ip_address?: string | ""; |
75 | validate_location?: "deferred" | "immediately"; |
76 | [k: string]: unknown; |
77 | }; |
78 | tax_exempt?: "" | "exempt" | "none" | "reverse"; |
79 | tax_id_data?: { |
80 | type: |
81 | | "ad_nrt" |
82 | | "ae_trn" |
83 | | "ar_cuit" |
84 | | "au_abn" |
85 | | "au_arn" |
86 | | "bg_uic" |
87 | | "bo_tin" |
88 | | "br_cnpj" |
89 | | "br_cpf" |
90 | | "ca_bn" |
91 | | "ca_gst_hst" |
92 | | "ca_pst_bc" |
93 | | "ca_pst_mb" |
94 | | "ca_pst_sk" |
95 | | "ca_qst" |
96 | | "ch_vat" |
97 | | "cl_tin" |
98 | | "cn_tin" |
99 | | "co_nit" |
100 | | "cr_tin" |
101 | | "do_rcn" |
102 | | "ec_ruc" |
103 | | "eg_tin" |
104 | | "es_cif" |
105 | | "eu_oss_vat" |
106 | | "eu_vat" |
107 | | "gb_vat" |
108 | | "ge_vat" |
109 | | "hk_br" |
110 | | "hu_tin" |
111 | | "id_npwp" |
112 | | "il_vat" |
113 | | "in_gst" |
114 | | "is_vat" |
115 | | "jp_cn" |
116 | | "jp_rn" |
117 | | "jp_trn" |
118 | | "ke_pin" |
119 | | "kr_brn" |
120 | | "li_uid" |
121 | | "mx_rfc" |
122 | | "my_frp" |
123 | | "my_itn" |
124 | | "my_sst" |
125 | | "no_vat" |
126 | | "no_voec" |
127 | | "nz_gst" |
128 | | "pe_ruc" |
129 | | "ph_tin" |
130 | | "ro_tin" |
131 | | "rs_pib" |
132 | | "ru_inn" |
133 | | "ru_kpp" |
134 | | "sa_vat" |
135 | | "sg_gst" |
136 | | "sg_uen" |
137 | | "si_tin" |
138 | | "sv_nit" |
139 | | "th_vat" |
140 | | "tr_tin" |
141 | | "tw_vat" |
142 | | "ua_vat" |
143 | | "us_ein" |
144 | | "uy_ruc" |
145 | | "ve_rif" |
146 | | "vn_tin" |
147 | | "za_vat"; |
148 | value: string; |
149 | [k: string]: unknown; |
150 | }[]; |
151 | test_clock?: string; |
152 | } |
153 | ) { |
154 | const url = new URL(`https://api.stripe.com/v1/customers`); |
155 |
|
156 | const response = await fetch(url, { |
157 | method: "POST", |
158 | headers: { |
159 | "Content-Type": "application/x-www-form-urlencoded", |
160 | Authorization: "Bearer " + auth.token, |
161 | }, |
162 | body: encodeParams(body), |
163 | }); |
164 | if (!response.ok) { |
165 | const text = await response.text(); |
166 | throw new Error(`${response.status} ${text}`); |
167 | } |
168 | return await response.json(); |
169 | } |
170 |
|
171 | function encodeParams(o: any) { |
172 | function iter(o: any, path: string) { |
173 | if (Array.isArray(o)) { |
174 | o.forEach(function (a) { |
175 | iter(a, path + "[]"); |
176 | }); |
177 | return; |
178 | } |
179 | if (o !== null && typeof o === "object") { |
180 | Object.keys(o).forEach(function (k) { |
181 | iter(o[k], path + "[" + k + "]"); |
182 | }); |
183 | return; |
184 | } |
185 | data.push(path + "=" + o); |
186 | } |
187 | const data: string[] = []; |
188 | Object.keys(o).forEach(function (k) { |
189 | if (o[k] !== undefined) { |
190 | iter(o[k], k); |
191 | } |
192 | }); |
193 | return new URLSearchParams(data.join("&")); |
194 | } |
195 |
|