stripe 8.7.1 → 8.8.0.pre.beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +179 -46
  3. data/README.md +11 -0
  4. data/VERSION +1 -1
  5. data/lib/data/ca-certificates.crt +3340 -290
  6. data/lib/stripe/api_operations/request.rb +2 -0
  7. data/lib/stripe/api_version.rb +1 -0
  8. data/lib/stripe/object_types.rb +16 -0
  9. data/lib/stripe/request_signing_authenticator.rb +83 -0
  10. data/lib/stripe/resources/account_session.rb +17 -0
  11. data/lib/stripe/resources/capital/financing_offer.rb +32 -0
  12. data/lib/stripe/resources/capital/financing_summary.rb +12 -0
  13. data/lib/stripe/resources/capital/financing_transaction.rb +13 -0
  14. data/lib/stripe/resources/customer_session.rb +12 -0
  15. data/lib/stripe/resources/financial_connections/account.rb +39 -0
  16. data/lib/stripe/resources/financial_connections/inferred_balance.rb +13 -0
  17. data/lib/stripe/resources/financial_connections/transaction.rb +13 -0
  18. data/lib/stripe/resources/gift_cards/card.rb +25 -0
  19. data/lib/stripe/resources/gift_cards/transaction.rb +56 -0
  20. data/lib/stripe/resources/issuing/card.rb +18 -0
  21. data/lib/stripe/resources/issuing/card_bundle.rb +13 -0
  22. data/lib/stripe/resources/issuing/card_design.rb +58 -0
  23. data/lib/stripe/resources/order.rb +89 -0
  24. data/lib/stripe/resources/payment_method_configuration.rb +13 -0
  25. data/lib/stripe/resources/quote.rb +131 -0
  26. data/lib/stripe/resources/quote_phase.rb +29 -0
  27. data/lib/stripe/resources/subscription_schedule.rb +18 -0
  28. data/lib/stripe/resources/tax/form.rb +39 -0
  29. data/lib/stripe/resources/tax/registration.rb +19 -0
  30. data/lib/stripe/resources/terminal/reader.rb +54 -0
  31. data/lib/stripe/resources.rb +16 -0
  32. data/lib/stripe/stripe_client.rb +60 -26
  33. data/lib/stripe/stripe_configuration.rb +3 -0
  34. data/lib/stripe/util.rb +8 -1
  35. data/lib/stripe/version.rb +1 -1
  36. data/lib/stripe.rb +47 -0
  37. metadata +25 -8
@@ -29,6 +29,15 @@ module Stripe
29
29
  )
30
30
  end
31
31
 
32
+ def draft_quote(params = {}, opts = {})
33
+ request_stripe_object(
34
+ method: :post,
35
+ path: format("/v1/quotes/%<quote>s/mark_draft", { quote: CGI.escape(self["id"]) }),
36
+ params: params,
37
+ opts: opts
38
+ )
39
+ end
40
+
32
41
  def finalize_quote(params = {}, opts = {})
33
42
  request_stripe_object(
34
43
  method: :post,
@@ -56,6 +65,24 @@ module Stripe
56
65
  )
57
66
  end
58
67
 
68
+ def list_lines(params = {}, opts = {})
69
+ request_stripe_object(
70
+ method: :get,
71
+ path: format("/v1/quotes/%<quote>s/lines", { quote: CGI.escape(self["id"]) }),
72
+ params: params,
73
+ opts: opts
74
+ )
75
+ end
76
+
77
+ def mark_stale_quote(params = {}, opts = {})
78
+ request_stripe_object(
79
+ method: :post,
80
+ path: format("/v1/quotes/%<quote>s/mark_stale", { quote: CGI.escape(self["id"]) }),
81
+ params: params,
82
+ opts: opts
83
+ )
84
+ end
85
+
59
86
  def pdf(params = {}, opts = {}, &read_body_chunk_block)
60
87
  config = opts[:client]&.config || Stripe.config
