stripe 10.10.0 → 10.11.0.pre.beta.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +285 -40
  3. data/README.md +11 -0
  4. data/VERSION +1 -1
  5. data/lib/stripe/api_operations/request.rb +2 -1
  6. data/lib/stripe/api_version.rb +1 -0
  7. data/lib/stripe/object_types.rb +23 -0
  8. data/lib/stripe/request_signing_authenticator.rb +79 -0
  9. data/lib/stripe/resources/account_notice.rb +32 -0
  10. data/lib/stripe/resources/capital/financing_offer.rb +49 -0
  11. data/lib/stripe/resources/capital/financing_summary.rb +15 -0
  12. data/lib/stripe/resources/capital/financing_transaction.rb +27 -0
  13. data/lib/stripe/resources/confirmation_token.rb +16 -0
  14. data/lib/stripe/resources/customer.rb +11 -0
  15. data/lib/stripe/resources/customer_entitlement.rb +12 -0
  16. data/lib/stripe/resources/customer_entitlement_summary.rb +12 -0
  17. data/lib/stripe/resources/entitlements/event.rb +26 -0
  18. data/lib/stripe/resources/entitlements/feature.rb +38 -0
  19. data/lib/stripe/resources/financial_connections/account.rb +3 -0
  20. data/lib/stripe/resources/financial_connections/account_inferred_balance.rb +14 -0
  21. data/lib/stripe/resources/gift_cards/card.rb +59 -0
  22. data/lib/stripe/resources/gift_cards/transaction.rb +93 -0
  23. data/lib/stripe/resources/invoice.rb +53 -0
  24. data/lib/stripe/resources/invoice_payment.rb +12 -0
  25. data/lib/stripe/resources/issuing/credit_underwriting_record.rb +88 -0
  26. data/lib/stripe/resources/issuing/personalization_design.rb +119 -0
  27. data/lib/stripe/resources/issuing/physical_bundle.rb +26 -0
  28. data/lib/stripe/resources/margin.rb +37 -0
  29. data/lib/stripe/resources/order.rb +120 -0
  30. data/lib/stripe/resources/payment_intent.rb +50 -0
  31. data/lib/stripe/resources/quote.rb +104 -0
  32. data/lib/stripe/resources/quote_phase.rb +39 -0
  33. data/lib/stripe/resources/quote_preview_invoice.rb +43 -0
  34. data/lib/stripe/resources/quote_preview_subscription_schedule.rb +11 -0
  35. data/lib/stripe/resources/subscription_schedule.rb +20 -0
  36. data/lib/stripe/resources/tax/form.rb +49 -0
  37. data/lib/stripe/resources/terminal/reader.rb +60 -0
  38. data/lib/stripe/resources.rb +22 -0
  39. data/lib/stripe/stripe_client.rb +62 -28
  40. data/lib/stripe/stripe_configuration.rb +2 -1
  41. data/lib/stripe/util.rb +8 -1
  42. data/lib/stripe/version.rb +1 -1
  43. data/lib/stripe.rb +46 -0
  44. metadata +26 -3
@@ -40,12 +40,33 @@ module Stripe
40
40
  extend Stripe::APIOperations::List
41
41
  extend Stripe::APIOperations::Search
42
42
  include Stripe::APIOperations::Save
43
+ extend Stripe::APIOperations::NestedResource
43
44
 
44
45
  OBJECT_NAME = "invoice"
45
46
  def self.object_name
46
47
  "invoice"
47
48
  end
48
49
 
