stripe 10.1.0 → 10.2.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 (41) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +241 -40
  3. data/OPENAPI_VERSION +1 -1
  4. data/README.md +11 -0
  5. data/VERSION +1 -1
  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 +21 -0
  9. data/lib/stripe/request_signing_authenticator.rb +83 -0
  10. data/lib/stripe/resources/account_notice.rb +14 -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/confirmation_token.rb +11 -0
  15. data/lib/stripe/resources/customer_session.rb +12 -0
  16. data/lib/stripe/resources/financial_connections/account.rb +39 -0
  17. data/lib/stripe/resources/financial_connections/account_inferred_balance.rb +13 -0
  18. data/lib/stripe/resources/financial_connections/transaction.rb +13 -0
  19. data/lib/stripe/resources/gift_cards/card.rb +25 -0
  20. data/lib/stripe/resources/gift_cards/transaction.rb +56 -0
  21. data/lib/stripe/resources/invoice.rb +21 -0
  22. data/lib/stripe/resources/invoice_payment.rb +11 -0
  23. data/lib/stripe/resources/issuing/credit_underwriting_record.rb +69 -0
  24. data/lib/stripe/resources/issuing/personalization_design.rb +77 -0
  25. data/lib/stripe/resources/issuing/physical_bundle.rb +13 -0
  26. data/lib/stripe/resources/margin.rb +14 -0
  27. data/lib/stripe/resources/order.rb +89 -0
  28. data/lib/stripe/resources/quote.rb +94 -0
  29. data/lib/stripe/resources/quote_phase.rb +29 -0
  30. data/lib/stripe/resources/quote_preview_invoice.rb +42 -0
  31. data/lib/stripe/resources/quote_preview_subscription_schedule.rb +10 -0
  32. data/lib/stripe/resources/subscription_schedule.rb +18 -0
  33. data/lib/stripe/resources/tax/form.rb +39 -0
  34. data/lib/stripe/resources/terminal/reader.rb +54 -0
  35. data/lib/stripe/resources.rb +20 -0
  36. data/lib/stripe/stripe_client.rb +60 -26
  37. data/lib/stripe/stripe_configuration.rb +2 -0
  38. data/lib/stripe/util.rb +8 -1
  39. data/lib/stripe/version.rb +1 -1
  40. data/lib/stripe.rb +46 -0
  41. metadata +24 -3
@@ -8,9 +8,13 @@ module Stripe
8
8
  extend Stripe::APIOperations::Create
9
9
  extend Stripe::APIOperations::List
10
10
  include Stripe::APIOperations::Save
11
+ extend Stripe::APIOperations::NestedResource
11
12
 
12
13
  OBJECT_NAME = "quote"
13
14
 
15
+ nested_resource_class_methods :preview_invoice, operations: %i[list]
16
+ nested_resource_class_methods :preview_subscription_schedule, operations: %i[list]
17
+
14
18
  def accept(params = {}, opts = {})
15
19
  request_stripe_object(
16
20
  method: :post,
@@ -56,6 +60,42 @@ module Stripe
56
60
  )
57
61
  end
58
62
 
63
+ def list_lines(params = {}, opts = {})
64
+ request_stripe_object(
65
+ method: :get,
66
+ path: format("/v1/quotes/%<quote>s/lines", { quote: CGI.escape(self["id"]) }),
67
+ params: params,
68
+ opts: opts
69
+ )
70
+ end
71
+
72
+ def list_preview_invoice_lines(preview_invoice, params = {}, opts = {})
73
+ request_stripe_object(
74
+ method: :get,
75
+ path: format("/v1/quotes/%<quote>s/preview_invoices/%<preview_invoice>s/lines", { quote: CGI.escape(self["id"]), preview_invoice: CGI.escape(preview_invoice) }),
76
+ params: params,
77
+ opts: opts
78
+ )
79
+ end
80
+
81
+ def mark_draft(params = {}, opts = {})
82
+ request_stripe_object(
83
+ method: :post,
84
+ path: format("/v1/quotes/%<quote>s/mark_draft", { quote: CGI.escape(self["id"]) }),
85
+ params: params,
86
+ opts: opts
87
+ )
88
+ end
89
+
90
+ def mark_stale(params = {}, opts = {})
91
+ request_stripe_object(
92
+ method: :post,
93
+ path: format("/v1/quotes/%<quote>s/mark_stale", { quote: CGI.escape(self["id"]) }),
94
+ params: params,
95
+ opts: opts
96
+ )
97
+ end
98
+
59
99
  def pdf(params = {}, opts = {}, &read_body_chunk_block)
60
100
  config = opts[:client]&.config || Stripe.config
61
101
  opts = { api_base: config.uploads_base }.merge(opts)
@@ -68,6 +108,15 @@ module Stripe
68
108
  )
69
109
  end
70
110
 
111
+ def reestimate(params = {}, opts = {})
112
+ request_stripe_object(
113
+ method: :post,
114
+ path: format("/v1/quotes/%<quote>s/reestimate", { quote: CGI.escape(self["id"]) }),
115
+ params: params,
116
+ opts: opts
117
+ )
118
+ end
119
+
71
120
  def self.accept(quote, params = {}, opts = {})