61
88
  opts = { api_base: config.uploads_base }.merge(opts)
@@ -68,6 +95,42 @@ module Stripe
68
95
  )
69
96
  end
70
97
 
98
+ def preview_invoice_lines(preview_invoice, params = {}, opts = {})
99
+ request_stripe_object(
100
+ method: :get,
101
+ path: format("/v1/quotes/%<quote>s/preview_invoices/%<preview_invoice>s/lines", { quote: CGI.escape(self["id"]), preview_invoice: CGI.escape(preview_invoice) }),
102
+ params: params,
103
+ opts: opts
104
+ )
105
+ end
106
+
107
+ def preview_invoices(params = {}, opts = {})
108
+ request_stripe_object(
109
+ method: :get,
110
+ path: format("/v1/quotes/%<quote>s/preview_invoices", { quote: CGI.escape(self["id"]) }),
111
+ params: params,
112
+ opts: opts
113
+ )
114
+ end
115
+
116
+ def preview_subscription_schedules(params = {}, opts = {})
117
+ request_stripe_object(
118
+ method: :get,
119
+ path: format("/v1/quotes/%<quote>s/preview_subscription_schedules", { quote: CGI.escape(self["id"]) }),
120
+ params: params,
121
+ opts: opts
122
+ )
123
+ end
124
+
125
+ def reestimate(params = {}, opts = {})
126
+ request_stripe_object(
127
+ method: :post,
128
+ path: format("/v1/quotes/%<quote>s/reestimate", { quote: CGI.escape(self["id"]) }),
129
+ params: params,
130
+ opts: opts
131
+ )
132
+ end
133
+
71
134
  def self.accept(quote, params = {}, opts = {})
72
135
  request_stripe_object(
73
136
  method: :post,
@@ -86,6 +149,15 @@ module Stripe
86
149
  )
87
150
  end
88
151
 
152
+ def self.draft_quote(quote, params = {}, opts = {})
153
+ request_stripe_object(
154
+ method: :post,
155
+ path: format("/v1/quotes/%<quote>s/mark_draft", { quote: CGI.escape(quote) }),
156
+ params: params,
157
+ opts: opts
158
+ )
159
+ end
160
+
89
161
  def self.finalize_quote(quote, params = {}, opts = {})
90
162
  request_stripe_object(
91
163
  method: :post,
@@ -113,6 +185,24 @@ module Stripe
113
185
  )
114
186
  end
115
187
 
188
+ def self.list_lines(quote, params = {}, opts = {})
189
+ request_stripe_object(
190
+ method: :get,
191
+ path: format("/v1/quotes/%<quote>s/lines", { quote: CGI.escape(quote) }),
192
+ params: params,
193
+ opts: opts
194
+ )
195
+ end
196
+
197
+ def self.mark_stale_quote(quote, params = {}, opts = {})
198
+ request_stripe_object(
199
+ method: :post,
200
+ path: format("/v1/quotes/%<quote>s/mark_stale", { quote: CGI.escape(quote) }),
201
+ params: params,
202
+ opts: opts
203
+ )
204
+ end
205
+
116
206
  def self.pdf(quote, params = {}, opts = {}, &read_body_chunk_block)
117
207
  config = opts[:client]&.config || Stripe.config
118
208
  opts = { api_base: config.uploads_base }.merge(opts)
@@ -124,5 +214,46 @@ module Stripe
124
214
  &read_body_chunk_block
125
215
  )
126
216
  end
217
+
218
+ def self.preview_invoice_lines(
219
+ quote,
220
+ preview_invoice,
221
+ params = {},
222
+ opts = {}
223
+ )
224
+ request_stripe_object(
225
+ method: :get,
226
+ path: format("/v1/quotes/%<quote>s/preview_invoices/%<preview_invoice>s/lines", { quote: CGI.escape(quote), preview_invoice: CGI.escape(preview_invoice) }),
227
+ params: params,
228
+ opts: opts
229
+ )
230
+ end
231
+
232
+ def self.preview_invoices(quote, params = {}, opts = {})
233
+ request_stripe_object(
234
+ method: :get,
235
+ path: format("/v1/quotes/%<quote>s/preview_invoices", { quote: CGI.escape(quote) }),
236
+ params: params,
237
+ opts: opts
238
+ )
239
+ end
240
+
241
+ def self.preview_subscription_schedules(quote, params = {}, opts = {})
242
+ request_stripe_object(
243
+ method: :get,
244
+ path: format("/v1/quotes/%<quote>s/preview_subscription_schedules", { quote: CGI.escape(quote) }),
245
+ params: params,
246
+ opts: opts
247
+ )
248
+ end
249
+
250
+ def self.reestimate(quote, params = {}, opts = {})
251
+ request_stripe_object(
252
+ method: :post,
253
+ path: format("/v1/quotes/%<quote>s/reestimate", { quote: CGI.escape(quote) }),
254
+ params: params,
255
+ opts: opts
256
+ )
257
+ end
127
258
  end
128
259
  end
@@ -0,0 +1,29 @@
1
+ # File generated from our OpenAPI spec
2
+ # frozen_string_literal: true
3
+
4
+ module Stripe
5
+ # A quote phase describes the line items, coupons, and trialing status of a subscription for a predefined time period.
6
+ class QuotePhase < APIResource
7
+ extend Stripe::APIOperations::List
8
+
9
+ OBJECT_NAME = "quote_phase"
10
+
11
+ def list_line_items(params = {}, opts = {})
12
+ request_stripe_object(
13
+ method: :get,
14
+ path: format("/v1/quote_phases/%<quote_phase>s/line_items", { quote_phase: CGI.escape(self["id"]) }),
15
+ params: params,
16
+ opts: opts
17
+ )
18
+ end
19
+
20
+ def self.list_line_items(quote_phase, params = {}, opts = {})
21
+ request_stripe_object(
22
+ method: :get,
23
+ path: format("/v1/quote_phases/%<quote_phase>s/line_items", { quote_phase: CGI.escape(quote_phase) }),
24
+ params: params,
25
+ opts: opts
26
+ )
27
+ end
28
+ end
29
+ end
@@ -12,6 +12,15 @@ module Stripe
12
12
 
13
13
  OBJECT_NAME = "subscription_schedule"
14
14
 
15
+ def amend(params = {}, opts = {})
16
+ request_stripe_object(
17
+ method: :post,
18
+ path: format("/v1/subscription_schedules/%<schedule>s/amend", { schedule: CGI.escape(self["id"]) }),
19
+ params: params,
20
+ opts: opts
21
+ )
22
+ end
23
+
15
24
  def cancel(params = {}, opts = {})
16
25
  request_stripe_object(
17
26
  method: :post,
@@ -30,6 +39,15 @@ module Stripe
30
39
  )
31
40
  end
32
41
 
42
+ def self.amend(schedule, params = {}, opts = {})
43
+ request_stripe_object(
44
+ method: :post,
45
+ path: format("/v1/subscription_schedules/%<schedule>s/amend", { schedule: CGI.escape(schedule) }),
46
+ params: params,
47
+ opts: opts
48
+ )
49
+ end
50
+
33
51
  def self.cancel(schedule, params = {}, opts = {})
