Post customers

Creates a new customer object.

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