Чередование, множественные запросы с использованием ключей идемпотентности возвращают ошибки

Нужна помощь с ответом на ошибку Stripe. Кажется, что все работает в соответствии с журналами панели управления полосами при создании клиента и последующей регистрации его в подписке, что приводит к генерации начислений в случае, если есть несколько запросов, сделанных с использованием ключей идемпотентности. Однако в этом случае я получаю этот полоса ответа об ошибке (захват исключения $error6), который открывается как страница (charge.php), на которой выполняется код, вместо отправки на страницу успеха.

Charge.php

\Stripe\Stripe::setApiKey('sk_live_xxxxxxxxxxx');

$POST = filter_var_array($_POST, FILTER_SANITIZE_STRING);

$email = $POST['email'];
$token = $POST['stripeToken'];
$membership_type = $POST['membership_type'];
$user_id = $POST['user_id'];
$success = 0;

try {
// Create customer in Stripe
$customer = \Stripe\Customer::create([
  "email" => $email,
  "source" => $token,
],[
  "idempotency_key" => $_SESSION['sid2'],
]);
$success = 1;
} catch(Stripe_CardError $e) {
  $error1 = $e->getMessage();
} catch (Stripe_InvalidRequestError $e) {
  // Invalid parameters were supplied to Stripe's API
  $error2 = $e->getMessage();
} catch (Stripe_AuthenticationError $e) {
  // Authentication with Stripe's API failed
  $error3 = $e->getMessage();
} catch (Stripe_ApiConnectionError $e) {
  // Network communication with Stripe failed
  $error4 = $e->getMessage();
} catch (Stripe_Error $e) {
  // Display a very generic error to the user, and maybe send
  // yourself an email
  $error5 = $e->getMessage();
} catch (Exception $e) {
  // Something else happened, completely unrelated to Stripe
  $error6 = $e->getMessage();
}

if ($success!=1)
{
    $_SESSION['error1'] = $error1;
    $_SESSION['error2'] = $error2;
    $_SESSION['error3'] = $error3;
    $_SESSION['error4'] = $error4;
    $_SESSION['error5'] = $error5;
    $_SESSION['error6'] = $error6;
    print_r($_SESSION);
}

// Add Customer to a Subscription in Stripe
$subscription = \Stripe\Subscription::create([
    'customer' => $customer->id,
    'items' => [['plan' => $membership_type]]
  ],[
    "idempotency_key" => $_SESSION['sid'],
]); 
//adding all relevent info into data base...

//send user to success page
header('Location: ../success.php?id='.$user_id.'&product='.$subscription->plan->nickname);

Может ли это быть связано с тем, что каждый раз параметр Stripe JS $token меняется? это нормально или я что-то не так делаю? (Я получил аналогичную ошибку при запуске идемпотентности только при подписке на клиента, но затем полоса создает несколько клиентов с одним и тем же адресом электронной почты и платежными картами, но с другим идентификатором клиента->) Может ли кто-нибудь предложить, как я могу решить эту страницу с ошибкой?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
1 047
2

Ответы 2

Could this be because each time the Stripe JS $token parameter changes?

Да, я подозреваю, что здесь происходит повторное использование $_SESSION['sid2'] для двух отдельных запросов с разными параметрами source для создания клиента. И эта ошибка в ответ - ожидаемое поведение!

Вы должны увидеть это в журналах панели мониторинга: Если предположить, что это запрос в тестовом режиме, https://dashboard.stripe.com/test/logs/iar_IgylJRGpbLyVb6 должен сообщить вам, где изначально использовался тот же самый ключ.

Верно, я вижу в логах исходную ссылку на запрос. Как бы это преодолеть? Я не могу сохранить исходный параметр, который Stripe генерирует каждый раз, когда вы отправляете запрос. Есть ли другой способ предотвратить создание нескольких клиентов с полосой?

Emile_Kuper 06.02.2019 02:18

Привет, Эмиль, когда пользователь нажимает кнопку «Оплатить» на вашей веб-странице, вы отключаете ее и предотвращаете многократное нажатие. Вы должны повторно активировать кнопку только в том случае, если вы возвращаете ошибку при создании клиента или создании платежа.

hmunoz 06.02.2019 18:11

@hmunoz Отключение кнопки ничего не делает против обновлений или других репостов данных формы.

Altimus Prime 29.09.2020 03:26

лучший вариант, который я мог найти, - отключить кнопку после прослушивателя событий Stripe JS.

var form = document.getElementById('payment-form');
form.addEventListener('submit', function(event) {
  event.preventDefault();

$('.button').attr("disabled", true);
stripe.createToken(card).then(function(result) {...........

Другие вопросы по теме