34
52
  request_stripe_object(
35
53
  method: :post,
@@ -0,0 +1,39 @@
1
+ # File generated from our OpenAPI spec
2
+ # frozen_string_literal: true
3
+
4
+ module Stripe
5
+ module Tax
6
+ # Tax forms are legal documents which are delivered to one or more tax authorities for information reporting purposes.
7
+ #
8
+ # Related guide: [US tax reporting for Connect platforms](https://stripe.com/docs/connect/tax-reporting)
9
+ class Form < APIResource
10
+ extend Stripe::APIOperations::List
11
+
12
+ OBJECT_NAME = "tax.form"
13
+
14
+ def pdf(params = {}, opts = {}, &read_body_chunk_block)
15
+ config = opts[:client]&.config || Stripe.config
16
+ opts = { api_base: config.uploads_base }.merge(opts)
17
+ request_stream(
18
+ method: :get,
19
+ path: format("/v1/tax/forms/%<id>s/pdf", { id: CGI.escape(self["id"]) }),
20
+ params: params,
21
+ opts: opts,
22
+ &read_body_chunk_block
23
+ )
24
+ end
25
+
26
+ def self.pdf(id, params = {}, opts = {}, &read_body_chunk_block)
27
+ config = opts[:client]&.config || Stripe.config
28
+ opts = { api_base: config.uploads_base }.merge(opts)
29
+ execute_resource_request_stream(
30
+ :get,
31
+ format("/v1/tax/forms/%<id>s/pdf", { id: CGI.escape(id) }),
32
+ params,
33
+ opts,
34
+ &read_body_chunk_block
35
+ )
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,19 @@
1
+ # File generated from our OpenAPI spec
2
+ # frozen_string_literal: true
3
+
4
+ module Stripe
5
+ module Tax
6
+ # A Tax `Registration` lets us know that your business is registered to collect tax on payments within a region, enabling you to [automatically collect tax](https://stripe.com/docs/tax).
7
+ #
8
+ # Stripe doesn't register on your behalf with the relevant authorities when you create a Tax `Registration` object. For more information on how to register to collect tax, see [our guide](https://stripe.com/docs/tax/registering).
9
+ #
10
+ # Related guide: [Using the Registrations API](https://stripe.com/docs/tax/registrations-api)
11
+ class Registration < APIResource
12
+ extend Stripe::APIOperations::Create
13
+ extend Stripe::APIOperations::List
14
+ include Stripe::APIOperations::Save
15
+
16
+ OBJECT_NAME = "tax.registration"
17
+ end
18
+ end
19
+ end
@@ -23,6 +23,33 @@ module Stripe
23
23
  )
24
24
  end
25
25
 
26
+ def collect_inputs(params = {}, opts = {})
27
+ request_stripe_object(
28
+ method: :post,
29
+ path: format("/v1/terminal/readers/%<reader>s/collect_inputs", { reader: CGI.escape(self["id"]) }),
30
+ params: params,
31
+ opts: opts
32
+ )
33
+ end
34
+
35
+ def collect_payment_method(params = {}, opts = {})
36
+ request_stripe_object(
37
+ method: :post,
38
+ path: format("/v1/terminal/readers/%<reader>s/collect_payment_method", { reader: CGI.escape(self["id"]) }),
39
+ params: params,
40
+ opts: opts
41
+ )
42
+ end
43
+
44
+ def confirm_payment_intent(params = {}, opts = {})
45
+ request_stripe_object(
46
+ method: :post,
47
+ path: format("/v1/terminal/readers/%<reader>s/confirm_payment_intent", { reader: CGI.escape(self["id"]) }),
48
+ params: params,
49
+ opts: opts
50
+ )
51
+ end
52
+
26
53
  def process_payment_intent(params = {}, opts = {})
27
54
  request_stripe_object(
28
55
  method: :post,
@@ -68,6 +95,33 @@ module Stripe
68
95
  )
69
96
  end
70
97
 
98
+ def self.collect_inputs(reader, params = {}, opts = {})
99
+ request_stripe_object(
100
+ method: :post,
101
+ path: format("/v1/terminal/readers/%<reader>s/collect_inputs", { reader: CGI.escape(reader) }),
102
+ params: params,
103
+ opts: opts
104
+ )
105
+ end
106
+
107
+ def self.collect_payment_method(reader, params = {}, opts = {})
108
+ request_stripe_object(
109
+ method: :post,
110
+ path: format("/v1/terminal/readers/%<reader>s/collect_payment_method", { reader: CGI.escape(reader) }),
111
+ params: params,
112
+ opts: opts
113
+ )
114
+ end
115
+
116
+ def self.confirm_payment_intent(reader, params = {}, opts = {})
117
+ request_stripe_object(
118
+ method: :post,
119
+ path: format("/v1/terminal/readers/%<reader>s/confirm_payment_intent", { reader: CGI.escape(reader) }),
120
+ params: params,
121
+ opts: opts
122
+ )
123
+ end
124
+
71
125
  def self.process_payment_intent(reader, params = {}, opts = {})
