-
Notifications
You must be signed in to change notification settings - Fork 438
Migration guide for v8 (StripeClient)
"
Introduces StripeClient
and the service-based call pattern. This new interface allows you to easily call Stripe APIs and has several benefits over the existing resource-based pattern:
- No global config: you can simultaneously use multiple clients with different configuration options (such as API keys)
- No static methods for easier mocking
To migrate from a resource-based to service-based pattern:
-
Initialize a
StripeClient
instance.Before
stripe.api_key = "sk_test_123"
After
client = stripe.StripeClient("sk_test_123")
You can also pass in previously configurable global options as keyword arguments into the
StripeClient
constructor:Before
stripe.api_key = "sk_test_123" stripe.api_version = "2022-11-15" stripe.max_network_retries = 3 stripe.proxy = "https://user:pass@example.com:1234"
After
client = stripe.StripeClient( "sk_test_123", stripe_version="2022-11-15", max_network_retries=3, proxy="https://user:pass@example.com:1234", )
-
Convert resource method calls to
StripeClient
calls. On resource-based calls, request parameters and request options were each individually passed in as a mix of positional and keyword arguments. But for service-base calls, request parameters and request options are passed in as separate dictionary arguments.Before
customer = stripe.Customer.create(email="jenny.rosen@example.com", stripe_account="acct_123")
After
customer = client.customers.create(params={"email": "jenny.rosen@example.com"}, options={"stripe_account": "acct_123"})
-
Convert nested resource operations to
StripeClient
calls. As with class and instance calls, request parameters and request options become separate dictionary arguments in the service-based pattern.Before
stripe.Customer.list_balance_transactions( "cus_123", limit=3, stripe_version="2022-11-15", )
After
customer = client.customers.balance_transactions.list( "cus_123", params={"limit": 3}, options={"stripe_version": "2022-11-15"}, );
-
To construct a webhook event, use the
StripeClient.construct_event()
method:Before
event = stripe.Webhook.construct_event( payload, sig_header, secret )
After
event = client.construct_event( payload, sig_header, secret )
"
⚠️ Request options likeapi_key
,stripe_account
,stripe_version
, andidempotency_key
can no longer be passed in positionally on resource methods. Please pass these in as keyword arguments.
BEFORE
stripe.Customer.create(
"sk_test_123", # api key
"KG5LxwFBepaKHyUD", # idempotency key
"2022-11-15", # stripe version
"acct_123", # stripe account
)
AFTER
stripe.Customer.create(
api_key="sk_test_123",
idempotency_key="KG5LxwFBepaKHyUD",
stripe_version="2022-11-15",
stripe_account="acct_123",
)
⚠️ Methods that turn a response stream (Quote.pdf
) now returns a single value of typeStripeResponseStream
instead of a tuple containing(StripeResponseStream, api_key)
.⚠️ APIRequestor.request()
andAPIRequestor.request_stream()
parameter changes:- Remove
headers
positional parameter - Add optional
options
positional parameter - Add required
base_address
andapi_mode
keyword-only parameter
- Remove
⚠️ UpdateAPIRequestor.request()
to return aStripeObject
(previouslyTuple[StripeResponse, str]
)⚠️ UpdateAPIRequestor.request_stream()
to return aStripeResponseStream
(previouslyTuple[StripeStreamResponse, str]
)⚠️ APIRequestor.request_headers()
parameters list changed fromdef request_headers(self, api_key, method)
todef request_headers(self, method, options: RequestOptions)
. Please migrate any existing calls by passing in an API key via aRequestOptions
dict:self.request_headers(method, {"api_key": api_key})
.
⚠️ Removeapi_version
fromFile.create
parameters. Please usestripe_version
instead.⚠️ Removeapi_base
andapi_version
attributes onAPIRequestor
⚠️ Removeutil.read_special_variable()
utility method (importing directly fromstripe.util
is deprecated as of v7.8.0)⚠️ RemoveAPIRequestor.interpret_response()
andAPIRequestor.interpret_streaming_response()
- these are now private methods.⚠️ RemoveAPIRequestor.format_app_info()
. This method was intended for internal stripe-python use only.⚠️ RemoveStripeError.construct_error_object()
. This method was intended for internal stripe-python use only.⚠️ RemoveListObject.empty_list()
. This method was intended for internal stripe-python use only.⚠️ RemoveSearchResultObject.empty_search_result()
. This method was intended for internal stripe-python use only.⚠️ RemoveStripeObject.ReprJSONEncoder
. This class was intended for internal stripe-python use only.⚠️ RemoveStripeObject.api_base
. This property was defunct and returnedNone
.