Я хотел бы отменить запрос cURL. Запрос должен быть отменен, когда пользователь покидает страницу.
Объяснение ситуации: мы отправляем запрос cURL на мобильный платежный терминал, чтобы начать новый платеж. Запрос все еще находится на рассмотрении, так как мы ожидаем, что клиент введет пин-код. Когда пин-код введен, на запрос будет дан ответ с успехом / неудачей. Мы хотели бы отменить запрос от сервера к платежному терминалу, когда, например, клиент хочет заплатить наличными.
Мы пробовали разные подходы, например connection_aborted
& ignore_user_abort
но ничто не исправит работу.
$dataString = json_encode($data);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $dataString);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json',
'Content-Length: ' . strlen($dataString)
));
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_SSLCERT, certificateRoot.'/test.crt.pem');
curl_setopt($ch, CURLOPT_SSLKEY, certificateRoot.'/test.key.pem');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$result = curl_exec($ch);
Вот мое предложение, если вам действительно нужно это сделать. Я уверен, что вы подходите к этой интеграции неправильно, и я искренне рекомендую вам перечитать предоставленную вам документацию.
Что вы МОЖЕТЕ сделать:
Вместо использования привязок cURL в PHP вы можете использовать вызов exec для вызова двоичного файла curl, взять pid и сохранить его в сеансе.
$json_body = escapeshellarg(json_encode($data));
$pid = shell_exec("(curl https://dodgy-payment-vendor.com/api/foobar -XPOST -d $json_body > /dev/null 2>/dev/null) & echo \$!");
Затем, когда пользователь отменяет, вы просто убиваете процесс.
posix_kill($pid, 9)
(Если у вас нет расширения posix, тогда, возможно, просто используйте другой shell_exec с соответствующей командой kill под вашей конкретной ОС … Да, и echo $! Не будет работать для получения PID под Windows)
Но я действительно рекомендую вам переосмыслить то, что вы делаете. Многие плохие вещи могут возникнуть из-за использования системных вызовов, когда они не совсем уместны, поэтому будьте уверены, что вы сериализуете, очищаете и экранируете любые данные, которые будете отправлять должным образом, если вы пойдете по этому пути!
Других решений пока нет …