веб-сервисы — Можно ли отправлять POST-данные с помощью перенаправления PHP?

Обновление: это не дубликат Как отправить запрос POST с помощью PHP?. Решения там не работают для меня, они просто выводят результат запроса, я не хочу этого делать, я хочу отправить пользователя на внешний сайт, это безопасный сайт для обработки платежей по кредитным картам.

Обновление 2: я добавил диаграмму ниже, чтобы попытаться четко объяснить, что я пытаюсь сделать

Вот что я пытаюсь сделать:

  1. HTML-форма передается в PHP-скрипт

  2. PHP-скрипт выполняет некоторую обработку данных, а затем отправляет данные через POST-запрос на внешний веб-сайт.

  3. Я не хочу получать результат запроса POST в моем PHP-скрипте, вместо этого я просто хочу отправить пользователя на внешний сайт, где они увидят результат POST

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

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

Один из способов сделать это — вывести вывод новой формы в виде скрытых полей вместе с javascript для автоматической отправки формы, но должен быть более простой и надежный способ сделать это, не полагаясь на javascript. Может быть, манипулируя заголовками, или, может быть, уже есть функция php, которая просто отправляет запрос на публикацию и перенаправляет результат?

Что я'm trying to do

7

Решение

Короче говоря: нет, использование PHP невозможно.

Один из способов сделать это — вывести новый вывод формы в виде скрытых полей вместе с javascript для автоматической отправки формы …

Это единственный способ сделать это.


Вопрос является возможной копией PHP Redirect с данными POST.


Как решение самоубийства, вы можете рассмотреть возможность использования HTTP 307 — Временное перенаправление.
От HTTP / 1.1 документация, связанная выше:

Если код состояния 307 получен в ответ на запрос, отличный от GET или HEAD, пользовательский агент НЕ ДОЛЖЕН автоматически перенаправлять запрос, если он не подтвержден пользователем, так как это может изменить условия, при которых был выдан запрос.

Мой жирный шрифт просто подчеркивает, что перенаправление без подтверждения пользователя на самом деле зависит от реализации протокола браузером.

Перенаправление может быть реализовано в сценарии PHP, который получает СООБЩЕНИЕ запрос следующим образом *:

header('HTTP/1.1 307 Temporary Redirect');
header('Location: <your page in an external site>');

Пример основного использования:

page1.html — страница, которая содержит форму

<html>
<body>
<form method="POST" action="page2.php">
<input name="variable1" />
<input name="variable2" />
<input type="submit" />
</form>
</body>
</html>

page2.php — страница, которая обрабатывает ваши данные POST перед перенаправлением

<?php

if (isset($_POST['variable1']) && isset($_POST['variable2'])) {

//do your processing stuff

header('HTTP/1.1 307 Temporary Redirect');
header('Location: page3.php');

exit;
} else
echo 'variable1 and variable2 are not set';

page3.php страница, на которую должны быть перенаправлены данные POST (т.е. внешний сайт)

<?php

if (isset($_POST['variable1']) && isset($_POST['variable2'])) {

foreach ($_POST as $key=>$val)
echo $key . ' = ' . $val . '<br>';

} else
echo 'variable1 and variable2 are not set';

* не пробуй это дома!

8

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

Мне кажется, что вы пытаетесь сделать переадресацию с одной страницы на другую, одновременно отправляя данные POST. Боюсь, что это невозможно с PHP.

Самый простой обходной путь, о котором я могу подумать, это использование cURL для (1) пересылки вашего $_POST данные на другой сервер, (2) получить результат от этого сервера, а затем (3) сделать простое перенаправление на другую страницу. Хотя требуется всего 3 HTTP-запроса (немного для такой простой задачи), он более или менее достигает того, чего вы пытаетесь достичь.


Позвольте мне разбить этот подход на три этапа, которые вы упомянули в своем вопросе:

За шаг 1, подойдет любая форма HTML, если она имеет атрибут «method» со значением «post». Если вы хотите отправить форму без использования JavaScript, просто убедитесь, что она имеет кнопку «Отправить». Это будет отправлять ваши данные на страницу, определенную в атрибуте «action» вашей формы при нажатии кнопки «Отправить»:

Пример HTML:

<form action="action_page.php" method="post">
First name:<br />
<input type="text" name="firstname" value="Mickey"><br />

Last name:<br />
<input type="text" name="lastname" value="Mouse" /><br /><br />

<input type="submit" value="Submit" />
</form>

За шаг 2, вам нужно будет создать страницу с именем, идентичным значению атрибута «action» вашей формы. В случае нашего примера это будет action_page.php, Здесь вы проверите, если $_POST содержит любые значения для полей формы, которые вы отправили. В нашем случае или в нашем примере вы могли бы примерно так:

if (isset($_POST['firstname']) && isset($_POST['lastname'])) {
// Do the stuff you want to do on your own server here!
} else {
// Do nothing here!
}

За шаг 3, вам нужно будет сделать второй запрос POST, используя $_POST данные, которые вы только что получили из вашей HTML-формы. Самый простой способ сделать это — использовать cURL. Затем вы перенаправляете своего пользователя на вторую страницу, в зависимости от вывода вашего второго запроса POST.

Чтобы улучшить читаемость примера кода, я поместил весь код, связанный с cURL-запросом, в функцию:

function forwardRequest($url, $data) {
$result = [
'status' => NULL,
'last_url' => NULL,
'response' => NULL
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
$result['response'] = curl_exec($ch);
$result['status'] = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$result['last_url'] = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);
curl_close ($ch);
return $result;
}

if (isset($_POST['firstname']) && isset($_POST['lastname'])) {
// Do the stuff you want to do on your own server here!

$result = forwardRequest("http://www.example.com/processdata.php", $_POST);

if ($result['status'] === 200) {
header('Location: http://www.example.com/ok.php');
} else {
header('Location: http://www.example.com/error.php');
}
} else {
header('Location: http://www.example.com/youshouldnotbehere.php');
}

Примечание 1:

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

В моем примере кода я использую Код состояния HTTP ответа, полученного на ваш запрос cURL. Это решение работает только тогда, когда сервер возвращает код состояния, который не равен 200, если на этом сервере что-то идет не так. Вам нужно будет выполнить несколько тестов, чтобы увидеть, достаточно ли этого подхода для вашего варианта использования.

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


Заметка 2 :

Вместо переадресации вашего пользователя после того, как ваш запрос cURL был обработан, вы можете просто захотеть показать текст ответа с сервера вашему пользователю. Если этот результат содержит много ненужного мусора, рассмотрите его с помощью DOMDocument::loadHTML или сторонняя библиотека (например, Вдохновители / html5-PHP или же PHPPowertools / DOM-запросы).

Вы также можете просто написать свой собственный текст ответа.

7

Вы можете опубликовать значения только во время отправки формы

action = "path/filename.php";

в этой форме вы можете опубликовать значения формы.

если вы хотите перенаправить файл в то время, когда вы можете передать значения через URL

header('Location: url/filename.php?param1=      ');

Попробуйте это для локальных значений файла, которые вы хотите опубликовать.

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

3

У меня есть одно решение для вас, которое будет работать либо в 99% случаев, либо в 100% случаев, в зависимости от того, как вы его реализуете. Все, что вам нужно сделать, это обработать форму с AJAX. Я знаю, что вы хотите использовать Javascript бесплатно, но это самый простой способ. Если вы используете библиотеку jQuery, документация и ответы на SO будут настолько просты, что вам не придется писать много кода. Просто измените некоторые. Вот концепция:

1) Страница загружается как обычно с действием форм, указывающим на сайт обработки платежей. Поскольку вы используете Javascript (jQuery) для отправки формы, вы бы заменили кнопки отправки html следующим образом:

<input type="button" value="Check Out" onclick="NameofAjaxFunctionHere();"

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

 $('#formIdHere').attr('action', 'yourPHPpageAndPathHere.php');

Этот код предназначен для jQuery, но он должен быть легко изменен на простой JavaScript, если вам нужно. Теперь также убедитесь, что ваш код AJAX не сбрасывает форму. Многие копии и прошлые коды делают это за вас.