72
121
  request_stripe_object(
73
122
  method: :post,
@@ -113,6 +162,42 @@ module Stripe
113
162
  )
114
163
  end
115
164
 
165
+ def self.list_lines(quote, params = {}, opts = {})
166
+ request_stripe_object(
167
+ method: :get,
168
+ path: format("/v1/quotes/%<quote>s/lines", { quote: CGI.escape(quote) }),
169
+ params: params,
170
+ opts: opts
171
+ )
172
+ end
173
+
174
+ def self.list_preview_invoice_lines(quote, preview_invoice, params = {}, opts = {})
175
+ request_stripe_object(
176
+ method: :get,
177
+ path: format("/v1/quotes/%<quote>s/preview_invoices/%<preview_invoice>s/lines", { quote: CGI.escape(quote), preview_invoice: CGI.escape(preview_invoice) }),
178
+ params: params,
179
+ opts: opts
180
+ )
181
+ end
182
+
183
+ def self.mark_draft(quote, params = {}, opts = {})
184
+ request_stripe_object(
185
+ method: :post,
186
+ path: format("/v1/quotes/%<quote>s/mark_draft", { quote: CGI.escape(quote) }),
187
+ params: params,
188
+ opts: opts
189
+ )
190
+ end
191
+
192
+ def self.mark_stale(quote, params = {}, opts = {})
193
+ request_stripe_object(
194
+ method: :post,
195
+ path: format("/v1/quotes/%<quote>s/mark_stale", { quote: CGI.escape(quote) }),
196
+ params: params,
197
+ opts: opts
198
+ )
199
+ end
200
+
116
201
  def self.pdf(quote, params = {}, opts = {}, &read_body_chunk_block)
117
202
  config = opts[:client]&.config || Stripe.config
118
203
  opts = { api_base: config.uploads_base }.merge(opts)
@@ -124,5 +209,14 @@ module Stripe
124
209
  &read_body_chunk_block
125
210
  )
126
211
  end
212
+
213
+ def self.reestimate(quote, params = {}, opts = {})
214
+ request_stripe_object(
215
+ method: :post,
216
+ path: format("/v1/quotes/%<quote>s/reestimate", { quote: CGI.escape(quote) }),
217
+ params: params,
218
+ opts: opts
219
+ )
220
+ end
127
221
  end
128
222
  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
@@ -0,0 +1,42 @@
1
+ # File generated from our OpenAPI spec
2
+ # frozen_string_literal: true
3
+
4
+ module Stripe
5
+ # Invoices are statements of amounts owed by a customer, and are either
6
+ # generated one-off, or generated periodically from a subscription.
7
+ #
8
+ # They contain [invoice items](https://stripe.com/docs/api#invoiceitems), and proration adjustments
9
+ # that may be caused by subscription upgrades/downgrades (if necessary).
10
+ #
11
+ # If your invoice is configured to be billed through automatic charges,
12
+ # Stripe automatically finalizes your invoice and attempts payment. Note
13
+ # that finalizing the invoice,
14
+ # [when automatic](https://stripe.com/docs/invoicing/integration/automatic-advancement-collection), does
15
+ # not happen immediately as the invoice is created. Stripe waits
16
+ # until one hour after the last webhook was successfully sent (or the last
17
+ # webhook timed out after failing). If you (and the platforms you may have
18
+ # connected to) have no webhooks configured, Stripe waits one hour after
19
+ # creation to finalize the invoice.
20
+ #
21
+ # If your invoice is configured to be billed by sending an email, then based on your
22
+ # [email settings](https://dashboard.stripe.com/account/billing/automatic),
23
+ # Stripe will email the invoice to your customer and await payment. These
24
+ # emails can contain a link to a hosted page to pay the invoice.
25
+ #
26
+ # Stripe applies any customer credit on the account before determining the
27
+ # amount due for the invoice (i.e., the amount that will be actually
28
+ # charged). If the amount due for the invoice is less than Stripe's [minimum allowed charge
29
+ # per currency](https://stripe.com/docs/currencies#minimum-and-maximum-charge-amounts), the
30
+ # invoice is automatically marked paid, and we add the amount due to the
31
+ # customer's credit balance which is applied to the next invoice.
32
+ #
33
+ # More details on the customer's credit balance are
34
+ # [here](https://stripe.com/docs/billing/customer/balance).
35
+ #
36
+ # Related guide: [Send invoices to customers](https://stripe.com/docs/billing/invoices/sending)
37
+ class QuotePreviewInvoice < APIResource
38
+ extend Stripe::APIOperations::List
39
+
40
+ OBJECT_NAME = "quote_preview_invoice"
41
+ end
42
+ end
@@ -0,0 +1,10 @@
1
+ # File generated from our OpenAPI spec
2
+ # frozen_string_literal: true
3
+
4
+ module Stripe
5
+ class QuotePreviewSubscriptionSchedule < APIResource
6
+ extend Stripe::APIOperations::List
7
+
8
+ OBJECT_NAME = "quote_preview_subscription_schedule"
9
+ end
10
+ 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
@@ -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_notice"
6
7
  require "stripe/resources/account_session"
