Настройка запроса файлов cookie в Redirect, сохраненных в файле cURL CookieJar

Я работаю над проектом, в котором я использую API для взаимодействия с интернет-магазином на отдельном сайте. Я могу добавлять предметы в корзину через API и использовать cURLS CookieJar для сохранения состояния. Чтобы оформить заказ, я хочу просто указать ссылку на фактический процесс оформления заказа на главном сайте электронной коммерции. Мне нужно, чтобы я мог получить куки, хранящиеся в CookieJar, для отправки вместе с запросом на перенаправление.

Я попытался использовать cURL, чтобы получить cookie и затем выполнить перенаправление, но я неправильно понял, как он работает. Вместо перенаправления браузера он выдает новый запрос cURL, основанный на перенаправлении 302.

$curlopt = array(
    CURLOPT_COOKIEJAR => xxx, // this is the path to the cookie file
    CURLOPT_COOKIEFILE => xxx, // this is the path to the cookie file
    CURLOPT_FOLLOWLOCATION => true,
    CURLOPT_AUTOREFERER => true,
    CURLOPT_URL => 'http://mydomain.com/redirect_to_ecommerce_checkout.php'
);

$ch = curl_init(); // run curl
curl_setopt_array($ch, $curlopt);
curl_exec($ch);
curl_close($ch);

Похоже, это отправляет правильные куки на страницу электронной коммерции, проблема в том, что браузер не перенаправляет, а выводит HTML-код с основного сайта электронной коммерции в моем домене.

Как я могу установить файлы cookie запроса и фактически выполнить перенаправление?

Заранее спасибо.

1 ответ

Я думаю, что вам просто нужно сказать CURL дать вам заголовки, а не следовать перенаправлению. Затем вы можете проанализировать заголовок "Location:". Что-то вроде этого:

$curlopt = array(
    CURLOPT_COOKIEJAR => xxx, // this is the path to the cookie file
    CURLOPT_COOKIEFILE => xxx, // this is the path to the cookie file
    CURLOPT_FOLLOWLOCATION => false, // <--- change to false so curl does not follow redirect
    CURLOPT_AUTOREFERER => true,
    CURLOPT_URL => 'http://mydomain.com/redirect_to_ecommerce_checkout.php',
    CURLOPT_HEADER => true,
    CURLOPT_RETURNTRANSFER => true // Return transfer string instead of outputting directly
);

$ch = curl_init($url);
curl_setopt_array($ch, $curlopt);
$response = curl_exec($ch); // save response to a variable
curl_close($ch);

// try to find Location header in $response
preg_match_all('/^Location:(.*)$/mi', $response, $matches);

if (!empty($matches[1])) {
    header("Location: " . trim($matches[1][0]) );
    exit;
}
else {
    echo 'No redirect found';
}

Примечание. Я установил CURLOPT_FOLLOWLOCATION => false, CURLOPT_HEADER => true и CURLOPT_RETURNTRANSFER => true, а затем проверил ответ curl_exec(), который я сохранил в $response.

Вы также можете попробовать:

header("Location: " . curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);
Другие вопросы по тегам