3) (Необязательно) На этом этапе форма была отправлена ​​на вашу страницу PHP, и вы сделали с ней все, что вам нужно. Теперь у вас есть два варианта:

  • Не ждите ответа и просто переходите к номеру 4.
  • Дождитесь ответа и отреагируйте соответственно + измените данные, если это необходимо

Если вам нужно убедиться, что данные верны или вам нужно что-то изменить, сделайте это сейчас. Если данные форм не срабатывают, ваш процесс (например, измененные данные) отправляет обратно FALSE и переходит на номер 4. Если вам нужно что-то изменить, это простой процесс. Отправьте обратно все данные, которые необходимо обновить, в массиве и переберите его в том же коде AJAX, который запустил этот процесс. Используя Javascript, вы можете изменить значения форм.

[Code missing because I think you can figure this out if you need to do that. If not comment and when I have time I will post an example]

4) Поменяйте местами действие формы. Ваша обработка AJAX завершена. Традиционно он стирает форму и отображает сообщение. Если вы выберете опцию выше, которая отправляет FALSE, чтобы остановить отправку в случае, если были неверные данные, просто верните false из скрипта AJAX сейчас (возможно, покажите что-то до этого возврата, говоря, что форма не была отправлена).

 $('#formIdHere').attr('action', 'paymentUrlHere');

Теперь, когда URL-адрес платежа снова на месте и все данные были обновлены, если вам нужно пойти по этому пути, отправьте форму, как обычно (или будет). В jQuery это может быть так просто:

 $('#formIdHere').submit();

И я думаю, что это охватывает. На данный момент пользователь не в ваших руках и был отправлен на сайт обработки платежей с обычным POST. У вас даже была возможность изменить данные из формы, если это необходимо.

OH PS — Вот что я имел в виду на 99% и 100% пути в начале этого поста. 100% — это пример, который я привел тебе здесь. Никто не может отправить форму, не сделав ее сначала на своей собственной странице PHP. Решение 99% было бы, но обычный HTML-код на странице, например, так:

<input type="submit" ...>

Затем с помощью Javascript остановите действие отправки по умолчанию и выполните мои шаги 1-4. Таким образом, если кто-то отключает JavaScript (или находится на устройстве, которое его блокирует), форма по-прежнему отправляет платежному процессору по крайней мере. До вас, что вы хотите сделать.

3

Короткий ответ :

  • POST на внешний сервер
  • анализ ответа
  • не повторяй ничего
  • использовать заголовок (‘Location: url? param = res’);
  • выход ; // это важно

Я не хочу получать результат запроса POST в моем PHP-скрипте, вместо этого я просто хочу отправить пользователя на внешний сайт, где они увидят результат POST

Если вы отправляете запрос POST из сценария PHP, то ответ ВСЕГДА возвращается к тому же сценарию PHP. Я думаю, что вы хотите, чтобы НЕ отправить этот ответ обратно пользователю, а вместо этого перенаправить пользователя на другой URL. Для чего вы убедитесь, что вы делаете.

header('Location: url?param=res') ;
exit ;

и ничего не отправлять клиенту до вызова header ()

3

Это невозможно, поскольку страница загружена полностью, есть вероятность пустых данных с помощью запроса POST, вместо того, чтобы использовать это при создании сеансов, когда это необходимо, а после использования этого сеанса просто уничтожить сеанс.
И второе — использование CURL.

1

У вас есть отличный план в вашем описании. Почему вы просто не генерируете новый пост запросить 3 страницы с отредактированными данными на вашей странице 2 после форматирования? Вы можете протестировать свой новый запрос POST с расширением Chrome Почтальон

1

использование PHP невозможно.

Но вы можете использовать этот твик, в http://example.com/script.php Вы можете написать некоторые javascript автоматическая отправка кода с контрольной суммой. Например.

<body onload="document.frm1.submit()">
<form method="POST" action="https://gatewaysite.com" name="frm1">
<input name="checksum" value="yourchecksumvalue" />
<input name="variable2" />
</form>
</body>
1
По вопросам рекламы [email protected]