stripe 10.14.0 → 10.15.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 +312 -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 -1
  7. data/lib/stripe/api_version.rb +1 -0
  8. data/lib/stripe/object_types.rb +19 -0
  9. data/lib/stripe/request_signing_authenticator.rb +79 -0
  10. data/lib/stripe/resources/account_notice.rb +32 -0
  11. data/lib/stripe/resources/capital/financing_offer.rb +49 -0
  12. data/lib/stripe/resources/capital/financing_summary.rb +15 -0
  13. data/lib/stripe/resources/capital/financing_transaction.rb +27 -0
  14. data/lib/stripe/resources/entitlements/active_entitlement.rb +26 -0
  15. data/lib/stripe/resources/entitlements/feature.rb +49 -0
  16. data/lib/stripe/resources/financial_connections/account.rb +3 -0
  17. data/lib/stripe/resources/financial_connections/account_inferred_balance.rb +14 -0
  18. data/lib/stripe/resources/gift_cards/card.rb +59 -0
  19. data/lib/stripe/resources/gift_cards/transaction.rb +93 -0
  20. data/lib/stripe/resources/invoice.rb +114 -1
  21. data/lib/stripe/resources/invoice_payment.rb +12 -0
  22. data/lib/stripe/resources/issuing/credit_underwriting_record.rb +88 -0
  23. data/lib/stripe/resources/margin.rb +37 -0
  24. data/lib/stripe/resources/order.rb +120 -0
  25. data/lib/stripe/resources/payment_intent.rb +50 -0
  26. data/lib/stripe/resources/product.rb +3 -0
  27. data/lib/stripe/resources/product_feature.rb +13 -0
  28. data/lib/stripe/resources/quote.rb +104 -0
  29. data/lib/stripe/resources/quote_phase.rb +39 -0
  30. data/lib/stripe/resources/quote_preview_invoice.rb +43 -0
  31. data/lib/stripe/resources/quote_preview_subscription_schedule.rb +11 -0
  32. data/lib/stripe/resources/subscription_schedule.rb +20 -0
  33. data/lib/stripe/resources/tax/form.rb +49 -0
  34. data/lib/stripe/resources/terminal/reader.rb +60 -0
  35. data/lib/stripe/resources.rb +18 -0
  36. data/lib/stripe/stripe_client.rb +62 -28
  37. data/lib/stripe/stripe_configuration.rb +2 -1
  38. data/lib/stripe/util.rb +8 -1
  39. data/lib/stripe/version.rb +1 -1
  40. data/lib/stripe.rb +54 -0
  41. metadata +23 -4
@@ -0,0 +1,43 @@
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
+ OBJECT_NAME = "quote_preview_invoice"
39
+ def self.object_name
40
+ "quote_preview_invoice"
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,11 @@
1
+ # File generated from our OpenAPI spec
2
+ # frozen_string_literal: true
3
+
4
+ module Stripe
5
+ class QuotePreviewSubscriptionSchedule < APIResource
6
+ OBJECT_NAME = "quote_preview_subscription_schedule"
7
+ def self.object_name
8
+ "quote_preview_subscription_schedule"
9
+ end
10
+ end
11
+ end
@@ -15,6 +15,26 @@ module Stripe
15
15
  "subscription_schedule"
16
16
  end
17
17
 
18
+ # Amends an existing subscription schedule.
19
+ def amend(params = {}, opts = {})
20
+ request_stripe_object(
21
+ method: :post,
22
+ path: format("/v1/subscription_schedules/%<schedule>s/amend", { schedule: CGI.escape(self["id"]) }),
23
+ params: params,
24
+ opts: opts
25
+ )
26
+ end
27
+
28
+ # Amends an existing subscription schedule.
29
+ def self.amend(schedule, params = {}, opts = {})
30
+ request_stripe_object(
31
+ method: :post,
32
+ path: format("/v1/subscription_schedules/%<schedule>s/amend", { schedule: CGI.escape(schedule) }),
33
+ params: params,
34
+ opts: opts
35
+ )
36
+ end
37
+
18
38
  # Cancels a subscription schedule and its associated subscription immediately (if the subscription schedule has an active subscription). A subscription schedule can only be canceled if its status is not_started or active.