72
126
  request_stripe_object(
73
127
  method: :post,
@@ -3,6 +3,7 @@
3
3
 
4
4
  require "stripe/resources/account"
5
5
  require "stripe/resources/account_link"
6
+ require "stripe/resources/account_session"
6
7
  require "stripe/resources/apple_pay_domain"
7
8
  require "stripe/resources/application_fee"
8
9
  require "stripe/resources/application_fee_refund"
@@ -13,6 +14,9 @@ require "stripe/resources/bank_account"
13
14
  require "stripe/resources/billing_portal/configuration"
14
15
  require "stripe/resources/billing_portal/session"
15
16
  require "stripe/resources/capability"
17
+ require "stripe/resources/capital/financing_offer"
18
+ require "stripe/resources/capital/financing_summary"
19
+ require "stripe/resources/capital/financing_transaction"
16
20
  require "stripe/resources/card"
17
21
  require "stripe/resources/cash_balance"
18
22
  require "stripe/resources/charge"
@@ -24,6 +28,7 @@ require "stripe/resources/credit_note_line_item"
24
28
  require "stripe/resources/customer"
25
29
  require "stripe/resources/customer_balance_transaction"
26
30
  require "stripe/resources/customer_cash_balance_transaction"
31
+ require "stripe/resources/customer_session"
27
32
  require "stripe/resources/discount"
28
33
  require "stripe/resources/dispute"
29
34
  require "stripe/resources/ephemeral_key"
@@ -34,8 +39,12 @@ require "stripe/resources/file_link"
34
39
  require "stripe/resources/financial_connections/account"
35
40
  require "stripe/resources/financial_connections/account_owner"
36
41
  require "stripe/resources/financial_connections/account_ownership"
42
+ require "stripe/resources/financial_connections/inferred_balance"
37
43
  require "stripe/resources/financial_connections/session"
44
+ require "stripe/resources/financial_connections/transaction"
38
45
  require "stripe/resources/funding_instructions"
46
+ require "stripe/resources/gift_cards/card"
47
+ require "stripe/resources/gift_cards/transaction"
39
48
  require "stripe/resources/identity/verification_report"
40
49
  require "stripe/resources/identity/verification_session"
41
50
  require "stripe/resources/invoice"
@@ -43,15 +52,19 @@ require "stripe/resources/invoice_item"
43
52
  require "stripe/resources/invoice_line_item"
44
53
  require "stripe/resources/issuing/authorization"
45
54
  require "stripe/resources/issuing/card"
55
+ require "stripe/resources/issuing/card_bundle"
56
+ require "stripe/resources/issuing/card_design"
46
57
  require "stripe/resources/issuing/cardholder"
47
58
  require "stripe/resources/issuing/dispute"
48
59
  require "stripe/resources/issuing/transaction"
49
60
  require "stripe/resources/line_item"
50
61
  require "stripe/resources/login_link"
51
62
  require "stripe/resources/mandate"
63
+ require "stripe/resources/order"
52
64
  require "stripe/resources/payment_intent"
53
65
  require "stripe/resources/payment_link"
54
66
  require "stripe/resources/payment_method"
67
+ require "stripe/resources/payment_method_configuration"
55
68
  require "stripe/resources/payout"
56
69
  require "stripe/resources/person"
57
70
  require "stripe/resources/plan"
@@ -59,6 +72,7 @@ require "stripe/resources/price"
59
72
  require "stripe/resources/product"
60
73
  require "stripe/resources/promotion_code"
61
74
  require "stripe/resources/quote"
75
+ require "stripe/resources/quote_phase"
62
76
  require "stripe/resources/radar/early_fraud_warning"
63
77
  require "stripe/resources/radar/value_list"
64
78
  require "stripe/resources/radar/value_list_item"
@@ -78,6 +92,8 @@ require "stripe/resources/subscription_item"
78
92
  require "stripe/resources/subscription_schedule"
79
93
  require "stripe/resources/tax/calculation"
80
94
  require "stripe/resources/tax/calculation_line_item"
95
+ require "stripe/resources/tax/form"
96
+ require "stripe/resources/tax/registration"
81
97
  require "stripe/resources/tax/settings"
82
98
  require "stripe/resources/tax/transaction"
83
99
  require "stripe/resources/tax/transaction_line_item"
@@ -212,9 +212,10 @@ module Stripe
212
212
  end
213
213
 
214
214
  def execute_request(method, path,
215
- api_base: nil, api_key: nil, headers: {}, params: {})
215
+ api_base: nil, api_key: nil,
216
+ headers: {}, params: {}, api_mode: nil)
216
217
  http_resp, api_key = execute_request_internal(
217
- method, path, api_base, api_key, headers, params
218
+ method, path, api_base, api_key, headers, params, api_mode
218
219
  )