50
+ nested_resource_class_methods :payment, operations: %i[retrieve list]
51
+
52
+ # Attaches a PaymentIntent to the invoice, adding it to the list of payments.
53
+ # When the PaymentIntent's status changes to succeeded, the payment is credited
54
+ # to the invoice, increasing its amount_paid. When the invoice is fully paid, the
55
+ # invoice's status becomes paid.
56
+ #
57
+ # If the PaymentIntent's status is already succeeded when it is attached, it is
58
+ # credited to the invoice immediately.
59
+ #
60
+ # Related guide: [Create an invoice payment](https://stripe.com/docs/invoicing/payments/create)
61
+ def attach_payment_intent(params = {}, opts = {})
62
+ request_stripe_object(
63
+ method: :post,
64
+ path: format("/v1/invoices/%<invoice>s/attach_payment_intent", { invoice: CGI.escape(self["id"]) }),
65
+ params: params,
66
+ opts: opts
67
+ )
68
+ end
69
+
49
70
  # Stripe automatically finalizes drafts before sending and attempting payment on invoices. However, if you'd like to finalize a draft invoice manually, you can do so using this method.
50
71
  def finalize_invoice(params = {}, opts = {})
51
72
  request_stripe_object(
@@ -98,6 +119,38 @@ module Stripe
98
119
  )
99
120
  end
100
121
 
122
+ # Attaches a PaymentIntent to the invoice, adding it to the list of payments.
123
+ # When the PaymentIntent's status changes to succeeded, the payment is credited
124
+ # to the invoice, increasing its amount_paid. When the invoice is fully paid, the
125
+ # invoice's status becomes paid.
126
+ #
127
+ # If the PaymentIntent's status is already succeeded when it is attached, it is
128
+ # credited to the invoice immediately.
129
+ #
130
+ # Related guide: [Create an invoice payment](https://stripe.com/docs/invoicing/payments/create)
131
+ def self.attach_payment_intent(invoice, params = {}, opts = {})
132
+ request_stripe_object(
133
+ method: :post,
134
+ path: format("/v1/invoices/%<invoice>s/attach_payment_intent", { invoice: CGI.escape(invoice) }),
135
+ params: params,
136
+ opts: opts
137
+ )
138
+ end
139
+
140
+ # At any time, you can preview the upcoming invoice for a customer. This will show you all the charges that are pending, including subscription renewal charges, invoice item charges, etc. It will also show you any discounts that are applicable to the invoice.
141
+ #
142
+ # Note that when you are viewing an upcoming invoice, you are simply viewing a preview – the invoice has not yet been created. As such, the upcoming invoice will not show up in invoice listing calls, and you cannot use the API to pay or edit the invoice. If you want to change the amount that your customer will be billed, you can add, remove, or update pending invoice items, or update the customer's discount.
143
+ #
144
+ # You can preview the effects of updating a subscription, including a preview of what proration will take place. To ensure that the actual proration is calculated exactly the same as the previewed proration, you should pass a proration_date parameter when doing the actual subscription update. The value passed in should be the same as the subscription_proration_date returned on the upcoming invoice resource. The recommended way to get only the prorations being previewed is to consider only proration line items where period[start] is equal to the subscription_proration_date on the upcoming invoice resource.
145
+ def self.create_preview(params = {}, opts = {})
146
+ request_stripe_object(
147
+ method: :post,
148
+ path: "/v1/invoices/create_preview",
149
+ params: params,
150
+ opts: opts
151
+ )
152
+ end
153
+
101
154
  # Stripe automatically finalizes drafts before sending and attempting payment on invoices. However, if you'd like to finalize a draft invoice manually, you can do so using this method.
102
155
  def self.finalize_invoice(invoice, params = {}, opts = {})
