Я пытаюсь заставить свое приложение принять и прочитать веб-зацепы Stripe, но у меня несколько непредсказуемая проблема 404. У меня есть файл PHP, который обрабатывает запросы webhook от Stripe. Это определенно существует. Я могу перейти к нему, и я обычно получаю 200 успешных ответов в подробностях веб-крючка, когда единственный код в файле:
$input = @file_get_contents("php://input");
$event_json = json_decode($input);
http_response_code(200);
Однако, когда я добавляю больше кода (а код, который я добавляю, слишком сложен, чтобы публиковать здесь), я начинаю получать 404. Я убедился, что дополнительный код не генерирует фатальных ошибок или даже предупреждений / уведомлений в журнале ошибок.
Кроме того, с тем же кодом, когда я отправляю несколько тестовых веб-заданий из https://dashboard.stripe.com/account/webhooks около половины из них скажут «Тестовый веб-крючок успешно отправлен», а около половины — «Ошибка тестирования веб-крюка: 404.»
Кто-нибудь знает, что может вызвать эти 404? Проблемы с памятью? Неотмеченные ошибки (не вижу, как это могло произойти, но кто знает)? Ошибки DNS? Полоска, чтобы свести меня с ума?
Благодарю.
Если вы можете сохранить настройки своей учетной записи с помощью веб-крючка там, вы можете запустить тестовый платеж, перейдите к https://dashboard.stripe.com/events, откройте событие и зайдите в подробности веб-крючка внизу. Это позволит вам увидеть ответ, который ваш сервер отправил обратно в Stripe (если есть).
Если в этом нет ничего полезного, я постараюсь урезать ваш полный код до тех пор, пока у вас не появится как можно меньший пример, который по-прежнему будет 404. Это может облегчить поиск проблемы, а если нет, вы можете опубликовать этот код.
Вот код из моего рабочего webhook. Мой всегда дает 200 при попадании Stripe. Надеюсь, что это полезно:
include_once('path/to/Stripe/Stripe.php');
// Set your secret key: remember to change this to your live secret key in production
if($_SERVER['HTTP_HOST'] == 'example.com')
{
Stripe::setApiKey("sk_live_my_key");
}
else
{
Stripe::setApiKey("sk_test_my_key");
}
// Retrieve the request's body and parse it as JSON
$body = @file_get_contents('php://input');
$event_json = json_decode($body, true);
if(!empty($event_json))
{
//do stuff...
echo '<pre>'; print_r($event_json); die();
}
die('success');
Стоит отметить, что у меня есть кубик в конце.
Оказывается, это была ошибка DNS. У меня есть среда распределенного хостинга, и 2 из 3 IP-адресов возвращали 404. Однако я был заблокирован локально на 1 рабочий IP-адрес. Поменял мои записи A на один рабочий IP (так как рассматриваемый сайт является сайтом разработки, а не живым сайтом и не нуждается в множественных запасных версиях), и это решило проблему. Глупая ошибка.