219
220
 
220
221
  begin
@@ -245,6 +246,7 @@ module Stripe
245
246
  def execute_request_stream(method, path,
246
247
  api_base: nil, api_key: nil,
247
248
  headers: {}, params: {},
249
+ api_mode: nil,
248
250
  &read_body_chunk_block)
249
251
  unless block_given?
250
252
  raise ArgumentError,
@@ -252,7 +254,8 @@ module Stripe
252
254
  end
253
255
 
254
256
  http_resp, api_key = execute_request_internal(
255
- method, path, api_base, api_key, headers, params, &read_body_chunk_block
257
+ method, path, api_base, api_key,
258
+ headers, params, api_mode, &read_body_chunk_block
256
259
  )
257
260
 
258
261
  # When the read_body_chunk_block is given, we no longer have access to the
@@ -432,7 +435,7 @@ module Stripe
432
435
 
433
436
  private def execute_request_internal(method, path,
434
437
  api_base, api_key, headers, params,
435
- &read_body_chunk_block)
438
+ api_mode, &read_body_chunk_block)
436
439
  raise ArgumentError, "method should be a symbol" \
437
440
  unless method.is_a?(Symbol)
438
441
  raise ArgumentError, "path should be a string" \
@@ -440,9 +443,10 @@ module Stripe
440
443
 
441
444
  api_base ||= config.api_base
442
445
  api_key ||= config.api_key
446
+ authenticator ||= config.authenticator
443
447
  params = Util.objects_to_ids(params)
444
448
 
445
- check_api_key!(api_key)
449
+ check_keys!(api_key, authenticator)
446
450
 
447
451
  body_params = nil
448
452
  query_params = nil
@@ -455,8 +459,9 @@ module Stripe
455
459
 
456
460
  query_params, path = merge_query_params(query_params, path)
457
461
 
458
- headers = request_headers(api_key, method)
462
+ headers = request_headers(api_key, method, api_mode)
459
463
  .update(Util.normalize_headers(headers))
464
+
460
465
  url = api_url(path, api_base)
461
466
 
462
467
  # Merge given query parameters with any already encoded in the path.
@@ -467,13 +472,16 @@ module Stripe
467
472
  # a log-friendly variant of the encoded form. File objects are displayed
468
473
  # as such instead of as their file contents.
469
474
  body, body_log =
470
- body_params ? encode_body(body_params, headers) : [nil, nil]
475
+ body_params ? encode_body(body_params, headers, api_mode) : [nil, nil]
476
+
477
+ authenticator.authenticate(method, headers, body) unless api_key
471
478
 