19
39
  def cancel(params = {}, opts = {})
20
40
  request_stripe_object(
@@ -0,0 +1,49 @@
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
+ def self.object_name
14
+ "tax.form"
15
+ end
16
+
17
+ # Returns a list of tax forms which were previously created. The tax forms are returned in sorted order, with the oldest tax forms appearing first.
18
+ def self.list(filters = {}, opts = {})
19
+ request_stripe_object(method: :get, path: "/v1/tax/forms", params: filters, opts: opts)
20
+ end
21
+
22
+ # Download the PDF for a tax form.
23
+ def pdf(params = {}, opts = {}, &read_body_chunk_block)
24
+ config = opts[:client]&.config || Stripe.config
25
+ opts = { api_base: config.uploads_base }.merge(opts)
26
+ request_stream(
27
+ method: :get,
28
+ path: format("/v1/tax/forms/%<id>s/pdf", { id: CGI.escape(self["id"]) }),
29
+ params: params,
30
+ opts: opts,
31
+ &read_body_chunk_block
32
+ )
33
+ end
34
+
35
+ # Download the PDF for a tax form.
36
+ def self.pdf(id, params = {}, opts = {}, &read_body_chunk_block)
37
+ config = opts[:client]&.config || Stripe.config
38
+ opts = { api_base: config.uploads_base }.merge(opts)
39
+ execute_resource_request_stream(
40
+ :get,
41
+ format("/v1/tax/forms/%<id>s/pdf", { id: CGI.escape(id) }),
42
+ params,
43
+ opts,
44
+ &read_body_chunk_block
45
+ )
46
+ end
47
+ end
48
+ end
49
+ end
@@ -37,6 +37,66 @@ module Stripe
37
37
  )
38
38
  end
39
39
 
40
+ # Initiates an input collection flow on a Reader.
41
+ def collect_inputs(params = {}, opts = {})
42
+ request_stripe_object(
43
+ method: :post,
44
+ path: format("/v1/terminal/readers/%<reader>s/collect_inputs", { reader: CGI.escape(self["id"]) }),
45
+ params: params,
46
+ opts: opts
47
+ )
48
+ end
49
+
50
+ # Initiates an input collection flow on a Reader.
51
+ def self.collect_inputs(reader, params = {}, opts = {})
52
+ request_stripe_object(
53
+ method: :post,
54
+ path: format("/v1/terminal/readers/%<reader>s/collect_inputs", { reader: CGI.escape(reader) }),
55
+ params: params,
56
+ opts: opts
57
+ )
58
+ end
59
+
60
+ # Initiates a payment flow on a Reader and updates the PaymentIntent with card details before manual confirmation.
61
+ def collect_payment_method(params = {}, opts = {})
62
+ request_stripe_object(
63
+ method: :post,
64
+ path: format("/v1/terminal/readers/%<reader>s/collect_payment_method", { reader: CGI.escape(self["id"]) }),
65
+ params: params,
66
+ opts: opts
67
+ )
68
+ end
69
+
70
+ # Initiates a payment flow on a Reader and updates the PaymentIntent with card details before manual confirmation.
71
+ def self.collect_payment_method(reader, params = {}, opts = {})
72
+ request_stripe_object(
73
+ method: :post,
74
+ path: format("/v1/terminal/readers/%<reader>s/collect_payment_method", { reader: CGI.escape(reader) }),
75
+ params: params,
76
+ opts: opts
77
+ )
78
+ end
79
+
80
+ # Finalizes a payment on a Reader.
81
+ def confirm_payment_intent(params = {}, opts = {})
82
+ request_stripe_object(
83
+ method: :post,
84
+ path: format("/v1/terminal/readers/%<reader>s/confirm_payment_intent", { reader: CGI.escape(self["id"]) }),
85
+ params: params,
86
+ opts: opts
87
+ )
88
+ end
89
+
90
+ # Finalizes a payment on a Reader.
91
+ def self.confirm_payment_intent(reader, params = {}, opts = {})
92
+ request_stripe_object(
93
+ method: :post,
94
+ path: format("/v1/terminal/readers/%<reader>s/confirm_payment_intent", { reader: CGI.escape(reader) }),
95
+ params: params,
96
+ opts: opts
97
+ )
98
+ end
99
+
40
100
  # Creates a new Reader object.
