stripe 11.0.0 → 11.1.0.pre.beta.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +1312 -650
  3. data/Makefile +1 -1
  4. data/OPENAPI_VERSION +1 -1
  5. data/README.md +11 -0
  6. data/VERSION +1 -1
  7. data/lib/stripe/api_operations/request.rb +2 -1
  8. data/lib/stripe/api_version.rb +1 -0
  9. data/lib/stripe/object_types.rb +18 -2
  10. data/lib/stripe/request_signing_authenticator.rb +79 -0
  11. data/lib/stripe/resources/account_notice.rb +32 -0
  12. data/lib/stripe/resources/billing/meter.rb +1 -1
  13. data/lib/stripe/resources/billing/meter_event_adjustment.rb +1 -1
  14. data/lib/stripe/resources/capital/financing_offer.rb +49 -0
  15. data/lib/stripe/resources/capital/financing_summary.rb +15 -0
  16. data/lib/stripe/resources/capital/financing_transaction.rb +27 -0
  17. data/lib/stripe/resources/financial_connections/account.rb +3 -0
  18. data/lib/stripe/resources/financial_connections/account_inferred_balance.rb +14 -0
  19. data/lib/stripe/resources/gift_cards/card.rb +59 -0
  20. data/lib/stripe/resources/gift_cards/transaction.rb +93 -0
  21. data/lib/stripe/resources/invoice.rb +113 -0
  22. data/lib/stripe/resources/invoice_payment.rb +12 -0
  23. data/lib/stripe/resources/issuing/credit_underwriting_record.rb +88 -0
  24. data/lib/stripe/resources/margin.rb +37 -0
  25. data/lib/stripe/resources/order.rb +120 -0
  26. data/lib/stripe/resources/payment_intent.rb +50 -0
  27. data/lib/stripe/resources/quote.rb +104 -0
  28. data/lib/stripe/resources/quote_phase.rb +39 -0
  29. data/lib/stripe/resources/quote_preview_invoice.rb +43 -0
  30. data/lib/stripe/resources/quote_preview_subscription_schedule.rb +11 -0
  31. data/lib/stripe/resources/reversal.rb +1 -1
  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/usage_record.rb +2 -0
  36. data/lib/stripe/resources.rb +15 -0
  37. data/lib/stripe/stripe_client.rb +62 -28
  38. data/lib/stripe/stripe_configuration.rb +2 -1
  39. data/lib/stripe/util.rb +8 -1
  40. data/lib/stripe/version.rb +1 -1
  41. data/lib/stripe.rb +54 -0
  42. metadata +20 -4
@@ -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
@@ -14,7 +14,7 @@ module Stripe
14
14
  # transfer only if the destination account has enough balance to cover the
15
15
  # reversal.
16
16
  #
17
- # Related guide: [Reversing transfers](https://stripe.com/docs/connect/separate-charges-and-transfers#reversing-transfers)
17
+ # Related guide: [Reverse transfers](https://stripe.com/docs/connect/separate-charges-and-transfers#reverse-transfers)
18
18
  class Reversal < APIResource
19
19
  include Stripe::APIOperations::Save
20
20
 
