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



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



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



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





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



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



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



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



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



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



То, что я пытаюсь сделать.

1235   9  

9 ответов:

Короче говоря: нет, это невозможно с помощью PHP.

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

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


Речь идет о возможном дублированииPHP редиректа с POST data .


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

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

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

Редирект может быть реализован в PHP скрипте, который получает запрос POST следующим образом*:

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

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

Страница 1.html - страница, содержащая форму

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

Страница 2.php - страница, которая обрабатывает данные вашего поста перед редиректом

<?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';

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

<?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';

&ast; Не пытайтесь сделать это дома!

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

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

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

Пример 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_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 или сторонней библиотеки (например Masterminds / html5-php или PHPPowertools/DOM-запрос).

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

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

action = "path/filename.php";

В этой форме можно разместить значения формы.

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

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

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

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

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

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();

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

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

<input type="submit" ...>

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

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

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

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

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

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

И не посылать ничего клиенту до вызова функции header ()

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

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

Это невозможно с помощью 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>

Если вы являетесь владельцем обоих веб-сайтов, то вы можете просто включить сайты в каждый из них .файл htacess, который останется зашифрованным.

Квалификация для этого-SSL CA на обоих сайтах.

В вашем .htaccess, вы делаете это с помощью: это добавлено в htaccess сайта#1:

     RewriteCond %{HTTP_REFERER} !^https://www.site2.com/.*$      [NC]
     RewriteCond %{HTTP_REFERER} !^https://www.site2.com$      [NC]

Это добавлено в htaccess сайта#2:

     RewriteCond %{HTTP_REFERER} !^https://www.site1.com/.*$      [NC]
     RewriteCond %{HTTP_REFERER} !^https://www.site1.com$      [NC]

Затем вы можете использовать стандартную html-форму на сайте#1, например:

       <form action="https://wwww.site2.com" method="POST">

Comments

    Ничего не найдено.