7
8
  require "stripe/resources/apple_pay_domain"
8
9
  require "stripe/resources/application_fee"
@@ -14,10 +15,14 @@ require "stripe/resources/bank_account"
14
15
  require "stripe/resources/billing_portal/configuration"
15
16
  require "stripe/resources/billing_portal/session"
16
17
  require "stripe/resources/capability"
18
+ require "stripe/resources/capital/financing_offer"
19
+ require "stripe/resources/capital/financing_summary"
20
+ require "stripe/resources/capital/financing_transaction"
17
21
  require "stripe/resources/card"
18
22
  require "stripe/resources/cash_balance"
19
23
  require "stripe/resources/charge"
20
24
  require "stripe/resources/checkout/session"
25
+ require "stripe/resources/confirmation_token"
21
26
  require "stripe/resources/country_spec"
22
27
  require "stripe/resources/coupon"
23
28
  require "stripe/resources/credit_note"
@@ -25,6 +30,7 @@ require "stripe/resources/credit_note_line_item"
25
30
  require "stripe/resources/customer"
26
31
  require "stripe/resources/customer_balance_transaction"
27
32
  require "stripe/resources/customer_cash_balance_transaction"
33
+ require "stripe/resources/customer_session"
28
34
  require "stripe/resources/discount"
29
35
  require "stripe/resources/dispute"
30
36
  require "stripe/resources/ephemeral_key"
@@ -33,24 +39,34 @@ require "stripe/resources/exchange_rate"
33
39
  require "stripe/resources/file"
34
40
  require "stripe/resources/file_link"
35
41
  require "stripe/resources/financial_connections/account"
42
+ require "stripe/resources/financial_connections/account_inferred_balance"
36
43
  require "stripe/resources/financial_connections/account_owner"
37
44
  require "stripe/resources/financial_connections/account_ownership"
38
45
  require "stripe/resources/financial_connections/session"
46
+ require "stripe/resources/financial_connections/transaction"
39
47
  require "stripe/resources/funding_instructions"
48
+ require "stripe/resources/gift_cards/card"
49
+ require "stripe/resources/gift_cards/transaction"
40
50
  require "stripe/resources/identity/verification_report"
41
51
  require "stripe/resources/identity/verification_session"
42
52
  require "stripe/resources/invoice"
43
53
  require "stripe/resources/invoice_item"
44
54
  require "stripe/resources/invoice_line_item"
55
+ require "stripe/resources/invoice_payment"
45
56
  require "stripe/resources/issuing/authorization"
46
57
  require "stripe/resources/issuing/card"
47
58
  require "stripe/resources/issuing/cardholder"
59
+ require "stripe/resources/issuing/credit_underwriting_record"
48
60
  require "stripe/resources/issuing/dispute"
61
+ require "stripe/resources/issuing/personalization_design"
62
+ require "stripe/resources/issuing/physical_bundle"
49
63
  require "stripe/resources/issuing/token"
50
64
  require "stripe/resources/issuing/transaction"
51
65
  require "stripe/resources/line_item"
52
66
  require "stripe/resources/login_link"
53
67
  require "stripe/resources/mandate"
68
+ require "stripe/resources/margin"
69
+ require "stripe/resources/order"
54
70
  require "stripe/resources/payment_intent"
55
71
  require "stripe/resources/payment_link"
56
72
  require "stripe/resources/payment_method"
@@ -63,6 +79,9 @@ require "stripe/resources/price"
63
79
  require "stripe/resources/product"
64
80
  require "stripe/resources/promotion_code"
65
81
  require "stripe/resources/quote"
82
+ require "stripe/resources/quote_phase"
83
+ require "stripe/resources/quote_preview_invoice"
84
+ require "stripe/resources/quote_preview_subscription_schedule"
66
85
  require "stripe/resources/radar/early_fraud_warning"
67
86
  require "stripe/resources/radar/value_list"
68
87
  require "stripe/resources/radar/value_list_item"
@@ -82,6 +101,7 @@ require "stripe/resources/subscription_item"
82
101
  require "stripe/resources/subscription_schedule"
83
102
  require "stripe/resources/tax/calculation"
84
103
  require "stripe/resources/tax/calculation_line_item"
104
+ require "stripe/resources/tax/form"
85
105
  require "stripe/resources/tax/registration"
86
106
  require "stripe/resources/tax/settings"
87
107
  require "stripe/resources/tax/transaction"
@@ -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
@@ -64,6 +65,7 @@ module Stripe
64
65
 
65
66
  def initialize
66
67
  @api_version = ApiVersion::CURRENT
68
+
67
69
  @ca_bundle_path = Stripe::DEFAULT_CA_BUNDLE_PATH
68
70
  @enable_telemetry = true
69
71
  @verify_ssl_certs = true