@@ -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(
@@ -6,6 +6,8 @@ module Stripe
6
6
  # metered billing of subscription prices.
7
7
  #
8
8
  # Related guide: [Metered billing](https://stripe.com/docs/billing/subscriptions/metered-billing)
9
+ #
10
+ # This is our legacy usage-based billing API. See the [updated usage-based billing docs](https://docs.stripe.com/billing/subscriptions/usage-based).
9
11
  class UsageRecord < APIResource
10
12
  OBJECT_NAME = "usage_record"
11
13
  def self.object_name
@@ -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"
@@ -44,20 +48,25 @@ require "stripe/resources/exchange_rate"
44
48
  require "stripe/resources/file"
45
49
  require "stripe/resources/file_link"
46
50
  require "stripe/resources/financial_connections/account"
51
+ require "stripe/resources/financial_connections/account_inferred_balance"
47
52
  require "stripe/resources/financial_connections/account_owner"
48
53
  require "stripe/resources/financial_connections/account_ownership"
49
54
  require "stripe/resources/financial_connections/session"
50
55
  require "stripe/resources/financial_connections/transaction"
51
56
  require "stripe/resources/forwarding/request"
52
57
  require "stripe/resources/funding_instructions"
58
+ require "stripe/resources/gift_cards/card"
59
+ require "stripe/resources/gift_cards/transaction"
53
60
  require "stripe/resources/identity/verification_report"
54
61
  require "stripe/resources/identity/verification_session"
55
62
  require "stripe/resources/invoice"
56
63
  require "stripe/resources/invoice_item"
57
64
  require "stripe/resources/invoice_line_item"
65
+ require "stripe/resources/invoice_payment"
58
66
  require "stripe/resources/issuing/authorization"
59
67
  require "stripe/resources/issuing/card"
60
68
  require "stripe/resources/issuing/cardholder"
69
+ require "stripe/resources/issuing/credit_underwriting_record"
61
70
  require "stripe/resources/issuing/dispute"
62
71
  require "stripe/resources/issuing/personalization_design"
63
72
  require "stripe/resources/issuing/physical_bundle"
@@ -66,6 +75,8 @@ require "stripe/resources/issuing/transaction"
66
75
  require "stripe/resources/line_item"
67
76
  require "stripe/resources/login_link"
68
77
  require "stripe/resources/mandate"
78
+ require "stripe/resources/margin"
79
+ require "stripe/resources/order"
69
80
  require "stripe/resources/payment_intent"
70
81
  require "stripe/resources/payment_link"
71
82
  require "stripe/resources/payment_method"
@@ -79,6 +90,9 @@ require "stripe/resources/product"
79
90
  require "stripe/resources/product_feature"
80
91
  require "stripe/resources/promotion_code"
81
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"
82
96
  require "stripe/resources/radar/early_fraud_warning"
83
97
  require "stripe/resources/radar/value_list"
84
98
  require "stripe/resources/radar/value_list_item"
@@ -98,6 +112,7 @@ require "stripe/resources/subscription_item"
98
112
  require "stripe/resources/subscription_schedule"
99
113
  require "stripe/resources/tax/calculation"
100
114
  require "stripe/resources/tax/calculation_line_item"
115
+ require "stripe/resources/tax/form"
101
116
  require "stripe/resources/tax/registration"
102
117
  require "stripe/resources/tax/settings"
103
118
  require "stripe/resources/tax/transaction"
@@ -206,9 +206,10 @@ module Stripe
206
206
  end
207
207
 
208
208
  def execute_request(method, path,
209
- api_base: nil, api_key: nil, headers: {}, params: {}, usage: [])
209
+ api_base: nil, api_key: nil,
210
+ headers: {}, params: {}, api_mode: nil, usage: [])
210
211
  http_resp, api_key = execute_request_internal(
211
- method, path, api_base, api_key, headers, params, usage
212
+ method, path, api_base, api_key, headers, params, api_mode, usage
212
213
  )
213
214
 
214
215
  begin
@@ -239,6 +240,7 @@ module Stripe
239
240
  def execute_request_stream(method, path,
240
241
  api_base: nil, api_key: nil, usage: [],
241
242
  headers: {}, params: {},
243
+ api_mode: nil,
242
244
  &read_body_chunk_block)
243
245
  unless block_given?
244
246
  raise ArgumentError,
@@ -246,7 +248,8 @@ module Stripe
246
248
  end
247
249
 
248
250
  http_resp, api_key = execute_request_internal(
249
- method, path, api_base, api_key, headers, params, usage, &read_body_chunk_block
251
+ method, path, api_base, api_key,
252
+ headers, params, api_mode, usage, &read_body_chunk_block
250
253
  )
251
254
 
252
255
  # When the read_body_chunk_block is given, we no longer have access to the
@@ -425,8 +428,8 @@ module Stripe
425
428
  end
426
429
 
427
430
  private def execute_request_internal(method, path,
428
- api_base, api_key, headers, params, usage,
429
- &read_body_chunk_block)
431
+ api_base, api_key, headers, params,
432
+ api_mode, usage, &read_body_chunk_block)
430
433
  raise ArgumentError, "method should be a symbol" \
431
434
  unless method.is_a?(Symbol)
432
435
  raise ArgumentError, "path should be a string" \
@@ -434,9 +437,10 @@ module Stripe
434
437
 
