Webhooks тестируют несоответствия во время отладки с помощью Stripe CLI и триггеров событий - PullRequest
0 голосов
/ 24 апреля 2020

Проблема в том, что если я запускаю одно и то же событие несколько раз, я получаю разные результаты.

У меня три терминала открыто:

  1. Прослушивание с использованием:
   listen --forward-to localhost:8888/my-endpoint.php
Запуск с использованием
    stripe trigger + event

(например, полосовой триггер payment_intent.succeeded)

Ведение журнала ошибки от localhost

Устранение неполадок

  • Я могу активировать, выполнив проверку Stripe тоже. Оформление заказа работает, но результаты в терминале аналогичны описанным.

  • Я также запустил триггер, пока xdebug прослушивает и может видеть шаги кода в ожидаемом порядке (ie присваивает телу простые текстовые ответы и вызывает коды 200/400).

Важные примечания

На снимке экрана ниже показан журнал (слева), прослушивание (вверху справа) и запуск события (внизу справа).

(1-я и 4-я попытки работают. 2-я и 3-я не работают. Они не включают журналы или:

2020-04-24 16:17:16   --> payment_intent.succeeded [evt_1GbMikFOnngxtrI1EfZyfaNo]
2020-04-24 16:17:16  <--  [200] POST http://localhost:8888/scripts/stripe/webhook-endpoint.php [evt_1GbMikFOnngxtrI1EfZyfaNo]

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

И журнал обновляется только один раз, при первом запуске.

Другая забавная вещь заключается в том, что иногда ответы появляются в Полоска приборной панели, иногда нет.

Есть идеи?

screenshots of 3 terminals

Код Webhooks (ключи подписи и API установлены выше, но спрятано здесь)

$payload = @file_get_contents('php://input'); //get json POST data stripe sends
$sig_header = $_SERVER['HTTP_STRIPE_SIGNATURE'];
$event = null;

try {
    $event = \Stripe\Webhook::constructEvent(
      $payload, $sig_header, $endpoint_secret, //get data
    );
  } catch(\UnexpectedValueException $e) {
    // Invalid payload
    printf("Invalid payload");
    http_response_code(400);
    exit();
  } catch(\Stripe\Exception\SignatureVerificationException $e) {
    // Invalid signature
    printf("Invalid signature.");
    http_response_code(400);
    exit();
  }
// Handle the event(s)
switch ($event->type) {
    case 'checkout.session.completed': 
        $session = $event->data->object;
        printf("Checkout Session Completed");
        http_response_code(200); 
        break;
    case 'payment_intent.succeeded': 
        $paymentIntent = $event->data->object; 
        $intent = $event->data->object;
        printf("Payment Intent Succeeded: %s", $intent->id);
        http_response_code(200);
        error_log( json_encode( $intent, JSON_PRETTY_PRINT ) );
        break;
    case 'payment_intent.payment_failed': 
        $paymentMethod = $event->data->object;
        $intent = $event->data->object;
        $error_message = $intent->last_payment_error ? $intent->last_payment_error->message : "";
        printf("Failed: %s, %s", $intent->id, $error_message);
        http_response_code(200);
        break;
    case 'payment_intent.processing':
        printf("Payment Intent Processing: %s", $intent->id);
        http_response_code(200);
        break;
    case 'payment_intent.canceled': 
        printf("Payment Intent canceled: %s", $intent->id);
        http_response_code(200);
        break;
    default:
        http_response_code(400);
        exit();
}

http_response_code(200);
return false;

1 Ответ

0 голосов
/ 24 апреля 2020

Надеюсь, я правильно понял, мои извинения, если я не здесь.

Я думаю, что проблема здесь в том, что использование stripe trigger payment_intent.succeeded в конечном итоге создает 3 события:

  • payment_intent.created
  • charge.succeeded
  • payment_intent.succeeded

Кажется, что оператор case не имеет предложений для первых двух событий типы по умолчанию 400.

В зависимости от того, что вы хотели бы сделать, вы можете расширить оператор case для обработки этих событий. Также, возможно, это относится к вашим выводам, но у Событий нет гарантированного порядка, это нормальное поведение и то, что вы должны учитывать при построении вашей системы [0]. Надеюсь, это поможет!

[0] https://stripe.com/docs/webhooks/best-practices#event -заказ

...