103
156
  request_stripe_object(
@@ -0,0 +1,12 @@
1
+ # File generated from our OpenAPI spec
2
+ # frozen_string_literal: true
3
+
4
+ module Stripe
5
+ # The invoice payment object
6
+ class InvoicePayment < APIResource
7
+ OBJECT_NAME = "invoice_payment"
8
+ def self.object_name
9
+ "invoice_payment"
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,88 @@
1
+ # File generated from our OpenAPI spec
2
+ # frozen_string_literal: true
3
+
4
+ module Stripe
5
+ module Issuing
6
+ # Every time an applicant submits an application for a Charge Card product your platform offers, or every time your platform takes a proactive credit decision on an existing account, you must record the decision by creating a new `CreditUnderwritingRecord` object on a connected account.
7
+ #
8
+ # [Follow the guide](https://stripe.com/docs/issuing/credit/report-credit-decisions-and-manage-aans) to learn about your requirements as a platform.
9
+ class CreditUnderwritingRecord < APIResource
10
+ extend Stripe::APIOperations::List
11
+
12
+ OBJECT_NAME = "issuing.credit_underwriting_record"
13
+ def self.object_name
14
+ "issuing.credit_underwriting_record"
15
+ end
16
+
17
+ # Update a CreditUnderwritingRecord object to correct mistakes.
18
+ def correct(params = {}, opts = {})
19
+ request_stripe_object(
20
+ method: :post,
21
+ path: format("/v1/issuing/credit_underwriting_records/%<credit_underwriting_record>s/correct", { credit_underwriting_record: CGI.escape(self["id"]) }),
22
+ params: params,
23
+ opts: opts
24
+ )
25
+ end
26
+
27
+ # Update a CreditUnderwritingRecord object from a decision made on a credit application.
28
+ def report_decision(params = {}, opts = {})
29
+ request_stripe_object(
30
+ method: :post,
31
+ path: format("/v1/issuing/credit_underwriting_records/%<credit_underwriting_record>s/report_decision", { credit_underwriting_record: CGI.escape(self["id"]) }),
32
+ params: params,
33
+ opts: opts
34
+ )
35
+ end
36
+
37
+ # Update a CreditUnderwritingRecord object to correct mistakes.
38
+ def self.correct(credit_underwriting_record, params = {}, opts = {})
39
+ request_stripe_object(
40
+ method: :post,
41
+ path: format("/v1/issuing/credit_underwriting_records/%<credit_underwriting_record>s/correct", { credit_underwriting_record: CGI.escape(credit_underwriting_record) }),
42
+ params: params,
43
+ opts: opts
44
+ )
45
+ end
46
+
47
+ # Creates a CreditUnderwritingRecord object with information about a credit application submission.
48
+ def self.create_from_application(params = {}, opts = {})
49
+ request_stripe_object(
50
+ method: :post,
51
+ path: "/v1/issuing/credit_underwriting_records/create_from_application",
52
+ params: params,
53
+ opts: opts
54
+ )
55
+ end
56
+
57
+ # Creates a CreditUnderwritingRecord object from an underwriting decision coming from a proactive review of an existing accountholder.
58
+ def self.create_from_proactive_review(params = {}, opts = {})
59
+ request_stripe_object(
60
+ method: :post,
61
+ path: "/v1/issuing/credit_underwriting_records/create_from_proactive_review",
62
+ params: params,
63
+ opts: opts
64
+ )
65
+ end
66
+
67
+ # Update a CreditUnderwritingRecord object from a decision made on a credit application.
68
+ def self.report_decision(credit_underwriting_record, params = {}, opts = {})
69
+ request_stripe_object(
70
+ method: :post,
71
+ path: format("/v1/issuing/credit_underwriting_records/%<credit_underwriting_record>s/report_decision", { credit_underwriting_record: CGI.escape(credit_underwriting_record) }),
72
+ params: params,
73
+ opts: opts
74
+ )
75
+ end
76
+
77
+ # Retrieves a list of CreditUnderwritingRecord objects. The objects are sorted in descending order by creation date, with the most-recently-created object appearing first.
78
+ def self.list(filters = {}, opts = {})
79
+ request_stripe_object(
80
+ method: :get,
81
+ path: "/v1/issuing/credit_underwriting_records",
82
+ params: filters,
83
+ opts: opts
84
+ )
85
+ end
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,119 @@
1
+ # File generated from our OpenAPI spec
2
+ # frozen_string_literal: true
3
+
4
+ module Stripe
5
+ module Issuing
6
+ # A Personalization Design is a logical grouping of a Physical Bundle, card logo, and carrier text that represents a product line.
7
+ class PersonalizationDesign < APIResource
8
+ extend Stripe::APIOperations::Create
9
+ extend Stripe::APIOperations::List
10
+ include Stripe::APIOperations::Save
11
+
12
+ OBJECT_NAME = "issuing.personalization_design"
13
+ def self.object_name
14
+ "issuing.personalization_design"
15
+ end
16
+
17
+ # Creates a personalization design object.
18
+ def self.create(params = {}, opts = {})
19
+ request_stripe_object(
20
+ method: :post,
21
+ path: "/v1/issuing/personalization_designs",
22
+ params: params,
23
+ opts: opts
24
+ )
25
+ end
26
+
27
+ # Returns a list of personalization design objects. The objects are sorted in descending order by creation date, with the most recently created object appearing first.
28
+ def self.list(filters = {}, opts = {})
29
+ request_stripe_object(
30
+ method: :get,
31
+ path: "/v1/issuing/personalization_designs",
32
+ params: filters,
33
+ opts: opts
34
+ )
35
+ end
36
+
37
+ # Updates a card personalization object.
38
+ def self.update(id, params = {}, opts = {})
39
+ request_stripe_object(
40
+ method: :post,
41
+ path: format("/v1/issuing/personalization_designs/%<id>s", { id: CGI.escape(id) }),
42
+ params: params,
43
+ opts: opts
44
+ )
45
+ end
46
+
47
+ def test_helpers
48
+ TestHelpers.new(self)
49
+ end
50
+
51
+ class TestHelpers < APIResourceTestHelpers
52
+ RESOURCE_CLASS = PersonalizationDesign
53
+ def self.resource_class
54
+ "PersonalizationDesign"
55
+ end
56
+
57
+ # Updates the status of the specified testmode personalization design object to active.
58
+ def self.activate(personalization_design, params = {}, opts = {})
59
+ request_stripe_object(
60
+ method: :post,
61
+ path: format("/v1/test_helpers/issuing/personalization_designs/%<personalization_design>s/activate", { personalization_design: CGI.escape(personalization_design) }),
62
+ params: params,
63
+ opts: opts
64
+ )
65
+ end
66
+
67
+ # Updates the status of the specified testmode personalization design object to inactive.
68
+ def self.deactivate(personalization_design, params = {}, opts = {})
69
+ request_stripe_object(
70
+ method: :post,
71
+ path: format("/v1/test_helpers/issuing/personalization_designs/%<personalization_design>s/deactivate", { personalization_design: CGI.escape(personalization_design) }),
72
+ params: params,
73
+ opts: opts
74
+ )
75
+ end
76
+
77
+ # Updates the status of the specified testmode personalization design object to rejected.
78
+ def self.reject(personalization_design, params = {}, opts = {})
79
+ request_stripe_object(
80
+ method: :post,
81
+ path: format("/v1/test_helpers/issuing/personalization_designs/%<personalization_design>s/reject", { personalization_design: CGI.escape(personalization_design) }),
82
+ params: params,
83
+ opts: opts
84
+ )
85
+ end
86
+
87
+ # Updates the status of the specified testmode personalization design object to active.
88
+ def activate(params = {}, opts = {})
89
+ @resource.request_stripe_object(
90
+ method: :post,
91
+ path: format("/v1/test_helpers/issuing/personalization_designs/%<personalization_design>s/activate", { personalization_design: CGI.escape(@resource["id"]) }),
92
+ params: params,
93
+ opts: opts
94
+ )
95
+ end
96
+
97
+ # Updates the status of the specified testmode personalization design object to inactive.
98
+ def deactivate(params = {}, opts = {})
99
+ @resource.request_stripe_object(
100
+ method: :post,
101
+ path: format("/v1/test_helpers/issuing/personalization_designs/%<personalization_design>s/deactivate", { personalization_design: CGI.escape(@resource["id"]) }),
102
+ params: params,
103
+ opts: opts
104
+ )
105
+ end
106
+
107
+ # Updates the status of the specified testmode personalization design object to rejected.
108
+ def reject(params = {}, opts = {})
109
+ @resource.request_stripe_object(
110
+ method: :post,
111
+ path: format("/v1/test_helpers/issuing/personalization_designs/%<personalization_design>s/reject", { personalization_design: CGI.escape(@resource["id"]) }),
112
+ params: params,
113
+ opts: opts
114
+ )
115
+ end
116
+ end
117
+ end
118
+ end
119
+ end
@@ -0,0 +1,26 @@
1
+ # File generated from our OpenAPI spec
2
+ # frozen_string_literal: true
3
+
4
+ module Stripe
5
+ module Issuing
6
+ # A Physical Bundle represents the bundle of physical items - card stock, carrier letter, and envelope - that is shipped to a cardholder when you create a physical card.
7
+ class PhysicalBundle < APIResource
8
+ extend Stripe::APIOperations::List
9
+
10
+ OBJECT_NAME = "issuing.physical_bundle"
11
+ def self.object_name
12
+ "issuing.physical_bundle"
13
+ end
14
+
15
+ # Returns a list of physical bundle objects. The objects are sorted in descending order by creation date, with the most recently created object appearing first.
16
+ def self.list(filters = {}, opts = {})
17
+ request_stripe_object(
18
+ method: :get,
19
+ path: "/v1/issuing/physical_bundles",
20
+ params: filters,
21
+ opts: opts
22
+ )
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,37 @@
1
+ # File generated from our OpenAPI spec
2
+ # frozen_string_literal: true
3
+
4
+ module Stripe
5
+ # A (partner) margin represents a specific discount distributed in partner reseller programs to business partners who
6
+ # resell products and services and earn a discount (margin) for doing so.
7
+ class Margin < APIResource
8
+ extend Stripe::APIOperations::Create
9
+ extend Stripe::APIOperations::List
10
+ include Stripe::APIOperations::Save
11
+
12
+ OBJECT_NAME = "margin"
13
+ def self.object_name
14
+ "margin"
15
+ end
16
+
17
+ # Create a margin object to be used with invoices, invoice items, and invoice line items for a customer to represent a partner discount.A margin has a percent_off which is the percent that will be taken off the subtotal after all items and other discounts and promotions) of any invoices for a customer. Calculation of prorations do not include any partner margins applied on the original invoice item.
18
+ def self.create(params = {}, opts = {})
19
+ request_stripe_object(method: :post, path: "/v1/billing/margins", params: params, opts: opts)
20
+ end
21
+
22
+ # Retrieve a list of your margins.
23
+ def self.list(filters = {}, opts = {})
24
+ request_stripe_object(method: :get, path: "/v1/billing/margins", params: filters, opts: opts)
25
+ end
26
+
27
+ # Update the specified margin object. Certain fields of the margin object are not editable.
28
+ def self.update(id, params = {}, opts = {})
29
+ request_stripe_object(
30
+ method: :post,
31
+ path: format("/v1/billing/margins/%<id>s", { id: CGI.escape(id) }),
32
+ params: params,
33
+ opts: opts
34
+ )
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,120 @@
1
+ # File generated from our OpenAPI spec
2
+ # frozen_string_literal: true
3
+
4
+ module Stripe
5
+ # An Order describes a purchase being made by a customer, including the
6
+ # products & quantities being purchased, the order status, the payment information,
7
+ # and the billing/shipping details.
8
+ #
9
+ # Related guide: [Orders overview](https://stripe.com/docs/orders)
10
+ class Order < APIResource
11
+ extend Stripe::APIOperations::Create
12
+ extend Stripe::APIOperations::List
13
+ include Stripe::APIOperations::Save
14
+
15
+ OBJECT_NAME = "order"
16
+ def self.object_name
17
+ "order"
18
+ end
19
+
20
+ # Cancels the order as well as the payment intent if one is attached.
21
+ def cancel(params = {}, opts = {})
22
+ request_stripe_object(
23
+ method: :post,
24
+ path: format("/v1/orders/%<id>s/cancel", { id: CGI.escape(self["id"]) }),
25
+ params: params,
26
+ opts: opts
27
+ )
28
+ end
29
+
30
+ # When retrieving an order, there is an includable line_items property containing the first handful of those items. There is also a URL where you can retrieve the full (paginated) list of line items.
31
+ def list_line_items(params = {}, opts = {})
32
+ request_stripe_object(
33
+ method: :get,
34
+ path: format("/v1/orders/%<id>s/line_items", { id: CGI.escape(self["id"]) }),
35
+ params: params,
36
+ opts: opts
37
+ )
38
+ end
39
+
40
+ # Reopens a submitted order.
41
+ def reopen(params = {}, opts = {})
42
+ request_stripe_object(
43
+ method: :post,
44
+ path: format("/v1/orders/%<id>s/reopen", { id: CGI.escape(self["id"]) }),
45
+ params: params,
46
+ opts: opts
47
+ )
48
+ end
49
+
50
+ # Submitting an Order transitions the status to processing and creates a PaymentIntent object so the order can be paid. If the Order has an amount_total of 0, no PaymentIntent object will be created. Once the order is submitted, its contents cannot be changed, unless the [reopen](https://stripe.com/docs/api#reopen_order) method is called.
51
+ def submit(params = {}, opts = {})
52
+ request_stripe_object(
53
+ method: :post,
54
+ path: format("/v1/orders/%<id>s/submit", { id: CGI.escape(self["id"]) }),
55
+ params: params,
56
+ opts: opts
57
+ )
58
+ end
59
+
60
+ # Cancels the order as well as the payment intent if one is attached.
61
+ def self.cancel(id, params = {}, opts = {})
62
+ request_stripe_object(
63
+ method: :post,
64
+ path: format("/v1/orders/%<id>s/cancel", { id: CGI.escape(id) }),
65
+ params: params,
66
+ opts: opts
67
+ )
68
+ end
69
+
70
+ # When retrieving an order, there is an includable line_items property containing the first handful of those items. There is also a URL where you can retrieve the full (paginated) list of line items.
71
+ def self.list_line_items(id, params = {}, opts = {})
72
+ request_stripe_object(
73
+ method: :get,
74
+ path: format("/v1/orders/%<id>s/line_items", { id: CGI.escape(id) }),
75
+ params: params,
76
+ opts: opts
77
+ )
78
+ end
79
+
80
+ # Reopens a submitted order.
81
+ def self.reopen(id, params = {}, opts = {})
82
+ request_stripe_object(
83
+ method: :post,
84
+ path: format("/v1/orders/%<id>s/reopen", { id: CGI.escape(id) }),
85
+ params: params,
86
+ opts: opts
87
+ )
88
+ end
89
+
90
+ # Submitting an Order transitions the status to processing and creates a PaymentIntent object so the order can be paid. If the Order has an amount_total of 0, no PaymentIntent object will be created. Once the order is submitted, its contents cannot be changed, unless the [reopen](https://stripe.com/docs/api#reopen_order) method is called.
91
+ def self.submit(id, params = {}, opts = {})
92
+ request_stripe_object(
93
+ method: :post,
94
+ path: format("/v1/orders/%<id>s/submit", { id: CGI.escape(id) }),
95
+ params: params,
96
+ opts: opts
97
+ )
98
+ end
99
+
100
+ # Creates a new open order object.
101
+ def self.create(params = {}, opts = {})
102
+ request_stripe_object(method: :post, path: "/v1/orders", params: params, opts: opts)
103
+ end
104
+
105
+ # Returns a list of your orders. The orders are returned sorted by creation date, with the most recently created orders appearing first.
106
+ def self.list(filters = {}, opts = {})
107
+ request_stripe_object(method: :get, path: "/v1/orders", params: filters, opts: opts)
108
+ end
109
+
110
+ # Updates the specific order by setting the values of the parameters passed. Any parameters not provided will be left unchanged.
111
+ def self.update(id, params = {}, opts = {})
112
+ request_stripe_object(
113
+ method: :post,
114
+ path: format("/v1/orders/%<id>s", { id: CGI.escape(id) }),
115
+ params: params,
116
+ opts: opts
117
+ )
118
+ end
119
+ end
120
+ end
@@ -93,6 +93,31 @@ module Stripe
93
93
  )