41
101
  def self.create(params = {}, opts = {})
42
102
  request_stripe_object(
@@ -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"
@@ -18,6 +19,9 @@ require "stripe/resources/billing/meter_event_summary"
18
19
  require "stripe/resources/billing_portal/configuration"
19
20
  require "stripe/resources/billing_portal/session"
20
21
  require "stripe/resources/capability"
22
+ require "stripe/resources/capital/financing_offer"
23
+ require "stripe/resources/capital/financing_summary"
24
+ require "stripe/resources/capital/financing_transaction"
21
25
  require "stripe/resources/card"
22
26
  require "stripe/resources/cash_balance"
23
27
  require "stripe/resources/charge"
@@ -36,26 +40,33 @@ require "stripe/resources/customer_cash_balance_transaction"
36
40
  require "stripe/resources/customer_session"
37
41
  require "stripe/resources/discount"
38
42
  require "stripe/resources/dispute"
43
+ require "stripe/resources/entitlements/active_entitlement"
44
+ require "stripe/resources/entitlements/feature"
39
45
  require "stripe/resources/ephemeral_key"
40
46
  require "stripe/resources/event"
41
47
  require "stripe/resources/exchange_rate"
42
48
  require "stripe/resources/file"
43
49
  require "stripe/resources/file_link"
44
50
  require "stripe/resources/financial_connections/account"
51
+ require "stripe/resources/financial_connections/account_inferred_balance"
45
52
  require "stripe/resources/financial_connections/account_owner"
46
53
  require "stripe/resources/financial_connections/account_ownership"
47
54
  require "stripe/resources/financial_connections/session"
48
55
  require "stripe/resources/financial_connections/transaction"
49
56
  require "stripe/resources/forwarding/request"
50
57
  require "stripe/resources/funding_instructions"
58
+ require "stripe/resources/gift_cards/card"
59
+ require "stripe/resources/gift_cards/transaction"
51
60
  require "stripe/resources/identity/verification_report"
52
61
  require "stripe/resources/identity/verification_session"
53
62
  require "stripe/resources/invoice"
54
63
  require "stripe/resources/invoice_item"
55
64
  require "stripe/resources/invoice_line_item"
65
+ require "stripe/resources/invoice_payment"
56
66
  require "stripe/resources/issuing/authorization"
57
67
  require "stripe/resources/issuing/card"
58
68
  require "stripe/resources/issuing/cardholder"
69
+ require "stripe/resources/issuing/credit_underwriting_record"
59
70
  require "stripe/resources/issuing/dispute"
60
71
  require "stripe/resources/issuing/personalization_design"
61
72
  require "stripe/resources/issuing/physical_bundle"
@@ -64,6 +75,8 @@ require "stripe/resources/issuing/transaction"
64
75
  require "stripe/resources/line_item"
65
76
  require "stripe/resources/login_link"
66
77
  require "stripe/resources/mandate"
78
+ require "stripe/resources/margin"
79
+ require "stripe/resources/order"
67
80
  require "stripe/resources/payment_intent"
68
81
  require "stripe/resources/payment_link"
69
82
  require "stripe/resources/payment_method"
@@ -74,8 +87,12 @@ require "stripe/resources/person"
74
87
  require "stripe/resources/plan"
75
88
  require "stripe/resources/price"
76
89
  require "stripe/resources/product"
90
+ require "stripe/resources/product_feature"
77
91
  require "stripe/resources/promotion_code"
78
92
  require "stripe/resources/quote"
93
+ require "stripe/resources/quote_phase"
94
+ require "stripe/resources/quote_preview_invoice"
95
+ require "stripe/resources/quote_preview_subscription_schedule"
79
96
  require "stripe/resources/radar/early_fraud_warning"
80
97
  require "stripe/resources/radar/value_list"
81
98
  require "stripe/resources/radar/value_list_item"
@@ -95,6 +112,7 @@ require "stripe/resources/subscription_item"
95
112
  require "stripe/resources/subscription_schedule"
96
113
  require "stripe/resources/tax/calculation"
97
114
  require "stripe/resources/tax/calculation_line_item"
115
+ require "stripe/resources/tax/form"
98
116
  require "stripe/resources/tax/registration"
99
117
  require "stripe/resources/tax/settings"
100
118
  require "stripe/resources/tax/transaction"
@@ -209,9 +209,10 @@ module Stripe
209
209
  end
210
210
 
211
211
  def execute_request(method, path,
212
- api_base: nil, api_key: nil, headers: {}, params: {}, usage: [])
212
+ api_base: nil, api_key: nil,
213
+ headers: {}, params: {}, api_mode: nil, usage: [])
213
214
  http_resp, api_key = execute_request_internal(
214
- method, path, api_base, api_key, headers, params, usage
215
+ method, path, api_base, api_key, headers, params, api_mode, usage
215
216
  )