435
438
  api_base ||= config.api_base
436
439
  api_key ||= config.api_key
440
+ authenticator ||= config.authenticator
437
441
  params = Util.objects_to_ids(params)
438
442
 
439
- check_api_key!(api_key)
443
+ check_keys!(api_key, authenticator)
440
444
 
441
445
  body_params = nil
442
446
  query_params = nil
@@ -449,8 +453,9 @@ module Stripe
449
453
 
450
454
  query_params, path = merge_query_params(query_params, path)
451
455
 
452
- headers = request_headers(api_key, method)
456
+ headers = request_headers(api_key, method, api_mode)
453
457
  .update(Util.normalize_headers(headers))
458
+
454
459
  url = api_url(path, api_base)
455
460
 
456
461
  # Merge given query parameters with any already encoded in the path.
@@ -461,13 +466,16 @@ module Stripe
461
466
  # a log-friendly variant of the encoded form. File objects are displayed
462
467
  # as such instead of as their file contents.
463
468
  body, body_log =
464
- body_params ? encode_body(body_params, headers) : [nil, nil]
469
+ body_params ? encode_body(body_params, headers, api_mode) : [nil, nil]
470
+
471
+ authenticator.authenticate(method, headers, body) unless api_key
465
472
 
466
473
  # stores information on the request we're about to make so that we don't
467
474
  # have to pass as many parameters around for logging.
468
475
  context = RequestLogContext.new
469
476
  context.account = headers["Stripe-Account"]
470
477
  context.api_key = api_key
478
+ context.authenticator = authenticator
471
479
  context.api_version = headers["Stripe-Version"]
472
480
  context.body = body_log
473
481
  context.idempotency_key = headers["Idempotency-Key"]
@@ -504,8 +512,16 @@ module Stripe
504
512
  (api_base || config.api_base) + url
505
513
  end
506
514
 
507
- private def check_api_key!(api_key)
508
- unless api_key
515
+ private def check_keys!(api_key, authenticator)
516
+ if api_key && authenticator
517
+ raise AuthenticationError, "Can't specify both API key " \
518
+ "and authenticator. Either set your API key" \
519
+ 'using "Stripe.api_key = <API-KEY>", or set your authenticator ' \
520
+ 'using "Stripe.authenticator = <AUTHENTICATOR>"' \
521
+ end
522
+
523
+ unless api_key || authenticator
524
+ # Default to missing API key error message for general users.
509
525
  raise AuthenticationError, "No API key provided. " \
510
526
  'Set your API key using "Stripe.api_key = <API-KEY>". ' \
511
527
  "You can generate API keys from the Stripe web interface. " \
@@ -524,7 +540,7 @@ module Stripe
524
540
  # Encodes a set of body parameters using multipart if `Content-Type` is set
525
541
  # for that, or standard form-encoding otherwise. Returns the encoded body
526
542
  # and a version of the encoded body that's safe to be logged.
527
- private def encode_body(body_params, headers)
543
+ private def encode_body(body_params, headers, api_mode)
528
544
  body = nil
529
545
  flattened_params = Util.flatten_params(body_params)
530
546
 
@@ -540,15 +556,22 @@ module Stripe
540
556
  flattened_params =
541
557
  flattened_params.map { |k, v| [k, v.is_a?(String) ? v : v.to_s] }.to_h
542
558
 
559
+ elsif api_mode == :preview
560
+ body = JSON.generate(body_params)
561
+ headers["Content-Type"] = "application/json"
543
562
  else
544
563
  body = Util.encode_parameters(body_params)
545
564
  end
546
565
 
547
- # We don't use `Util.encode_parameters` partly as an optimization (to not
548
- # redo work we've already done), and partly because the encoded forms of
549
- # certain characters introduce a lot of visual noise and it's nice to
550
- # have a clearer format for logs.
551
- body_log = flattened_params.map { |k, v| "#{k}=#{v}" }.join("&")
566
+ body_log = if api_mode == :preview
567
+ body
568
+ else
569
+ # We don't use `Util.encode_parameters` partly as an optimization (to
570
+ # not redo work we've already done), and partly because the encoded
571
+ # forms of certain characters introduce a lot of visual noise and it's
572
+ # nice to have a clearer format for logs.
573
+ flattened_params.map { |k, v| "#{k}=#{v}" }.join("&")
574
+ end
552
575
 