472
479
  # stores information on the request we're about to make so that we don't
473
480
  # have to pass as many parameters around for logging.
474
481
  context = RequestLogContext.new
475
482
  context.account = headers["Stripe-Account"]
476
483
  context.api_key = api_key
484
+ context.authenticator = authenticator
477
485
  context.api_version = headers["Stripe-Version"]
478
486
  context.body = body_log
479
487
  context.idempotency_key = headers["Idempotency-Key"]
@@ -512,8 +520,16 @@ module Stripe
512
520
  (api_base || config.api_base) + url
513
521
  end
514
522
 
515
- private def check_api_key!(api_key)
516
- unless api_key
523
+ private def check_keys!(api_key, authenticator)
524
+ if api_key && authenticator
525
+ raise AuthenticationError, "Can't specify both API key " \
526
+ "and authenticator. Either set your API key" \
527
+ 'using "Stripe.api_key = <API-KEY>", or set your authenticator ' \
528
+ 'using "Stripe.authenticator = <AUTHENTICATOR>"' \
529
+ end
530
+
531
+ unless api_key || authenticator
532
+ # Default to missing API key error message for general users.
517
533
  raise AuthenticationError, "No API key provided. " \
518
534
  'Set your API key using "Stripe.api_key = <API-KEY>". ' \
519
535
  "You can generate API keys from the Stripe web interface. " \
@@ -532,7 +548,7 @@ module Stripe
532
548
  # Encodes a set of body parameters using multipart if `Content-Type` is set
533
549
  # for that, or standard form-encoding otherwise. Returns the encoded body
534
550
  # and a version of the encoded body that's safe to be logged.
535
- private def encode_body(body_params, headers)
551
+ private def encode_body(body_params, headers, api_mode)
536
552
  body = nil
537
553
  flattened_params = Util.flatten_params(body_params)
538
554
 
@@ -548,15 +564,22 @@ module Stripe
548
564
  flattened_params =
549
565
  flattened_params.map { |k, v| [k, v.is_a?(String) ? v : v.to_s] }.to_h
550
566
 
567
+ elsif api_mode == :preview
568
+ body = JSON.generate(body_params)
569
+ headers["Content-Type"] = "application/json"
551
570
  else
552
571
  body = Util.encode_parameters(body_params)
553
572
  end
554
573
 
555
- # We don't use `Util.encode_parameters` partly as an optimization (to not
556
- # redo work we've already done), and partly because the encoded forms of
557
- # certain characters introduce a lot of visual noise and it's nice to
558
- # have a clearer format for logs.
559
- body_log = flattened_params.map { |k, v| "#{k}=#{v}" }.join("&")
574
+ if api_mode == :preview
575
+ body_log = body
576
+ else
577
+ # We don't use `Util.encode_parameters` partly as an optimization (to
578
+ # not redo work we've already done), and partly because the encoded
579
+ # forms of certain characters introduce a lot of visual noise and it's
580
+ # nice to have a clearer format for logs.
581
+ body_log = flattened_params.map { |k, v| "#{k}=#{v}" }.join("&")
582
+ end
560
583
 
561
584
  [body, body_log]
562
585
  end
@@ -745,10 +768,11 @@ module Stripe
745
768
  end
746
769
 
747
770
  private def specific_api_error(resp, error_data, context)