216
217
 
217
218
  begin
@@ -242,6 +243,7 @@ module Stripe
242
243
  def execute_request_stream(method, path,
243
244
  api_base: nil, api_key: nil, usage: [],
244
245
  headers: {}, params: {},
246
+ api_mode: nil,
245
247
  &read_body_chunk_block)
246
248
  unless block_given?
247
249
  raise ArgumentError,
@@ -249,7 +251,8 @@ module Stripe
249
251
  end
250
252
 
251
253
  http_resp, api_key = execute_request_internal(
252
- method, path, api_base, api_key, headers, params, usage, &read_body_chunk_block
254
+ method, path, api_base, api_key,
255
+ headers, params, api_mode, usage, &read_body_chunk_block
253
256
  )
254
257
 
255
258
  # When the read_body_chunk_block is given, we no longer have access to the
@@ -428,8 +431,8 @@ module Stripe
428
431
  end
429
432
 
430
433
  private def execute_request_internal(method, path,
431
- api_base, api_key, headers, params, usage,
432
- &read_body_chunk_block)
434
+ api_base, api_key, headers, params,
435
+ api_mode, usage, &read_body_chunk_block)
433
436
  raise ArgumentError, "method should be a symbol" \
434
437
  unless method.is_a?(Symbol)
435
438
  raise ArgumentError, "path should be a string" \
@@ -437,9 +440,10 @@ module Stripe
437
440
 
438
441
  api_base ||= config.api_base
439
442
  api_key ||= config.api_key
443
+ authenticator ||= config.authenticator
440
444
  params = Util.objects_to_ids(params)
441
445
 
442
- check_api_key!(api_key)
446
+ check_keys!(api_key, authenticator)
443
447
 
444
448
  body_params = nil
445
449
  query_params = nil
@@ -452,8 +456,9 @@ module Stripe
452
456
 
453
457
  query_params, path = merge_query_params(query_params, path)
454
458
 
455
- headers = request_headers(api_key, method)
459
+ headers = request_headers(api_key, method, api_mode)
456
460
  .update(Util.normalize_headers(headers))
461
+
457
462
  url = api_url(path, api_base)
458
463
 
459
464
  # Merge given query parameters with any already encoded in the path.
@@ -464,13 +469,16 @@ module Stripe
464
469
  # a log-friendly variant of the encoded form. File objects are displayed
