Как обрабатывать исключения с полосой - PullRequest
0 голосов
/ 26 мая 2020

Я пытаюсь интегрировать полосу в свой проект django, поэтому я пытаюсь создать PaymentIntent, и если сетевое соединение с полосой не удалось, я попытаюсь сделать вот так:

try:
    intent = stripe.PaymentIntent.create(
        amount=100,
        currency='usd'
    )
    return JsonResponse({
         'clientSecret': intent['client_secret']
    })
except stripe.error.CardError as e:
    pass
except stripe.error.RateLimitError as e:
    pass
except stripe.error.InvalidRequestError as e:
    pass
except stripe.error.AuthenticationError as e:
    pass
except stripe.error.APIConnectionError as e:
    try:
        intent_cancel = stripe.PaymentIntent.cancel(
            intent['id']
        )
    except Exception as e:
        # (If an exception is raised this means that the PaymentIntent was not created, I am right ?)
        # I redirect the user to the payment page and inform him
        # that a network problem has occurred and ask him to repeat his request
        pass
except stripe.error.StripeError as e:
    pass
except Exception as e:
    pass

Мои вопросы:

  • 1 Правильный ли мой способ обработки исключения?
  • 2 Могу ли я применить этот logi c к другому исключению?
  • 3 В документации говорится, что мы должны использовать idempotency_key, чтобы повторить неудачные запросы, как я могу это реализовать? и что делать, если я снова попытаюсь выполнить неудавшийся запрос, и он снова не удастся, что мне делать?

1 Ответ

0 голосов
/ 26 мая 2020

У вас есть 2 запроса Stripe API в одном блоке try. Это означает, что если один успешно, а другой не работает из-за ошибки подключения, вы будете рассматривать оба как неудачные. Лучше всего иметь только одну операцию API на блок try / catch.

У вас также есть запрос на отмену жестко запрограммированного PaymentIntent после того, как ваш код вернет объект JSON. Поскольку возврат не является условным, это, скорее всего, мертвый код.

Отмена logi c в случае ошибки соединения здесь не имеет смысла. Вы должны использовать этот путь только в том случае, если соединение не удалось и намерение не было создано, поэтому попытка отменить несуществующий PaymentIntent, скорее всего, приведет к еще одной ошибке. Вместо этого вы должны ввести здесь retry logi c. К счастью, в stripe- python есть встроенная функция, специально предназначенная для сетевых ошибок: https://github.com/stripe/stripe-python#configuring -automati c -retries

После того, как все попытки завершились неудачно, вам, вероятно, следует зарегистрировать это где-нибудь и проинформируйте пользователя о том, что возникла проблема и что он должен попробовать еще раз позже.

Что касается ключей идемпотентности, в документации Stripe есть учебник по этому поводу: https://stripe.com/docs/api/idempotent_requests?lang=python

...