94
94
  end
95
95
 
96
+ # Perform an decremental authorization on an eligible
97
+ # [PaymentIntent](https://stripe.com/docs/api/payment_intents/object). To be eligible, the
98
+ # PaymentIntent's status must be requires_capture and
99
+ # [decremental_authorization.status](https://stripe.com/docs/api/charges/object#charge_object-payment_method_details-card-decremental_authorization)
100
+ # must be available.
101
+ #
102
+ # Decremental authorizations decrease the authorized amount on your customer's card
103
+ # to the new, lower amount provided. A single PaymentIntent can call this endpoint multiple times to further decrease the authorized amount.
104
+ #
105
+ # After decrement, the PaymentIntent object
106
+ # returns with the updated
107
+ # [amount](https://stripe.com/docs/api/payment_intents/object#payment_intent_object-amount).
108
+ # The PaymentIntent will now be capturable up to the new authorized amount.
109
+ #
110
+ # Each PaymentIntent can have a maximum of 10 decremental or incremental authorization attempts, including declines.
111
+ # After it's captured, a PaymentIntent can no longer be decremented.
112
+ def decrement_authorization(params = {}, opts = {})
113
+ request_stripe_object(
114
+ method: :post,
115
+ path: format("/v1/payment_intents/%<intent>s/decrement_authorization", { intent: CGI.escape(self["id"]) }),
116
+ params: params,
117
+ opts: opts
118
+ )
119
+ end
120
+
96
121
  # Perform an incremental authorization on an eligible