465
470
  # as such instead of as their file contents.
466
471
  body, body_log =
467
- body_params ? encode_body(body_params, headers) : [nil, nil]
472
+ body_params ? encode_body(body_params, headers, api_mode) : [nil, nil]
473
+
474
+ authenticator.authenticate(method, headers, body) unless api_key
468
475
 
469
476
  # stores information on the request we're about to make so that we don't
470
477
  # have to pass as many parameters around for logging.
471
478
  context = RequestLogContext.new
472
479
  context.account = headers["Stripe-Account"]
473
480
  context.api_key = api_key
481
+ context.authenticator = authenticator
474
482
  context.api_version = headers["Stripe-Version"]
475
483
  context.body = body_log
476
484
  context.idempotency_key = headers["Idempotency-Key"]
@@ -507,8 +515,16 @@ module Stripe
507
515
  (api_base || config.api_base) + url
508
516
  end
509
517
 
510
- private def check_api_key!(api_key)
511
- unless api_key
518
+ private def check_keys!(api_key, authenticator)
519
+ if api_key && authenticator
520
+ raise AuthenticationError, "Can't specify both API key " \
521
+ "and authenticator. Either set your API key" \
522
+ 'using "Stripe.api_key = <API-KEY>", or set your authenticator ' \
523
+ 'using "Stripe.authenticator = <AUTHENTICATOR>"' \
524
+ end
525
+
526
+ unless api_key || authenticator
527
+ # Default to missing API key error message for general users.
512
528
  raise AuthenticationError, "No API key provided. " \
513
529
  'Set your API key using "Stripe.api_key = <API-KEY>". ' \
514
530
  "You can generate API keys from the Stripe web interface. " \
@@ -527,7 +543,7 @@ module Stripe
527
543
  # Encodes a set of body parameters using multipart if `Content-Type` is set
528
544
  # for that, or standard form-encoding otherwise. Returns the encoded body
529
545
  # and a version of the encoded body that's safe to be logged.
530
- private def encode_body(body_params, headers)
546
+ private def encode_body(body_params, headers, api_mode)
531
547
  body = nil
532
548
  flattened_params = Util.flatten_params(body_params)
533
549
 
@@ -543,15 +559,22 @@ module Stripe
543
559
  flattened_params =
544
560
  flattened_params.map { |k, v| [k, v.is_a?(String) ? v : v.to_s] }.to_h
545
561
 
562
+ elsif api_mode == :preview
563
+ body = JSON.generate(body_params)
564
+ headers["Content-Type"] = "application/json"
546
565
  else
547
566
  body = Util.encode_parameters(body_params)
548
567
  end
549
568
 
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("&")
569
+ body_log = if api_mode == :preview
570
+ body
571
+ else
572
+ # We don't use `Util.encode_parameters` partly as an optimization (to
573
+ # not redo work we've already done), and partly because the encoded
574
+ # forms of certain characters introduce a lot of visual noise and it's
575
+ # nice to have a clearer format for logs.
576
+ flattened_params.map { |k, v| "#{k}=#{v}" }.join("&")
577
+ end
555
578
 
556
579
  [body, body_log]
557
580
  end
@@ -738,10 +761,11 @@ module Stripe
738
761
  end
739
762
 
740
763
  private def specific_api_error(resp, error_data, context)
