From 44e0bd5e47f18b64f81562bfe91e08855878d285 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Thu, 5 Dec 2019 21:32:58 +0100 Subject: [PATCH] Retry later on some StripeError depending of the code The code lock_timeout and token_in_use must be retried as it is an unexpected behavior from Stripe service. Also some calls did not catch APIConnectionError for retry. issue8871 review270611002 --- payment.py | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/payment.py b/payment.py index 8cfc0a5b85..15d763442b 100644 --- a/payment.py +++ b/payment.py @@ -31,6 +31,8 @@ __all__ = ['Journal', 'Group', 'Payment', 'Account', 'Customer', 'Checkout', 'CheckoutPage'] logger = logging.getLogger(__name__) +RETRY_CODES = {'lock_timeout', 'token_in_use'} + class Journal(metaclass=PoolMeta): __name__ = 'account.payment.journal' @@ -587,6 +589,9 @@ class Payment(CheckoutMixin, metaclass=PoolMeta): logger.warning(str(e)) continue except stripe.error.StripeError as e: + if e.code in RETRY_CODES: + logger.warning(str(e)) + continue payment.stripe_error_message = str(e) if isinstance(e, stripe.error.CardError): payment.stripe_error_code = e.code @@ -688,6 +693,9 @@ class Payment(CheckoutMixin, metaclass=PoolMeta): logger.warning(str(e)) continue except stripe.error.StripeError as e: + if e.code in RETRY_CODES: + logger.warning(str(e)) + continue payment.stripe_error_message = str(e) payment.save() cls.fail([payment]) @@ -1245,10 +1253,14 @@ class Customer(CheckoutMixin, DeactivableMixin, ModelSQL, ModelView): description=customer.rec_name, email=customer.party.email, source=customer.stripe_token) - except stripe.error.RateLimitError: - logger.warning("Rate limit error") + except (stripe.error.RateLimitError, + stripe.error.APIConnectionError) as e: + logger.warning(str(e)) continue except stripe.error.StripeError as e: + if e.code in RETRY_CODES: + logger.warning(str(e)) + continue customer.stripe_error_message = str(e) if isinstance(e, stripe.error.CardError): customer.stripe_error_code = e.code @@ -1286,8 +1298,9 @@ class Customer(CheckoutMixin, DeactivableMixin, ModelSQL, ModelView): api_key=customer.stripe_account.secret_key, id=customer.stripe_customer_id) cu.delete() - except stripe.error.RateLimitError: - logger.warning("Rate limit error") + except (stripe.error.RateLimitError, + stripe.error.APIConnectionError) as e: + logger.warning(str(e)) continue except Exception: logger.error( @@ -1426,10 +1439,14 @@ class Customer(CheckoutMixin, DeactivableMixin, ModelSQL, ModelView): email=customer.party.email, payment_method=setup_intent.payment_method) customer.stripe_customer_id = cu.id - except stripe.error.RateLimitError: - logger.warning("Rate limit error") + except (stripe.error.RateLimitError, + stripe.error.APIConnectionError) as e: + logger.warning(str(e)) continue except stripe.error.StripeError as e: + if e.code in RETRY_CODES: + logger.warning(str(e)) + continue customer.stripe_error_message = str(e) except Exception: logger.error(