stripe 10.0.0 → 10.1.0.pre.beta.2
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 +236 -40
- data/OPENAPI_VERSION +1 -1
- data/README.md +11 -0
- data/VERSION +1 -1
- data/lib/stripe/api_operations/request.rb +2 -0
- data/lib/stripe/api_version.rb +1 -0
- data/lib/stripe/object_types.rb +21 -0
- data/lib/stripe/request_signing_authenticator.rb +83 -0
- data/lib/stripe/resources/account_notice.rb +14 -0
- data/lib/stripe/resources/capital/financing_offer.rb +32 -0
- data/lib/stripe/resources/capital/financing_summary.rb +12 -0
- data/lib/stripe/resources/capital/financing_transaction.rb +13 -0
- data/lib/stripe/resources/confirmation_token.rb +11 -0
- data/lib/stripe/resources/customer_session.rb +12 -0
- data/lib/stripe/resources/financial_connections/account.rb +39 -0
- data/lib/stripe/resources/financial_connections/account_inferred_balance.rb +13 -0
- data/lib/stripe/resources/financial_connections/transaction.rb +13 -0
- data/lib/stripe/resources/gift_cards/card.rb +25 -0
- data/lib/stripe/resources/gift_cards/transaction.rb +56 -0
- data/lib/stripe/resources/issuing/credit_underwriting_record.rb +69 -0
- data/lib/stripe/resources/issuing/personalization_design.rb +77 -0
- data/lib/stripe/resources/issuing/physical_bundle.rb +13 -0
- data/lib/stripe/resources/margin.rb +14 -0
- data/lib/stripe/resources/order.rb +89 -0
- data/lib/stripe/resources/quote.rb +94 -0
- data/lib/stripe/resources/quote_phase.rb +29 -0
- data/lib/stripe/resources/quote_preview_invoice.rb +42 -0
- data/lib/stripe/resources/quote_preview_subscription_schedule.rb +10 -0
- data/lib/stripe/resources/subscription_schedule.rb +18 -0
- data/lib/stripe/resources/tax/form.rb +39 -0
- data/lib/stripe/resources/tax/registration.rb +19 -0
- data/lib/stripe/resources/terminal/reader.rb +54 -0
- data/lib/stripe/resources.rb +20 -0
- data/lib/stripe/stripe_client.rb +60 -26
- data/lib/stripe/stripe_configuration.rb +2 -0
- data/lib/stripe/util.rb +8 -1
- data/lib/stripe/version.rb +1 -1
- data/lib/stripe.rb +46 -0
- metadata +25 -4
@@ -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
|
@@ -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,
|
data/lib/stripe/resources.rb
CHANGED
@@ -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,10 +39,14 @@ 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"
|
@@ -45,12 +55,17 @@ require "stripe/resources/invoice_line_item"
|
|
45
55
|
require "stripe/resources/issuing/authorization"
|
46
56
|
require "stripe/resources/issuing/card"
|
47
57
|
require "stripe/resources/issuing/cardholder"
|
58
|
+
require "stripe/resources/issuing/credit_underwriting_record"
|
48
59
|
require "stripe/resources/issuing/dispute"
|
60
|
+
require "stripe/resources/issuing/personalization_design"
|
61
|
+
require "stripe/resources/issuing/physical_bundle"
|
49
62
|
require "stripe/resources/issuing/token"
|
50
63
|
require "stripe/resources/issuing/transaction"
|
51
64
|
require "stripe/resources/line_item"
|
52
65
|
require "stripe/resources/login_link"
|
53
66
|
require "stripe/resources/mandate"
|
67
|
+
require "stripe/resources/margin"
|
68
|
+
require "stripe/resources/order"
|
54
69
|
require "stripe/resources/payment_intent"
|
55
70
|
require "stripe/resources/payment_link"
|
56
71
|
require "stripe/resources/payment_method"
|
@@ -63,6 +78,9 @@ require "stripe/resources/price"
|
|
63
78
|
require "stripe/resources/product"
|
64
79
|
require "stripe/resources/promotion_code"
|
65
80
|
require "stripe/resources/quote"
|
81
|
+
require "stripe/resources/quote_phase"
|
82
|
+
require "stripe/resources/quote_preview_invoice"
|
83
|
+
require "stripe/resources/quote_preview_subscription_schedule"
|
66
84
|
require "stripe/resources/radar/early_fraud_warning"
|
67
85
|
require "stripe/resources/radar/value_list"
|
68
86
|
require "stripe/resources/radar/value_list_item"
|
@@ -82,6 +100,8 @@ require "stripe/resources/subscription_item"
|
|
82
100
|
require "stripe/resources/subscription_schedule"
|
83
101
|
require "stripe/resources/tax/calculation"
|
84
102
|
require "stripe/resources/tax/calculation_line_item"
|
103
|
+
require "stripe/resources/tax/form"
|
104
|
+
require "stripe/resources/tax/registration"
|
85
105
|
require "stripe/resources/tax/settings"
|
86
106
|
require "stripe/resources/tax/transaction"
|
87
107
|
require "stripe/resources/tax/transaction_line_item"
|
data/lib/stripe/stripe_client.rb
CHANGED
@@ -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,
|
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,
|
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
|
-
|
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
|
516
|
-
|
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
|
-
|
556
|
-
|
557
|
-
|
558
|
-
|
559
|
-
|
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:
|
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(
|
796
|
+
IdempotencyError.new(message, **opts)
|
773
797
|
else
|
774
798
|
InvalidRequestError.new(
|
775
|
-
|
799
|
+
message, error_data[:param],
|
776
800
|
**opts
|
777
801
|
)
|
778
802
|
end
|
779
803
|
when 401
|
780
|
-
AuthenticationError.new(
|
804
|
+
AuthenticationError.new(message, **opts)
|
781
805
|
when 402
|
782
806
|
CardError.new(
|
783
|
-
|
807
|
+
message, error_data[:param],
|
784
808
|
**opts
|
785
809
|
)
|
786
810
|
when 403
|
787
|
-
PermissionError.new(
|
811
|
+
PermissionError.new(message, **opts)
|
788
812
|
when 429
|
789
|
-
RateLimitError.new(
|
813
|
+
RateLimitError.new(message, **opts)
|
790
814
|
else
|
791
|
-
APIError.new(
|
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
|
-
|
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
|
data/lib/stripe/util.rb
CHANGED
@@ -7,6 +7,7 @@ module Stripe
|
|
7
7
|
# Options that a user is allowed to specify.
|
8
8
|
OPTS_USER_SPECIFIED = Set[
|
9
9
|
:api_key,
|
10
|
+
:authenticator,
|
10
11
|
:idempotency_key,
|
11
12
|
:stripe_account,
|
12
13
|
:stripe_version
|
@@ -281,7 +282,13 @@ module Stripe
|
|
281
282
|
when String
|
282
283
|
{ api_key: opts }
|
283
284
|
when Hash
|
284
|
-
|
285
|
+
# If the user is using request signing for authentication,
|
286
|
+
# no need to check the api_key per request.
|
287
|
+
if !(opts.key?(:client) &&
|
288
|
+
opts.fetch(:client).config.authenticator) &&
|
289
|
+
opts.key?(:api_key)
|
290
|
+
check_api_key!(opts.fetch(:api_key))
|
291
|
+
end
|
285
292
|
# Explicitly use dup here instead of clone to avoid preserving freeze
|
286
293
|
# state on input params.
|
287
294
|
opts.dup
|
data/lib/stripe/version.rb
CHANGED
data/lib/stripe.rb
CHANGED
@@ -13,6 +13,7 @@ require "set"
|
|
13
13
|
require "socket"
|
14
14
|
require "uri"
|
15
15
|
require "forwardable"
|
16
|
+
require "base64"
|
16
17
|
|
17
18
|
# Version
|
18
19
|
require "stripe/api_version"
|
@@ -44,6 +45,7 @@ require "stripe/api_resource_test_helpers"
|
|
44
45
|
require "stripe/singleton_api_resource"
|
45
46
|
require "stripe/webhook"
|
46
47
|
require "stripe/stripe_configuration"
|
48
|
+
require "stripe/request_signing_authenticator"
|
47
49
|
|
48
50
|
# Named API resources
|
49
51
|
require "stripe/resources"
|
@@ -70,6 +72,7 @@ module Stripe
|
|
70
72
|
|
71
73
|
# User configurable options
|
72
74
|
def_delegators :@config, :api_key, :api_key=
|
75
|
+
def_delegators :@config, :authenticator, :authenticator=
|
73
76
|
def_delegators :@config, :api_version, :api_version=
|
74
77
|
def_delegators :@config, :stripe_account, :stripe_account=
|
75
78
|
def_delegators :@config, :api_base, :api_base=
|
@@ -116,6 +119,49 @@ module Stripe
|
|
116
119
|
version: version,
|
117
120
|
}
|
118
121
|
end
|
122
|
+
|
123
|
+
class Preview
|
124
|
+
def self._get_default_opts(opts)
|
125
|
+
{ api_mode: :preview }.merge(opts)
|
126
|
+
end
|
127
|
+
|
128
|
+
def self.get(url, opts = {})
|
129
|
+
Stripe.raw_request(:get, url, {}, _get_default_opts(opts))
|
130
|
+
end
|
131
|
+
|
132
|
+
def self.post(url, params = {}, opts = {})
|
133
|
+
Stripe.raw_request(:post, url, params, _get_default_opts(opts))
|
134
|
+
end
|
135
|
+
|
136
|
+
def self.delete(url, opts = {})
|
137
|
+
Stripe.raw_request(:delete, url, {}, _get_default_opts(opts))
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
class RawRequest
|
142
|
+
include Stripe::APIOperations::Request
|
143
|
+
|
144
|
+
def initialize
|
145
|
+
@opts = {}
|
146
|
+
end
|
147
|
+
|
148
|
+
def execute(method, url, params = {}, opts = {})
|
149
|
+
resp, = execute_resource_request(method, url, params, opts)
|
150
|
+
|
151
|
+
resp
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
# Sends a request to Stripe REST API
|
156
|
+
def self.raw_request(method, url, params = {}, opts = {})
|
157
|
+
req = RawRequest.new
|
158
|
+
req.execute(method, url, params, opts)
|
159
|
+
end
|
160
|
+
|
161
|
+
def self.deserialize(data)
|
162
|
+
data = JSON.parse(data) if data.is_a?(String)
|
163
|
+
Util.convert_to_stripe_object(data, {})
|
164
|
+
end
|
119
165
|
end
|
120
166
|
|
121
167
|
Stripe.log_level = ENV["STRIPE_LOG"] unless ENV["STRIPE_LOG"].nil?
|