553
576
  [body, body_log]
554
577
  end
@@ -734,10 +757,11 @@ module Stripe
734
757
  end
735
758
 
736
759
  private def specific_api_error(resp, error_data, context)
760
+ message = error_data[:message]
737
761
  Util.log_error("Stripe API error",
738
762
  status: resp.http_status,
739
763
  error_code: error_data[:code],
740
- error_message: error_data[:message],
764
+ error_message: message,
741
765
  error_param: error_data[:param],
742
766
  error_type: error_data[:type],
743
767
  idempotency_key: context.idempotency_key,
@@ -758,26 +782,26 @@ module Stripe
758
782
  when 400, 404
759
783
  case error_data[:type]
760
784
  when "idempotency_error"
761
- IdempotencyError.new(error_data[:message], **opts)
785
+ IdempotencyError.new(message, **opts)
762
786
  else
763
787
  InvalidRequestError.new(
764
- error_data[:message], error_data[:param],
788
+ message, error_data[:param],
765
789
  **opts
766
790
  )
767
791
  end
768
792
  when 401
769
- AuthenticationError.new(error_data[:message], **opts)
793
+ AuthenticationError.new(message, **opts)
770
794
  when 402
771
795
  CardError.new(
772
- error_data[:message], error_data[:param],
796
+ message, error_data[:param],
773
797
  **opts
774
798
  )
775
799
  when 403
776
- PermissionError.new(error_data[:message], **opts)
800
+ PermissionError.new(message, **opts)
777
801
  when 429
778
- RateLimitError.new(error_data[:message], **opts)
802
+ RateLimitError.new(message, **opts)
779
803
  else
780
- APIError.new(error_data[:message], **opts)
804
+ APIError.new(message, **opts)
781
805
  end
782
806
  end
783
807
 
@@ -845,16 +869,20 @@ module Stripe
845
869
  message + "\n\n(Network error: #{error.message})"
846
870
  end
847
871
 
848
- private def request_headers(api_key, method)
872
+ private def request_headers(api_key, method, api_mode)
849
873
  user_agent = "Stripe/v1 RubyBindings/#{Stripe::VERSION}"
850
874
  user_agent += " " + format_app_info(Stripe.app_info) unless Stripe.app_info.nil?
851
875
 
852
876
  headers = {
853
877
  "User-Agent" => user_agent,
854
878
  "Authorization" => "Bearer #{api_key}",
855
- "Content-Type" => "application/x-www-form-urlencoded",
856
879
  }
857
880
 
881
+ if api_mode != :preview
882
+ # TODO: (major) don't set Content-Type if method is not post
883
+ headers["Content-Type"] = "application/x-www-form-urlencoded"
884
+ end
885
+
858
886
  if config.enable_telemetry? && !@last_request_metrics.nil?
859
887
  headers["X-Stripe-Client-Telemetry"] = JSON.generate(
860
888
  last_request_metrics: @last_request_metrics.payload
@@ -867,7 +895,12 @@ module Stripe
867
895
  headers["Idempotency-Key"] ||= SecureRandom.uuid
868
896
  end
869
897
 
870
- headers["Stripe-Version"] = config.api_version if config.api_version
898
+ if api_mode == :preview
899
+ headers["Stripe-Version"] = ApiVersion::PREVIEW
900
+ elsif config.api_version
901
+ headers["Stripe-Version"] = config.api_version
902
+ end
903
+
871
904
  headers["Stripe-Account"] = config.stripe_account if config.stripe_account
872
905
 
873
906
  user_agent = @system_profiler.user_agent
@@ -950,7 +983,8 @@ module Stripe
950
983
  # that we can log certain information. It's useful because it means that we
951
984
  # don't have to pass around as many parameters.
952
985
  class RequestLogContext
953
- attr_accessor :body, :account, :api_key, :api_version, :idempotency_key, :method, :path, :query, :request_id
986
+ attr_accessor :body, :account, :api_key, :authenticator, :api_version, :idempotency_key, :method, :path, :query,
987
+ :request_id
954
988
 
955
989
  # The idea with this method is that we might want to update some of
956
990
  # 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 = "11.0.0"
4
+ VERSION = "11.1.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?