changeset b21f405ccacf in modules/account_payment_stripe:default
details:
https://hg.tryton.org/modules/account_payment_stripe?cmd=changeset&node=b21f405ccacf
description:
Add setup intent expire delay
issue11253
review390061002
diffstat:
CHANGELOG | 1 +
payment.py | 41 +++++++++++++++++++++++++++++------------
view/account_form.xml | 3 +++
3 files changed, 33 insertions(+), 12 deletions(-)
diffs (93 lines):
diff -r 6f92dc3a76b5 -r b21f405ccacf CHANGELOG
--- a/CHANGELOG Wed Mar 09 00:57:17 2022 +0100
+++ b/CHANGELOG Sun Mar 20 01:02:06 2022 +0100
@@ -1,3 +1,4 @@
+* Add setup intent expire delay
* Add support for Python 3.10
* Remove support for Python 3.6
diff -r 6f92dc3a76b5 -r b21f405ccacf payment.py
--- a/payment.py Wed Mar 09 00:57:17 2022 +0100
+++ b/payment.py Sun Mar 20 01:02:06 2022 +0100
@@ -1,5 +1,6 @@
# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
+import datetime as dt
import logging
import urllib.parse
import uuid
@@ -890,6 +891,9 @@
depends=['webhook_identifier'],
help="The Stripe's signing secret of the webhook.")
last_event = fields.Char("Last Event", readonly=True)
+ setup_intent_delay = fields.TimeDelta(
+ "Setup Intent Delay", required=True,
+ help="The delay before cancelling setup intent not succeeded.")
@classmethod
def __setup__(cls):
@@ -919,6 +923,10 @@
% url_part))
@classmethod
+ def default_setup_intent_delay(cls):
+ return dt.timedelta(days=30)
+
+ @classmethod
def fetch_events(cls):
"""Fetch last events of each account without webhook and process them
@@ -1631,21 +1639,30 @@
# Use clear cache after commit
customer = cls(customer.id)
setup_intent = customer.stripe_setup_intent
- if not setup_intent or setup_intent.status != 'succeeded':
+ if not setup_intent:
+ continue
+ if setup_intent.status not in {'succeeded', 'canceled'}:
+ delay = customer.stripe_account.setup_intent_delay
+ expiration = dt.datetime.now() - delay
+ if dt.datetime.fromtimstamp(setup_intent.created) < expiration:
+ stripe.SetupIntent.cancel(
+ customer.stripe_customer_id,
+ api_key=customer.stripe_account.secret_key)
continue
customer.lock()
try:
- if customer.stripe_customer_id:
- stripe.PaymentMethod.attach(
- setup_intent.payment_method,
- customer=customer.stripe_customer_id,
- api_key=customer.stripe_account.secret_key)
- else:
- cu = stripe.Customer.create(
- api_key=customer.stripe_account.secret_key,
- payment_method=setup_intent.payment_method,
- **customer._customer_parameters())
- customer.stripe_customer_id = cu.id
+ if setup_intent.status == 'succeeded':
+ if customer.stripe_customer_id:
+ stripe.PaymentMethod.attach(
+ setup_intent.payment_method,
+ customer=customer.stripe_customer_id,
+ api_key=customer.stripe_account.secret_key)
+ else:
+ cu = stripe.Customer.create(
+ api_key=customer.stripe_account.secret_key,
+ payment_method=setup_intent.payment_method,
+ **customer._customer_parameters())
+ customer.stripe_customer_id = cu.id
except (stripe.error.RateLimitError,
stripe.error.APIConnectionError) as e:
logger.warning(str(e))
diff -r 6f92dc3a76b5 -r b21f405ccacf view/account_form.xml
--- a/view/account_form.xml Wed Mar 09 00:57:17 2022 +0100
+++ b/view/account_form.xml Sun Mar 20 01:02:06 2022 +0100
@@ -13,4 +13,7 @@
<button name="new_identifier"/>
<label name="webhook_signing_secret"/>
<field name="webhook_signing_secret" colspan="3"/>
+
+ <label name="setup_intent_delay"/>
+ <field name="setup_intent_delay" colspan="3"/>
</form>