764
+ message = error_data[:message]
741
765
  Util.log_error("Stripe API error",
742
766
  status: resp.http_status,
743
767
  error_code: error_data[:code],
744
- error_message: error_data[:message],
768
+ error_message: message,
745
769
  error_param: error_data[:param],
746
770
  error_type: error_data[:type],
747
771
  idempotency_key: context.idempotency_key,
@@ -762,26 +786,26 @@ module Stripe
762
786
  when 400, 404
763
787
  case error_data[:type]
764
788
  when "idempotency_error"
765
- IdempotencyError.new(error_data[:message], **opts)
789
+ IdempotencyError.new(message, **opts)
766
790
  else
767
791
  InvalidRequestError.new(
768
- error_data[:message], error_data[:param],
792
+ message, error_data[:param],
769
793
  **opts
770
794
  )
771
795
  end
772
796
  when 401
773
- AuthenticationError.new(error_data[:message], **opts)
797
+ AuthenticationError.new(message, **opts)
774
798
  when 402
775
799
  CardError.new(
776
- error_data[:message], error_data[:param],
800
+ message, error_data[:param],
777
801
  **opts
778
802
  )
779
803
  when 403
780
- PermissionError.new(error_data[:message], **opts)
804
+ PermissionError.new(message, **opts)
781
805
  when 429
782
- RateLimitError.new(error_data[:message], **opts)
806
+ RateLimitError.new(message, **opts)
783
807
  else
784
- APIError.new(error_data[:message], **opts)
808
+ APIError.new(message, **opts)
785
809
  end
786
810
  end
787
811
 
@@ -849,16 +873,20 @@ module Stripe
849
873
  message + "\n\n(Network error: #{error.message})"
850
874
  end
851
875
 
852
- private def request_headers(api_key, method)
876
+ private def request_headers(api_key, method, api_mode)
853
877
  user_agent = "Stripe/v1 RubyBindings/#{Stripe::VERSION}"
854
878
  user_agent += " " + format_app_info(Stripe.app_info) unless Stripe.app_info.nil?
855
879
 
856
880
  headers = {
857
881
  "User-Agent" => user_agent,
858
882
  "Authorization" => "Bearer #{api_key}",
859
- "Content-Type" => "application/x-www-form-urlencoded",
860
883
  }
861
884
 
885
+ if api_mode != :preview
886
+ # TODO: (major) don't set Content-Type if method is not post
887
+ headers["Content-Type"] = "application/x-www-form-urlencoded"
888
+ end
889
+
862
890
  if config.enable_telemetry? && !@last_request_metrics.nil?
863
891
  headers["X-Stripe-Client-Telemetry"] = JSON.generate(
864
892
  last_request_metrics: @last_request_metrics.payload
@@ -871,7 +899,12 @@ module Stripe
871
899
  headers["Idempotency-Key"] ||= SecureRandom.uuid
872
900
  end
873
901
 
874
- headers["Stripe-Version"] = config.api_version if config.api_version
902
+ if api_mode == :preview
903
+ headers["Stripe-Version"] = ApiVersion::PREVIEW
904
+ elsif config.api_version
905
+ headers["Stripe-Version"] = config.api_version
906
+ end
907
+
875
908
  headers["Stripe-Account"] = config.stripe_account if config.stripe_account
876
909
 
877
910
  user_agent = @system_profiler.user_agent
@@ -954,7 +987,8 @@ module Stripe
954
987
  # that we can log certain information. It's useful because it means that we
955
988
  # don't have to pass around as many parameters.
956
989
  class RequestLogContext
957
- attr_accessor :body, :account, :api_key, :api_version, :idempotency_key, :method, :path, :query, :request_id
990
+ attr_accessor :body, :account, :api_key, :authenticator, :api_version, :idempotency_key, :method, :path, :query,
991
+ :request_id
958
992
 
959
993
  # The idea with this method is that we might want to update some of
960
994
  # context information because a response that we've received from the API
@@ -25,7 +25,7 @@ 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, :api_version, :client_id, :enable_telemetry, :logger, :stripe_account
28
+ attr_accessor :api_key, :api_version, :authenticator, :client_id, :enable_telemetry, :logger, :stripe_account
29
29
 
30
30
  attr_reader :api_base, :uploads_base, :connect_base, :ca_bundle_path, :log_level, :initial_network_retry_delay,
31
31
  # rubocop:todo Layout/LineLength
@@ -50,6 +50,7 @@ module Stripe
50
50
 
51
51
  def initialize
52
52
  @api_version = ApiVersion::CURRENT
53
+
53
54
  @ca_bundle_path = Stripe::DEFAULT_CA_BUNDLE_PATH
54
55
  @enable_telemetry = true
55
56
  @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
@@ -279,7 +280,13 @@ module Stripe
279
280
  when String
280
281
  { api_key: opts }
281
282
  when Hash
282
- check_api_key!(opts.fetch(:api_key)) if opts.key?(:api_key)
283
+ # If the user is using request signing for authentication,
284
+ # no need to check the api_key per request.
285
+ if !(opts.key?(:client) &&
286
+ opts.fetch(:client).config.authenticator) &&
287
+ opts.key?(:api_key)
288
+ check_api_key!(opts.fetch(:api_key))
289
+ end
283
290
  # Explicitly use dup here instead of clone to avoid preserving freeze
284
291
  # state on input params.
285
292
  opts.dup
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Stripe
4
- VERSION = "10.14.0"
4
+ VERSION = "10.15.0-beta.1"
5
5
  end
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"
@@ -45,6 +46,7 @@ require "stripe/api_resource_test_helpers"
45
46
  require "stripe/singleton_api_resource"
46
47
  require "stripe/webhook"
47
48
  require "stripe/stripe_configuration"
49
+ require "stripe/request_signing_authenticator"
48
50
 
49
51
  # Named API resources
50
52
  require "stripe/resources"
@@ -71,6 +73,7 @@ module Stripe
71
73
 
72
74
  # User configurable options
73
75
  def_delegators :@config, :api_key, :api_key=
76
+ def_delegators :@config, :authenticator, :authenticator=
74
77
  def_delegators :@config, :api_version, :api_version=
75
78
  def_delegators :@config, :stripe_account, :stripe_account=
76
79
  def_delegators :@config, :api_base, :api_base=
@@ -117,6 +120,57 @@ module Stripe
117
120
  version: version,
118
121
  }
119
122
  end
123
+
124
+ def self.add_beta_version(beta_name, version)
125
+ if api_version.include?("; #{beta_name}=")
126
+ raise "Stripe version header #{api_version} already contains entry for beta #{beta_name}"
127
+ end
128
+
129
+ self.api_version = "#{api_version}; #{beta_name}=#{version}"
130
+ end
131
+
132
+ class Preview
133
+ def self._get_default_opts(opts)
134
+ { api_mode: :preview }.merge(opts)
135
+ end
136
+
137
+ def self.get(url, opts = {})
138
+ Stripe.raw_request(:get, url, {}, _get_default_opts(opts))
139
+ end
140
+
141
+ def self.post(url, params = {}, opts = {})
142
+ Stripe.raw_request(:post, url, params, _get_default_opts(opts))
143
+ end
144
+
145
+ def self.delete(url, opts = {})
146
+ Stripe.raw_request(:delete, url, {}, _get_default_opts(opts))
147
+ end
148
+ end
149
+
150
+ class RawRequest
151
+ include Stripe::APIOperations::Request
152
+
153
+ def initialize
154
+ @opts = {}
155
+ end
156
+
157
+ def execute(method, url, params = {}, opts = {}, usage = [])
158
+ resp, = execute_resource_request(method, url, params, opts, usage)
159
+
160
+ resp
161
+ end
162
+ end
163
+
164
+ # Sends a request to Stripe REST API
165
+ def self.raw_request(method, url, params = {}, opts = {})
166
+ req = RawRequest.new
167
+ req.execute(method, url, params, opts, ["raw_request"])
168
+ end
169
+
170
+ def self.deserialize(data)
171
+ data = JSON.parse(data) if data.is_a?(String)
172
+ Util.convert_to_stripe_object(data, {})
173
+ end
120
174
  end
121
175
 
122
176
  Stripe.log_level = ENV["STRIPE_LOG"] unless ENV["STRIPE_LOG"].nil?