Description
Is your feature request related to a problem? Please describe.
I store my Stripe API keys in a secrets store service and retrieve them from this secrets store when I need to call the Stripe API. Given that I need to retrieve the keys from this secrets store, that the keys can be rotated, and that the secrets store access can be revoked as needed, I can't use a one time retrieval of the secret upon instantiation of the StripeClient
. This leads me to a pattern where I instantiate the StripeClient
with a fake key, and then use the per request options
dictionary to specify the API key in each request.
Describe the solution you'd like
I would prefer to be able to pass a callable that returns a string to StripeClient
in lieu of passing a string argument to api_key
. This callable would then be invoked by the StripeClient
on each call that needs it, allowing me to run any custom code I need such as fetching the API key from the secret store.
Describe alternatives you've considered
My current workaround is to instantiate the StripeClient
with a fake key, and then specify api_key
in the options
dictionary on each request.
Additional context
stripe_client = StripeClient(
api_key="fake_key_on_purpose",
max_network_retries=5,
http_client=HTTPXClient(allow_sync_methods=True),
)
# sometime later
stripe_client.products.create(
params={
"name": f"{permit_type_name} permit renewal fee",
"default_price_data": {
"currency": "USD",
"recurring": {
"interval": interval,
"interval_count": renewal_configuration.interval,
},
},
"unit_amount": renewal_configuration.renewal_fee,
},
options={
"api_key": get_secret_value(secret_id=config("STRIPE_SECRET_ID")),
"idempotency_key": f"{parsed_input.idempotency_key}-renewal"
),
)