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>

Reply via email to