771
+ message = error_data[:message]
748
772
  Util.log_error("Stripe API error",
749
773
  status: resp.http_status,
750
774
  error_code: error_data[:code],
751
- error_message: error_data[:message],
775
+ error_message: message,
752
776
  error_param: error_data[:param],
753
777
  error_type: error_data[:type],
754
778
  idempotency_key: context.idempotency_key,
@@ -769,26 +793,26 @@ module Stripe
769
793
  when 400, 404
770
794
  case error_data[:type]
771
795
  when "idempotency_error"
772
- IdempotencyError.new(error_data[:message], **opts)
796
+ IdempotencyError.new(message, **opts)
773
797
  else
774
798
  InvalidRequestError.new(
775
- error_data[:message], error_data[:param],
799
+ message, error_data[:param],
776
800
  **opts
777
801
  )
778
802
  end
779
803
  when 401
780
- AuthenticationError.new(error_data[:message], **opts)
804
+ AuthenticationError.new(message, **opts)
781
805
  when 402
782
806
  CardError.new(
783
- error_data[:message], error_data[:param],
807
+ message, error_data[:param],
784
808
  **opts
785
809
  )
786
810
  when 403
787
- PermissionError.new(error_data[:message], **opts)
811
+ PermissionError.new(message, **opts)
788
812
  when 429
789
- RateLimitError.new(error_data[:message], **opts)
813
+ RateLimitError.new(message, **opts)
790
814
  else
791
- APIError.new(error_data[:message], **opts)
815
+ APIError.new(message, **opts)
792
816
  end
793
817
  end
794
818
 
@@ -856,7 +880,7 @@ module Stripe
856
880
  message + "\n\n(Network error: #{error.message})"
857
881
  end
858
882
 
859
- private def request_headers(api_key, method)
883
+ private def request_headers(api_key, method, api_mode)
860
884
  user_agent = "Stripe/v1 RubyBindings/#{Stripe::VERSION}"
861
885
  unless Stripe.app_info.nil?
862
886
  user_agent += " " + format_app_info(Stripe.app_info)
@@ -865,9 +889,13 @@ module Stripe
865
889
  headers = {
866
890
  "User-Agent" => user_agent,
867
891
  "Authorization" => "Bearer #{api_key}",
868
- "Content-Type" => "application/x-www-form-urlencoded",
869
892
  }
870
893
 
894
+ if api_mode != :preview
895
+ # TODO: (major) don't set Content-Type if method is not post
896
+ headers["Content-Type"] = "application/x-www-form-urlencoded"
897
+ end
898
+
871
899
  if config.enable_telemetry? && !@last_request_metrics.nil?
872
900
  headers["X-Stripe-Client-Telemetry"] = JSON.generate(
873
901
  last_request_metrics: @last_request_metrics.payload
@@ -880,7 +908,12 @@ module Stripe
880
908
  headers["Idempotency-Key"] ||= SecureRandom.uuid
881
909
  end
882
910
 
883
- headers["Stripe-Version"] = config.api_version if config.api_version
911
+ if api_mode == :preview
912
+ headers["Stripe-Version"] = ApiVersion::PREVIEW
913
+ elsif config.api_version
914
+ headers["Stripe-Version"] = config.api_version
915
+ end
916
+
884
917
  headers["Stripe-Account"] = config.stripe_account if config.stripe_account
885
918
 
886
919
  user_agent = @system_profiler.user_agent
@@ -966,6 +999,7 @@ module Stripe
966
999
  attr_accessor :body
967
1000
  attr_accessor :account
968
1001
  attr_accessor :api_key
1002
+ attr_accessor :authenticator
969
1003
  attr_accessor :api_version
970
1004
  attr_accessor :idempotency_key
971
1005
  attr_accessor :method
@@ -27,6 +27,7 @@ module Stripe
27
27
  class StripeConfiguration
28
28
  attr_accessor :api_key
29
29
  attr_accessor :api_version
30
+ attr_accessor :authenticator
30
31
  attr_accessor :client_id
31
32
  attr_accessor :enable_telemetry
32
33
  attr_accessor :logger
@@ -63,6 +64,8 @@ module Stripe
63
64
  end
64
65
 
65
66
  def initialize
67
+ @api_version = ApiVersion::CURRENT
68
+
66
69
  @ca_bundle_path = Stripe::DEFAULT_CA_BUNDLE_PATH
67
70
  @enable_telemetry = true
68
71
  @verify_ssl_certs = true