97
122
  # [PaymentIntent](https://stripe.com/docs/api/payment_intents/object). To be eligible, the
98
123
  # PaymentIntent's status must be requires_capture and
@@ -205,6 +230,31 @@ module Stripe
205
230
  )
206
231
  end
207
232
 
233
+ # Perform an decremental authorization on an eligible
234
+ # [PaymentIntent](https://stripe.com/docs/api/payment_intents/object). To be eligible, the
235
+ # PaymentIntent's status must be requires_capture and
236
+ # [decremental_authorization.status](https://stripe.com/docs/api/charges/object#charge_object-payment_method_details-card-decremental_authorization)
237
+ # must be available.
238
+ #
239
+ # Decremental authorizations decrease the authorized amount on your customer's card
240
+ # to the new, lower amount provided. A single PaymentIntent can call this endpoint multiple times to further decrease the authorized amount.
241
+ #
242
+ # After decrement, the PaymentIntent object
243
+ # returns with the updated
244
+ # [amount](https://stripe.com/docs/api/payment_intents/object#payment_intent_object-amount).
245
+ # The PaymentIntent will now be capturable up to the new authorized amount.
246
+ #
247
+ # Each PaymentIntent can have a maximum of 10 decremental or incremental authorization attempts, including declines.
248
+ # After it's captured, a PaymentIntent can no longer be decremented.
249
+ def self.decrement_authorization(intent, params = {}, opts = {})
250
+ request_stripe_object(
251
+ method: :post,
252
+ path: format("/v1/payment_intents/%<intent>s/decrement_authorization", { intent: CGI.escape(intent) }),
253
+ params: params,
254
+ opts: opts
255
+ )
256
+ end
257
+
208
258
  # Perform an incremental authorization on an eligible
209
259
  # [PaymentIntent](https://stripe.com/docs/api/payment_intents/object). To be eligible, the
210
260
  # PaymentIntent's status must be requires_capture and