stripe 10.2.0.pre.beta.1 → 10.2.0
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +51 -239
- data/Gemfile +5 -2
- data/OPENAPI_VERSION +1 -1
- data/README.md +0 -11
- data/Rakefile +7 -5
- data/VERSION +1 -1
- data/bin/stripe-console +1 -1
- data/lib/stripe/api_operations/request.rb +3 -7
- data/lib/stripe/api_operations/save.rb +5 -7
- data/lib/stripe/api_resource_test_helpers.rb +2 -2
- data/lib/stripe/api_version.rb +0 -1
- data/lib/stripe/connection_manager.rb +4 -6
- data/lib/stripe/errors.rb +3 -11
- data/lib/stripe/instrumentation.rb +5 -21
- data/lib/stripe/multipart_encoder.rb +7 -7
- data/lib/stripe/oauth.rb +6 -6
- data/lib/stripe/object_types.rb +3 -21
- data/lib/stripe/resources/account.rb +6 -10
- data/lib/stripe/resources/alipay_account.rb +1 -1
- data/lib/stripe/resources/application_fee_refund.rb +1 -1
- data/lib/stripe/resources/bank_account.rb +2 -2
- data/lib/stripe/resources/capability.rb +1 -1
- data/lib/stripe/resources/climate/order.rb +34 -0
- data/lib/stripe/resources/climate/product.rb +14 -0
- data/lib/stripe/resources/climate/supplier.rb +13 -0
- data/lib/stripe/resources/event.rb +2 -2
- data/lib/stripe/resources/file.rb +2 -4
- data/lib/stripe/resources/financial_connections/account.rb +0 -39
- data/lib/stripe/resources/invoice.rb +0 -21
- data/lib/stripe/resources/quote.rb +0 -94
- data/lib/stripe/resources/reversal.rb +1 -1
- data/lib/stripe/resources/subscription_schedule.rb +0 -18
- data/lib/stripe/resources/tax_id.rb +1 -1
- data/lib/stripe/resources/terminal/reader.rb +0 -54
- data/lib/stripe/resources.rb +3 -20
- data/lib/stripe/stripe_client.rb +51 -102
- data/lib/stripe/stripe_configuration.rb +13 -31
- data/lib/stripe/stripe_object.rb +15 -18
- data/lib/stripe/stripe_response.rb +1 -3
- data/lib/stripe/util.rb +11 -20
- data/lib/stripe/version.rb +1 -1
- data/lib/stripe.rb +0 -46
- data/stripe.gemspec +3 -2
- metadata +8 -25
- data/lib/stripe/request_signing_authenticator.rb +0 -83
- data/lib/stripe/resources/account_notice.rb +0 -14
- data/lib/stripe/resources/capital/financing_offer.rb +0 -32
- data/lib/stripe/resources/capital/financing_summary.rb +0 -12
- data/lib/stripe/resources/capital/financing_transaction.rb +0 -13
- data/lib/stripe/resources/confirmation_token.rb +0 -11
- data/lib/stripe/resources/customer_session.rb +0 -12
- data/lib/stripe/resources/financial_connections/account_inferred_balance.rb +0 -13
- data/lib/stripe/resources/financial_connections/transaction.rb +0 -13
- data/lib/stripe/resources/gift_cards/card.rb +0 -25
- data/lib/stripe/resources/gift_cards/transaction.rb +0 -56
- data/lib/stripe/resources/invoice_payment.rb +0 -11
- data/lib/stripe/resources/issuing/credit_underwriting_record.rb +0 -69
- data/lib/stripe/resources/issuing/personalization_design.rb +0 -77
- data/lib/stripe/resources/issuing/physical_bundle.rb +0 -13
- data/lib/stripe/resources/margin.rb +0 -14
- data/lib/stripe/resources/order.rb +0 -89
- data/lib/stripe/resources/quote_phase.rb +0 -29
- data/lib/stripe/resources/quote_preview_invoice.rb +0 -42
- data/lib/stripe/resources/quote_preview_subscription_schedule.rb +0 -10
- data/lib/stripe/resources/tax/form.rb +0 -39
@@ -23,33 +23,6 @@ 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
|
-
|
53
26
|
def process_payment_intent(params = {}, opts = {})
|
54
27
|
request_stripe_object(
|
55
28
|
method: :post,
|
@@ -95,33 +68,6 @@ module Stripe
|
|
95
68
|
)
|
96
69
|
end
|
97
70
|
|
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
|
-
|
125
71
|
def self.process_payment_intent(reader, params = {}, opts = {})
|
126
72
|
request_stripe_object(
|
127
73
|
method: :post,
|
data/lib/stripe/resources.rb
CHANGED
@@ -3,7 +3,6 @@
|
|
3
3
|
|
4
4
|
require "stripe/resources/account"
|
5
5
|
require "stripe/resources/account_link"
|
6
|
-
require "stripe/resources/account_notice"
|
7
6
|
require "stripe/resources/account_session"
|
8
7
|
require "stripe/resources/apple_pay_domain"
|
9
8
|
require "stripe/resources/application_fee"
|
@@ -15,14 +14,13 @@ require "stripe/resources/bank_account"
|
|
15
14
|
require "stripe/resources/billing_portal/configuration"
|
16
15
|
require "stripe/resources/billing_portal/session"
|
17
16
|
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"
|
21
17
|
require "stripe/resources/card"
|
22
18
|
require "stripe/resources/cash_balance"
|
23
19
|
require "stripe/resources/charge"
|
24
20
|
require "stripe/resources/checkout/session"
|
25
|
-
require "stripe/resources/
|
21
|
+
require "stripe/resources/climate/order"
|
22
|
+
require "stripe/resources/climate/product"
|
23
|
+
require "stripe/resources/climate/supplier"
|
26
24
|
require "stripe/resources/country_spec"
|
27
25
|
require "stripe/resources/coupon"
|
28
26
|
require "stripe/resources/credit_note"
|
@@ -30,7 +28,6 @@ require "stripe/resources/credit_note_line_item"
|
|
30
28
|
require "stripe/resources/customer"
|
31
29
|
require "stripe/resources/customer_balance_transaction"
|
32
30
|
require "stripe/resources/customer_cash_balance_transaction"
|
33
|
-
require "stripe/resources/customer_session"
|
34
31
|
require "stripe/resources/discount"
|
35
32
|
require "stripe/resources/dispute"
|
36
33
|
require "stripe/resources/ephemeral_key"
|
@@ -39,34 +36,24 @@ require "stripe/resources/exchange_rate"
|
|
39
36
|
require "stripe/resources/file"
|
40
37
|
require "stripe/resources/file_link"
|
41
38
|
require "stripe/resources/financial_connections/account"
|
42
|
-
require "stripe/resources/financial_connections/account_inferred_balance"
|
43
39
|
require "stripe/resources/financial_connections/account_owner"
|
44
40
|
require "stripe/resources/financial_connections/account_ownership"
|
45
41
|
require "stripe/resources/financial_connections/session"
|
46
|
-
require "stripe/resources/financial_connections/transaction"
|
47
42
|
require "stripe/resources/funding_instructions"
|
48
|
-
require "stripe/resources/gift_cards/card"
|
49
|
-
require "stripe/resources/gift_cards/transaction"
|
50
43
|
require "stripe/resources/identity/verification_report"
|
51
44
|
require "stripe/resources/identity/verification_session"
|
52
45
|
require "stripe/resources/invoice"
|
53
46
|
require "stripe/resources/invoice_item"
|
54
47
|
require "stripe/resources/invoice_line_item"
|
55
|
-
require "stripe/resources/invoice_payment"
|
56
48
|
require "stripe/resources/issuing/authorization"
|
57
49
|
require "stripe/resources/issuing/card"
|
58
50
|
require "stripe/resources/issuing/cardholder"
|
59
|
-
require "stripe/resources/issuing/credit_underwriting_record"
|
60
51
|
require "stripe/resources/issuing/dispute"
|
61
|
-
require "stripe/resources/issuing/personalization_design"
|
62
|
-
require "stripe/resources/issuing/physical_bundle"
|
63
52
|
require "stripe/resources/issuing/token"
|
64
53
|
require "stripe/resources/issuing/transaction"
|
65
54
|
require "stripe/resources/line_item"
|
66
55
|
require "stripe/resources/login_link"
|
67
56
|
require "stripe/resources/mandate"
|
68
|
-
require "stripe/resources/margin"
|
69
|
-
require "stripe/resources/order"
|
70
57
|
require "stripe/resources/payment_intent"
|
71
58
|
require "stripe/resources/payment_link"
|
72
59
|
require "stripe/resources/payment_method"
|
@@ -79,9 +66,6 @@ require "stripe/resources/price"
|
|
79
66
|
require "stripe/resources/product"
|
80
67
|
require "stripe/resources/promotion_code"
|
81
68
|
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"
|
85
69
|
require "stripe/resources/radar/early_fraud_warning"
|
86
70
|
require "stripe/resources/radar/value_list"
|
87
71
|
require "stripe/resources/radar/value_list_item"
|
@@ -101,7 +85,6 @@ require "stripe/resources/subscription_item"
|
|
101
85
|
require "stripe/resources/subscription_schedule"
|
102
86
|
require "stripe/resources/tax/calculation"
|
103
87
|
require "stripe/resources/tax/calculation_line_item"
|
104
|
-
require "stripe/resources/tax/form"
|
105
88
|
require "stripe/resources/tax/registration"
|
106
89
|
require "stripe/resources/tax/settings"
|
107
90
|
require "stripe/resources/tax/transaction"
|
data/lib/stripe/stripe_client.rb
CHANGED
@@ -36,8 +36,7 @@ module Stripe
|
|
36
36
|
end
|
37
37
|
end
|
38
38
|
|
39
|
-
attr_reader :config
|
40
|
-
attr_reader :options
|
39
|
+
attr_reader :config, :options
|
41
40
|
|
42
41
|
# Gets a currently active `StripeClient`. Set for the current thread when
|
43
42
|
# `StripeClient#request` is being run so that API operations being executed
|
@@ -80,9 +79,7 @@ module Stripe
|
|
80
79
|
end
|
81
80
|
end
|
82
81
|
|
83
|
-
if thread_context.default_connection_managers.empty?
|
84
|
-
pruned_contexts << thread_context
|
85
|
-
end
|
82
|
+
pruned_contexts << thread_context if thread_context.default_connection_managers.empty?
|
86
83
|
end
|
87
84
|
|
88
85
|
@thread_contexts_with_connection_managers.subtract(pruned_contexts)
|
@@ -120,7 +117,7 @@ module Stripe
|
|
120
117
|
when Net::OpenTimeout, Net::ReadTimeout
|
121
118
|
# Retry on timeout-related problems (either on open or read).
|
122
119
|
true
|
123
|
-
when EOFError, Errno::ECONNREFUSED, Errno::ECONNRESET,
|
120
|
+
when EOFError, Errno::ECONNREFUSED, Errno::ECONNRESET, # rubocop:todo Lint/DuplicateBranch
|
124
121
|
Errno::EHOSTUNREACH, Errno::ETIMEDOUT, SocketError
|
125
122
|
# Destination refused the connection, the connection was reset, or a
|
126
123
|
# variety of other connection failures. This could occur from a single
|
@@ -212,10 +209,9 @@ module Stripe
|
|
212
209
|
end
|
213
210
|
|
214
211
|
def execute_request(method, path,
|
215
|
-
api_base: nil, api_key: nil,
|
216
|
-
headers: {}, params: {}, api_mode: nil)
|
212
|
+
api_base: nil, api_key: nil, headers: {}, params: {})
|
217
213
|
http_resp, api_key = execute_request_internal(
|
218
|
-
method, path, api_base, api_key, headers, params
|
214
|
+
method, path, api_base, api_key, headers, params
|
219
215
|
)
|
220
216
|
|
221
217
|
begin
|
@@ -246,7 +242,6 @@ module Stripe
|
|
246
242
|
def execute_request_stream(method, path,
|
247
243
|
api_base: nil, api_key: nil,
|
248
244
|
headers: {}, params: {},
|
249
|
-
api_mode: nil,
|
250
245
|
&read_body_chunk_block)
|
251
246
|
unless block_given?
|
252
247
|
raise ArgumentError,
|
@@ -254,8 +249,7 @@ module Stripe
|
|
254
249
|
end
|
255
250
|
|
256
251
|
http_resp, api_key = execute_request_internal(
|
257
|
-
method, path, api_base, api_key,
|
258
|
-
headers, params, api_mode, &read_body_chunk_block
|
252
|
+
method, path, api_base, api_key, headers, params, &read_body_chunk_block
|
259
253
|
)
|
260
254
|
|
261
255
|
# When the read_body_chunk_block is given, we no longer have access to the
|
@@ -290,21 +284,21 @@ module Stripe
|
|
290
284
|
|
291
285
|
ERROR_MESSAGE_CONNECTION =
|
292
286
|
"Unexpected error communicating when trying to connect to " \
|
293
|
-
|
294
|
-
|
295
|
-
|
287
|
+
"Stripe (%s). You may be seeing this message because your DNS is not " \
|
288
|
+
"working or you don't have an internet connection. To check, try " \
|
289
|
+
"running `host stripe.com` from the command line."
|
296
290
|
ERROR_MESSAGE_SSL =
|
297
291
|
"Could not establish a secure connection to Stripe (%s), you " \
|
298
|
-
|
299
|
-
|
300
|
-
|
292
|
+
"may need to upgrade your OpenSSL version. To check, try running " \
|
293
|
+
"`openssl s_client -connect api.stripe.com:443` from the command " \
|
294
|
+
"line."
|
301
295
|
|
302
296
|
# Common error suffix sared by both connect and read timeout messages.
|
303
297
|
ERROR_MESSAGE_TIMEOUT_SUFFIX =
|
304
298
|
"Please check your internet connection and try again. " \
|
305
|
-
|
306
|
-
|
307
|
-
|
299
|
+
"If this problem persists, you should check Stripe's service " \
|
300
|
+
"status at https://status.stripe.com, or let us know at " \
|
301
|
+
"support@stripe.com."
|
308
302
|
|
309
303
|
ERROR_MESSAGE_TIMEOUT_CONNECT = (
|
310
304
|
"Timed out connecting to Stripe (%s). " +
|
@@ -435,7 +429,7 @@ module Stripe
|
|
435
429
|
|
436
430
|
private def execute_request_internal(method, path,
|
437
431
|
api_base, api_key, headers, params,
|
438
|
-
|
432
|
+
&read_body_chunk_block)
|
439
433
|
raise ArgumentError, "method should be a symbol" \
|
440
434
|
unless method.is_a?(Symbol)
|
441
435
|
raise ArgumentError, "path should be a string" \
|
@@ -443,10 +437,9 @@ module Stripe
|
|
443
437
|
|
444
438
|
api_base ||= config.api_base
|
445
439
|
api_key ||= config.api_key
|
446
|
-
authenticator ||= config.authenticator
|
447
440
|
params = Util.objects_to_ids(params)
|
448
441
|
|
449
|
-
|
442
|
+
check_api_key!(api_key)
|
450
443
|
|
451
444
|
body_params = nil
|
452
445
|
query_params = nil
|
@@ -459,9 +452,8 @@ module Stripe
|
|
459
452
|
|
460
453
|
query_params, path = merge_query_params(query_params, path)
|
461
454
|
|
462
|
-
headers = request_headers(api_key, method
|
455
|
+
headers = request_headers(api_key, method)
|
463
456
|
.update(Util.normalize_headers(headers))
|
464
|
-
|
465
457
|
url = api_url(path, api_base)
|
466
458
|
|
467
459
|
# Merge given query parameters with any already encoded in the path.
|
@@ -472,16 +464,13 @@ module Stripe
|
|
472
464
|
# a log-friendly variant of the encoded form. File objects are displayed
|
473
465
|
# as such instead of as their file contents.
|
474
466
|
body, body_log =
|
475
|
-
body_params ? encode_body(body_params, headers
|
476
|
-
|
477
|
-
authenticator.authenticate(method, headers, body) unless api_key
|
467
|
+
body_params ? encode_body(body_params, headers) : [nil, nil]
|
478
468
|
|
479
469
|
# stores information on the request we're about to make so that we don't
|
480
470
|
# have to pass as many parameters around for logging.
|
481
471
|
context = RequestLogContext.new
|
482
472
|
context.account = headers["Stripe-Account"]
|
483
473
|
context.api_key = api_key
|
484
|
-
context.authenticator = authenticator
|
485
474
|
context.api_version = headers["Stripe-Version"]
|
486
475
|
context.body = body_log
|
487
476
|
context.idempotency_key = headers["Idempotency-Key"]
|
@@ -496,9 +485,7 @@ module Stripe
|
|
496
485
|
response_block =
|
497
486
|
if block_given?
|
498
487
|
lambda do |response|
|
499
|
-
unless should_handle_as_error(response.code.to_i)
|
500
|
-
response.read_body(&read_body_chunk_block)
|
501
|
-
end
|
488
|
+
response.read_body(&read_body_chunk_block) unless should_handle_as_error(response.code.to_i)
|
502
489
|
end
|
503
490
|
end
|
504
491
|
|
@@ -520,35 +507,27 @@ module Stripe
|
|
520
507
|
(api_base || config.api_base) + url
|
521
508
|
end
|
522
509
|
|
523
|
-
private def
|
524
|
-
|
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.
|
510
|
+
private def check_api_key!(api_key)
|
511
|
+
unless api_key
|
533
512
|
raise AuthenticationError, "No API key provided. " \
|
534
|
-
|
535
|
-
|
536
|
-
|
537
|
-
|
513
|
+
'Set your API key using "Stripe.api_key = <API-KEY>". ' \
|
514
|
+
"You can generate API keys from the Stripe web interface. " \
|
515
|
+
"See https://stripe.com/api for details, or email " \
|
516
|
+
"support@stripe.com if you have any questions."
|
538
517
|
end
|
539
518
|
|
540
519
|
return unless api_key =~ /\s/
|
541
520
|
|
542
521
|
raise AuthenticationError, "Your API key is invalid, as it contains " \
|
543
|
-
|
544
|
-
|
545
|
-
|
522
|
+
"whitespace. (HINT: You can double-check your API key from the " \
|
523
|
+
"Stripe web interface. See https://stripe.com/api for details, or " \
|
524
|
+
"email support@stripe.com if you have any questions.)"
|
546
525
|
end
|
547
526
|
|
548
527
|
# Encodes a set of body parameters using multipart if `Content-Type` is set
|
549
528
|
# for that, or standard form-encoding otherwise. Returns the encoded body
|
550
529
|
# and a version of the encoded body that's safe to be logged.
|
551
|
-
private def encode_body(body_params, headers
|
530
|
+
private def encode_body(body_params, headers)
|
552
531
|
body = nil
|
553
532
|
flattened_params = Util.flatten_params(body_params)
|
554
533
|
|
@@ -564,22 +543,15 @@ module Stripe
|
|
564
543
|
flattened_params =
|
565
544
|
flattened_params.map { |k, v| [k, v.is_a?(String) ? v : v.to_s] }.to_h
|
566
545
|
|
567
|
-
elsif api_mode == :preview
|
568
|
-
body = JSON.generate(body_params)
|
569
|
-
headers["Content-Type"] = "application/json"
|
570
546
|
else
|
571
547
|
body = Util.encode_parameters(body_params)
|
572
548
|
end
|
573
549
|
|
574
|
-
|
575
|
-
|
576
|
-
|
577
|
-
|
578
|
-
|
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
|
550
|
+
# We don't use `Util.encode_parameters` partly as an optimization (to not
|
551
|
+
# redo work we've already done), and partly because the encoded forms of
|
552
|
+
# certain characters introduce a lot of visual noise and it's nice to
|
553
|
+
# have a clearer format for logs.
|
554
|
+
body_log = flattened_params.map { |k, v| "#{k}=#{v}" }.join("&")
|
583
555
|
|
584
556
|
[body, body_log]
|
585
557
|
end
|
@@ -605,9 +577,7 @@ module Stripe
|
|
605
577
|
http_status = resp.code.to_i
|
606
578
|
context = context.dup_from_response_headers(resp)
|
607
579
|
|
608
|
-
if should_handle_as_error(http_status)
|
609
|
-
handle_error_response(resp, context)
|
610
|
-
end
|
580
|
+
handle_error_response(resp, context) if should_handle_as_error(http_status)
|
611
581
|
|
612
582
|
log_response(context, request_start, http_status, resp.body, resp)
|
613
583
|
notify_request_end(context, request_duration, http_status,
|
@@ -657,7 +627,7 @@ module Stripe
|
|
657
627
|
|
658
628
|
# Only handle errors when we know we can do so, and re-raise otherwise.
|
659
629
|
# This should be pretty infrequent.
|
660
|
-
else
|
630
|
+
else # rubocop:todo Lint/DuplicateBranch
|
661
631
|
raise
|
662
632
|
end
|
663
633
|
end
|
@@ -768,11 +738,10 @@ module Stripe
|
|
768
738
|
end
|
769
739
|
|
770
740
|
private def specific_api_error(resp, error_data, context)
|
771
|
-
message = error_data[:message]
|
772
741
|
Util.log_error("Stripe API error",
|
773
742
|
status: resp.http_status,
|
774
743
|
error_code: error_data[:code],
|
775
|
-
error_message: message,
|
744
|
+
error_message: error_data[:message],
|
776
745
|
error_param: error_data[:param],
|
777
746
|
error_type: error_data[:type],
|
778
747
|
idempotency_key: context.idempotency_key,
|
@@ -793,26 +762,26 @@ module Stripe
|
|
793
762
|
when 400, 404
|
794
763
|
case error_data[:type]
|
795
764
|
when "idempotency_error"
|
796
|
-
IdempotencyError.new(message, **opts)
|
765
|
+
IdempotencyError.new(error_data[:message], **opts)
|
797
766
|
else
|
798
767
|
InvalidRequestError.new(
|
799
|
-
message, error_data[:param],
|
768
|
+
error_data[:message], error_data[:param],
|
800
769
|
**opts
|
801
770
|
)
|
802
771
|
end
|
803
772
|
when 401
|
804
|
-
AuthenticationError.new(message, **opts)
|
773
|
+
AuthenticationError.new(error_data[:message], **opts)
|
805
774
|
when 402
|
806
775
|
CardError.new(
|
807
|
-
message, error_data[:param],
|
776
|
+
error_data[:message], error_data[:param],
|
808
777
|
**opts
|
809
778
|
)
|
810
779
|
when 403
|
811
|
-
PermissionError.new(message, **opts)
|
780
|
+
PermissionError.new(error_data[:message], **opts)
|
812
781
|
when 429
|
813
|
-
RateLimitError.new(message, **opts)
|
782
|
+
RateLimitError.new(error_data[:message], **opts)
|
814
783
|
else
|
815
|
-
APIError.new(message, **opts)
|
784
|
+
APIError.new(error_data[:message], **opts)
|
816
785
|
end
|
817
786
|
end
|
818
787
|
|
@@ -868,7 +837,7 @@ module Stripe
|
|
868
837
|
|
869
838
|
if errors.nil?
|
870
839
|
message = "Unexpected error #{error.class.name} communicating " \
|
871
|
-
|
840
|
+
"with Stripe. Please let us know at support@stripe.com."
|
872
841
|
end
|
873
842
|
|
874
843
|
api_base ||= config.api_base
|
@@ -880,22 +849,16 @@ module Stripe
|
|
880
849
|
message + "\n\n(Network error: #{error.message})"
|
881
850
|
end
|
882
851
|
|
883
|
-
private def request_headers(api_key, method
|
852
|
+
private def request_headers(api_key, method)
|
884
853
|
user_agent = "Stripe/v1 RubyBindings/#{Stripe::VERSION}"
|
885
|
-
unless Stripe.app_info.nil?
|
886
|
-
user_agent += " " + format_app_info(Stripe.app_info)
|
887
|
-
end
|
854
|
+
user_agent += " " + format_app_info(Stripe.app_info) unless Stripe.app_info.nil?
|
888
855
|
|
889
856
|
headers = {
|
890
857
|
"User-Agent" => user_agent,
|
891
858
|
"Authorization" => "Bearer #{api_key}",
|
859
|
+
"Content-Type" => "application/x-www-form-urlencoded",
|
892
860
|
}
|
893
861
|
|
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
|
-
|
899
862
|
if config.enable_telemetry? && !@last_request_metrics.nil?
|
900
863
|
headers["X-Stripe-Client-Telemetry"] = JSON.generate(
|
901
864
|
last_request_metrics: @last_request_metrics.payload
|
@@ -908,12 +871,7 @@ module Stripe
|
|
908
871
|
headers["Idempotency-Key"] ||= SecureRandom.uuid
|
909
872
|
end
|
910
873
|
|
911
|
-
|
912
|
-
headers["Stripe-Version"] = ApiVersion::PREVIEW
|
913
|
-
elsif config.api_version
|
914
|
-
headers["Stripe-Version"] = config.api_version
|
915
|
-
end
|
916
|
-
|
874
|
+
headers["Stripe-Version"] = config.api_version if config.api_version
|
917
875
|
headers["Stripe-Account"] = config.stripe_account if config.stripe_account
|
918
876
|
|
919
877
|
user_agent = @system_profiler.user_agent
|
@@ -996,16 +954,7 @@ module Stripe
|
|
996
954
|
# that we can log certain information. It's useful because it means that we
|
997
955
|
# don't have to pass around as many parameters.
|
998
956
|
class RequestLogContext
|
999
|
-
attr_accessor :body
|
1000
|
-
attr_accessor :account
|
1001
|
-
attr_accessor :api_key
|
1002
|
-
attr_accessor :authenticator
|
1003
|
-
attr_accessor :api_version
|
1004
|
-
attr_accessor :idempotency_key
|
1005
|
-
attr_accessor :method
|
1006
|
-
attr_accessor :path
|
1007
|
-
attr_accessor :query
|
1008
|
-
attr_accessor :request_id
|
957
|
+
attr_accessor :body, :account, :api_key, :api_version, :idempotency_key, :method, :path, :query, :request_id
|
1009
958
|
|
1010
959
|
# The idea with this method is that we might want to update some of
|
1011
960
|
# context information because a response that we've received from the API
|
@@ -25,27 +25,12 @@ module Stripe
|
|
25
25
|
# If `.logger` is set, the value of `.log_level` is ignored. The decision on
|
26
26
|
# what levels to print is entirely deferred to the logger.
|
27
27
|
class StripeConfiguration
|
28
|
-
attr_accessor :api_key
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
attr_accessor :stripe_account
|
35
|
-
|
36
|
-
attr_reader :api_base
|
37
|
-
attr_reader :uploads_base
|
38
|
-
attr_reader :connect_base
|
39
|
-
attr_reader :ca_bundle_path
|
40
|
-
attr_reader :log_level
|
41
|
-
attr_reader :initial_network_retry_delay
|
42
|
-
attr_reader :max_network_retries
|
43
|
-
attr_reader :max_network_retry_delay
|
44
|
-
attr_reader :open_timeout
|
45
|
-
attr_reader :read_timeout
|
46
|
-
attr_reader :write_timeout
|
47
|
-
attr_reader :proxy
|
48
|
-
attr_reader :verify_ssl_certs
|
28
|
+
attr_accessor :api_key, :api_version, :client_id, :enable_telemetry, :logger, :stripe_account
|
29
|
+
|
30
|
+
attr_reader :api_base, :uploads_base, :connect_base, :ca_bundle_path, :log_level, :initial_network_retry_delay,
|
31
|
+
# rubocop:todo Layout/LineLength
|
32
|
+
:max_network_retries, :max_network_retry_delay, :open_timeout, :read_timeout, :write_timeout, :proxy, :verify_ssl_certs
|
33
|
+
# rubocop:enable Layout/LineLength
|
49
34
|
|
50
35
|
def self.setup
|
51
36
|
new.tap do |instance|
|
@@ -65,7 +50,6 @@ module Stripe
|
|
65
50
|
|
66
51
|
def initialize
|
67
52
|
@api_version = ApiVersion::CURRENT
|
68
|
-
|
69
53
|
@ca_bundle_path = Stripe::DEFAULT_CA_BUNDLE_PATH
|
70
54
|
@enable_telemetry = true
|
71
55
|
@verify_ssl_certs = true
|
@@ -97,8 +81,8 @@ module Stripe
|
|
97
81
|
|
98
82
|
if !val.nil? && !levels.include?(val)
|
99
83
|
raise ArgumentError,
|
100
|
-
"log_level should only be set to `nil`, `debug`, `info`," \
|
101
|
-
"
|
84
|
+
"log_level should only be set to `nil`, `debug`, `info`, " \
|
85
|
+
"or `error`"
|
102
86
|
end
|
103
87
|
@log_level = val
|
104
88
|
end
|
@@ -126,9 +110,7 @@ module Stripe
|
|
126
110
|
end
|
127
111
|
|
128
112
|
def write_timeout=(write_timeout)
|
129
|
-
unless Net::HTTP.instance_methods.include?(:write_timeout=)
|
130
|
-
raise NotImplementedError
|
131
|
-
end
|
113
|
+
raise NotImplementedError unless Net::HTTP.instance_methods.include?(:write_timeout=)
|
132
114
|
|
133
115
|
@write_timeout = write_timeout
|
134
116
|
StripeClient.clear_all_connection_managers(config: self)
|
@@ -179,10 +161,10 @@ module Stripe
|
|
179
161
|
# and is itself not thread safe.
|
180
162
|
def ca_store
|
181
163
|
@ca_store ||= begin
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
164
|
+
store = OpenSSL::X509::Store.new
|
165
|
+
store.add_file(ca_bundle_path)
|
166
|
+
store
|
167
|
+
end
|
186
168
|
end
|
187
169
|
|
188
170
|
def enable_telemetry?
|
data/lib/stripe/stripe_object.rb
CHANGED
@@ -320,8 +320,8 @@ module Stripe
|
|
320
320
|
# Here we swallow that error and issue a warning so at least
|
321
321
|
# the program doesn't crash.
|
322
322
|
warn("WARNING: Unable to remove method `#{method_name}`; " \
|
323
|
-
|
324
|
-
|
323
|
+
"if custom, please consider renaming to a name that doesn't " \
|
324
|
+
"collide with an API property name.")
|
325
325
|
end
|
326
326
|
end
|
327
327
|
end
|
@@ -351,17 +351,15 @@ module Stripe
|
|
351
351
|
define_method(:"#{k}=") do |v|
|
352
352
|
if v == ""
|
353
353
|
raise ArgumentError, "You cannot set #{k} to an empty string. " \
|
354
|
-
|
355
|
-
|
354
|
+
"We interpret empty strings as nil in requests. " \
|
355
|
+
"You may set (object).#{k} = nil to delete the property."
|
356
356
|
end
|
357
357
|
@values[k] = Util.convert_to_stripe_object(v, @opts)
|
358
358
|
dirty_value!(@values[k])
|
359
359
|
@unsaved_values.add(k)
|
360
360
|
end
|
361
361
|
|
362
|
-
if [FalseClass, TrueClass].include?(values[k].class)
|
363
|
-
define_method(:"#{k}?") { @values[k] }
|
364
|
-
end
|
362
|
+
define_method(:"#{k}?") { @values[k] } if [FalseClass, TrueClass].include?(values[k].class)
|
365
363
|
end
|
366
364
|
end
|
367
365
|
end
|
@@ -369,7 +367,6 @@ module Stripe
|
|
369
367
|
# Disabling the cop because it's confused by the fact that the methods are
|
370
368
|
# protected, but we do define `#respond_to_missing?` just below. Hopefully
|
371
369
|
# this is fixed in more recent Rubocop versions.
|
372
|
-
# rubocop:disable Style/MissingRespondToMissing
|
373
370
|
protected def method_missing(name, *args)
|
374
371
|
# TODO: only allow setting in updateable classes.
|
375
372
|
if name.to_s.end_with?("=")
|
@@ -405,16 +402,14 @@ module Stripe
|
|
405
402
|
|
406
403
|
raise NoMethodError,
|
407
404
|
e.message + ". HINT: The '#{name}' attribute was set in the " \
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
|
405
|
+
"past, however. It was then wiped when refreshing the object " \
|
406
|
+
"with the result returned by Stripe's API, probably as a " \
|
407
|
+
"result of a save(). The attributes currently available on " \
|
408
|
+
"this object are: #{@values.keys.join(', ')}"
|
412
409
|
end
|
413
410
|
end
|
414
|
-
# rubocop:enable Style/MissingRespondToMissing
|
415
|
-
|
416
411
|
protected def respond_to_missing?(symbol, include_private = false)
|
417
|
-
@values && @values.key?(symbol) || super
|
412
|
+
(@values && @values.key?(symbol)) || super
|
418
413
|
end
|
419
414
|
|
420
415
|
# Re-initializes the object based on a hash of values (usually one that's
|
@@ -460,7 +455,8 @@ module Stripe
|
|
460
455
|
self
|
461
456
|
end
|
462
457
|
|
463
|
-
|
458
|
+
# rubocop:todo Metrics/PerceivedComplexity
|
459
|
+
protected def serialize_params_value(value, original, unsaved, force, # rubocop:todo Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
464
460
|
key: nil)
|
465
461
|
if value.nil?
|
466
462
|
""
|
@@ -494,8 +490,8 @@ module Stripe
|
|
494
490
|
value
|
495
491
|
else
|
496
492
|
raise ArgumentError, "Cannot save property `#{key}` containing " \
|
497
|
-
|
498
|
-
|
493
|
+
"an API resource. It doesn't appear to be persisted and is " \
|
494
|
+
"not marked as `save_with_parent`."
|
499
495
|
end
|
500
496
|
|
501
497
|
elsif value.is_a?(Array)
|
@@ -535,6 +531,7 @@ module Stripe
|
|
535
531
|
value
|
536
532
|
end
|
537
533
|
end
|
534
|
+
# rubocop:enable Metrics/PerceivedComplexity
|
538
535
|
|
539
536
|
# Produces a deep copy of the given object including support for arrays,
|
540
537
|
# hashes, and StripeObjects.
|