Хук действия ‘parse_request’ запускается дважды для одного запроса GET к WordPress

У меня проблема с получением запроса GET в WordPress.

Я пишу платежный плагин для (среди прочего) 2Checkout размещенной проверки. Как только клиент отправляет форму, он перенаправляется на 2Checkout, где он может выполнить запрос на оплату. При успешной оплате клиент возвращается на мой сайт WordPress с деталями платежа в качестве параметров GET (http://example.org/success/?key1=value1&key2 = значение2 ...).

Мой плагин wordpress подключается к перехватчику parse_request, чтобы перехватить этот запрос, проверить, присутствует ли определенный ключ, чтобы увидеть, является ли он ответом 2Checkout, а затем проверить и сохранить запрос в таблице.

Кроме того, в 2Checkout есть нечто, называемое INS — Instant Merchant Notification. По сути, это отдельные сообщения POST-запроса для платежа, которые отправляются в фоновом режиме — я также настроил их и указал их на моем WordPress-сайте, где они перехватываются с помощью того же перехвата parse_request, а также проверяются и сохраняются в том же Таблица.

Когда я проверяю платеж, я получаю прямой запрос GET и запросы INS, как и предполагалось, и сохраняю их в таблице. Однако запрос GET всегда сохраняется дважды, так как функция для обработки запроса вызывается дважды для запроса GET. Однако это верно только для запроса GET — запросы INS POST появляются только один раз и обрабатываются соответствующим образом.

Единственное, что отличается между ними в том, что запрос GET фактически перенаправляет на страницу, где параметры GET используются для отображения пользовательского сообщения с благодарностью. POST-запрос обрабатывается в фоновом режиме (не для пользователя).

Я уже проверил с помощью 2Checkout и протестировал отправку перенаправления на requestb.in, а 2Checkout отправляет запрос GET только один раз. Тем не менее, мой плагин как-то обрабатывает его дважды.

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

Поскольку я не настолько опытен в «потоке» wordpress, чтобы понять это, и не смог найти ответ на этот вопрос нигде, используя переполнение стека или Google, я ищу любую помощь, которую вы можете предоставить. Кроме того, если есть лучший способ сделать это, чем подключиться к parse_request, любая информация приветствуется.

Пример кода (упрощенный, чтобы показать принцип):

class MyController {

public function __construct() {
$this->register_hooks();
}

private function register_hooks() {
add_action('parse_request', array($this, 'handle_request'));
}

public function handle_request( $wp ) {
if( !isset($_REQUEST['2Checkout_variable'] ) {
return;
}
$request_handler = new MyPluginRequestHandler($_REQUEST);
$request_handler->handle_request();
}
}

0

Решение

Таким образом, после некоторой дальнейшей отладки с хостинг-провайдером, причина была быстро определена (и это не было проблемой WordPress как таковой):

В обратном URL-адресе, заданном в учетной записи 2Checkout, отсутствует завершающий символ «/», в результате чего сервер добавляет его при поступлении запроса, а затем повторно запрашивает страницу с завершающим слешем — отсюда и 2 запроса GET.

Оставьте это здесь на случай, если кто-нибудь еще столкнется с этой проблемой.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector