Тест Stripe webhook возвращает ошибку http 500 - PullRequest
1 голос
/ 21 апреля 2020

Вот мой код:

<?php

$payload = @file_get_contents('php://input');
$event = null;

try {
    $event = \Stripe\Event::constructFrom(
        json_decode($payload, true)
    );
} catch(\UnexpectedValueException $e) {
    // Invalid payload
    http_response_code(400);
    exit();
}

// Handle the event
switch ($event->type) {
    case 'payment_intent.succeeded':
        $paymentIntent = $event->data->object;
        $paymentintentid = $paymentIntent['id'];
        break;

    default:
        // Unexpected event type
        http_response_code(400);
        exit();
}
http_response_code(200);
?>

Это в основном пример кода здесь: https://stripe.com/docs/webhooks/build

Я пытаюсь захватить PaymentIntent ID через $ paymentIntent ['id'];

Но когда я запускаю тестовый веб-крючок, Stripe сообщает, что возвращает ошибку Http 500.

Я не настолько продвинут в PHP, как их сценарий нуждается во мне, поэтому я не уверен, что мне не хватает каких-либо данных или кода. Похоже, мне может понадобиться включить какой-нибудь файл, так как Stripe хочет, чтобы я использовал их собственные классы?

Вот документация PaymentIntent: https://stripe.com/docs/api/payment_intents/create

1 Ответ

1 голос
/ 21 апреля 2020

Использовали ли вы composer для добавления зависимостей Stripe? Если да, включаете ли вы файл автозагрузки из composer? Классы Stripe должны быть загружены или включены каким-либо образом. Это часть ошибки 500.

Полный рабочий код из моего теста:

<?php

require '../vendor/autoload.php'; \\ replace with the actual location of your autoload file

$payload = @file_get_contents('php://input');
$event = null;

try {
    $event = \Stripe\Event::constructFrom(
        json_decode($payload, true)
    );
} catch(\UnexpectedValueException $e) {
    // Invalid payload
    http_response_code(400);
    exit();
}

// Handle the event
switch ($event->type) {
    case 'payment_intent.succeeded':
        $paymentIntent = $event->data->object;
        $paymentintentid = $paymentIntent['id']; \\ $paymentIntent->id works as well. 
        echo $paymentintentid;
        break;

    default:
        // Unexpected event type
        http_response_code(400);
        exit();
}
http_response_code(200);
?>

Если вы хотите сделать еще один шаг, я рекомендую отправить ответ обратно в Stripe, чтобы вы могли смотрите их при тестировании в пользовательском интерфейсе.

Пример ответа:

// Handle the event
switch ($event->type) {
    case 'payment_intent.succeeded':
        $paymentIntent = $event->data->object;

        // Store the payment ID from the webhook
        $paymentintentid = $paymentIntent['id'];

        // Set array for successful response
        $response = array(
            'http_code' => 200,
            'payment_id' => $paymentintentid,
            'response' => 'webhook caught successfully'
        );

        // Set status code and echo back response
        http_response_code(200);
        echo json_encode($response, true);

        break;

    default:
        // Unexpected event type, set array for this case
        $response = array(
            'http_code' => 400,
            'response' => 'Unexpected event type'
        );

        // Set status code and echo back response
        http_response_code(400);
        echo json_encode($response, true);
        exit();
}

Пример тестирования, отображаемый в пользовательском интерфейсе с полосой для ответа 200:

Пример ответа с полосой 200 в пользовательском интерфейсе Stripe, показывающем ответ от моего сервера

Пример тестирования, показанный в пользовательском интерфейсе Stripe для ответа 400:

Пример ответа Stripe 400 в пользовательском интерфейсе Stripe, показывающий ответ от моего сервера

Я тоже новичок, дайте мне знать, если это помогло:).

...