Я провел некоторое исследование по этой теме, и есть некоторые эксперты, которые заявили, что это невозможно , поэтому я хотел бы попросить альтернативное решение.
Моя ситуация:
Страница A: [checkout.php] Клиент заполняет свои платежные реквизиты.
Страница B: [process.php] Создайте номер счета и сохраните сведения о клиенте в базе данных.
Страница C: [thirdparty.com] Третий платежный шлюз (ТОЛЬКО ПРИНИМАЕТ ПОЧТОВЫЕ ДАННЫЕ).
Клиент заполняет свои данные и настраивает свою тележку на странице A, затем POST на страницу B. Внутри process.php хранит данные POSTed внутри базы данных и генерирует номер счета-фактуры. После этого отправьте данные клиента и номер счета-фактуры на платежный шлюз третьей стороны. Проблема заключается в выполнении POST на стр. B. cURL может отправлять данные на страницу C, но проблема заключается в том, что страница не перенаправляется на страницу C. Клиент должен заполнить данные кредитной карты на стр. C.
Третий платежный шлюз предоставил нам образец API, образец – POST номер счета вместе с деталями клиента. Мы не хотим, чтобы система генерировала избыток нежелательных номеров счетов.
Есть ли решение для этого? Наше текущее решение заключается в том, чтобы клиент заполнил детали на странице A, а затем на странице B мы создаем другую страницу, на которой показаны все детали клиента, где пользователь может нажать кнопку CONFIRM на POST на страницу C.
Наша цель состоит в том, чтобы клиенты могли только щелкнуть один раз.
Надеюсь, мой вопрос ясен 🙂
Создайте форму на странице B со всеми необходимыми данными и действием, установленными на странице C, и отправьте их с помощью JavaScript при загрузке страницы. Ваши данные будут отправлены на страницу C без особых хлопот для пользователя.
Это единственный способ сделать это. Переадресация – это HTTP-заголовок 303, который вы можете прочитать на http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html , но я приведу некоторые из них:
Ответ на запрос можно найти в другом URI и ДОЛЖНО быть извлечен с использованием метода GET на этом ресурсе. Этот метод существует прежде всего для того, чтобы позволить выходному скрипту, инициированному POST, перенаправлять агент пользователя на выбранный ресурс. Новый URI не является заменой ссылки на первоначально запрошенный ресурс. Ответ 303 НЕ ДОЛЖЕН кэшироваться, но ответ на второй (перенаправленный) запрос может быть кэшируемым.
Единственный способ добиться того, что вы делаете, – это промежуточная страница, которая отправляет пользователя на страницу C. Вот небольшой / простой фрагмент, который вы можете сделать:
<form id="myForm" action="Page_C.php" method="post"> <?php foreach ($_POST as $a => $b) { echo '<input type="hidden" name="'.htmlentities($a).'" value="'.htmlentities($b).'">'; } ?> </form> <script type="text/javascript"> document.getElementById('myForm').submit(); </script>
Вы также должны иметь простую форму «подтвердить» внутри тега noscript, чтобы убедиться, что пользователи без Javascript смогут использовать вашу службу.
/** * Redirect with POST data. * * @param string $url URL. * @param array $post_data POST data. Example: array('foo' => 'var', 'id' => 123) * @param array $headers Optional. Extra headers to send. */ public function redirect_post($url, array $data, array $headers = null) { $params = array( 'http' => array( 'method' => 'POST', 'content' => http_build_query($data) ) ); if (!is_null($headers)) { $params['http']['header'] = ''; foreach ($headers as $k => $v) { $params['http']['header'] .= "$k: $v\n"; } } $ctx = stream_context_create($params); $fp = @fopen($url, 'rb', false, $ctx); if ($fp) { echo @stream_get_contents($fp); die(); } else { // Error throw new Exception("Error loading '$url', $php_errormsg"); } }
У меня есть другое решение, которое делает это возможным. Это требует, чтобы клиент запускал Javascript (который, на мой взгляд, является справедливым требованием в наши дни).
Просто используйте запрос AJAX на странице A, чтобы перейти и сгенерировать номер счета и информацию о клиенте в фоновом режиме (предыдущая страница B), после того как запрос будет успешно возвращен с правильной информацией – просто заполните форму отправки на ваш платежный шлюз (Страница C).
Это приведет к достижению результата пользователя только нажатием одной кнопки и перехода к платежному шлюзу. Ниже приведен псевдокод
HTML:
<form id="paymentForm" method="post" action="https://example.com"> <input type="hidden" id="customInvoiceId" .... /> <input type="hidden" .... /> <input type="submit" id="submitButton" /> </form>
JS (используя jQuery для удобства, но тривиально, чтобы сделать чистый Javascript):
$('#submitButton').click(function(e) { e.preventDefault(); //This will prevent form from submitting //Do some stuff like build a list of things being purchased and customer details $.getJSON('setupOrder.php', {listOfProducts: products, customerDetails: details }, function(data) { if (!data.error) { $('#paymentForm #customInvoiceID').val(data.id); $('#paymentForm').submit(); //Send client to the payment processor } });
Вы можете позволить PHP делать POST, но тогда ваш php получит ответ со всеми возможными осложнениями. Я думаю, что самым простым было бы позволить пользователю выполнить POST.
Итак, как бы вы ни предложили, вы получите эту часть:
Пользователь заполняет детали на странице A, а затем на странице B мы создаем другую страницу, показывающую все детали клиента, нажмите кнопку CONFIRM, а затем POST на стр. C.
Но вы действительно можете сделать javascript submit на странице B, поэтому нет необходимости в клике. Сделайте это «перенаправлением» страницы с анимацией загрузки, и вы настроены.
Существует простой взлом, используйте $_SESSION
и создайте array
опубликованных значений, и как только вы перейдете к File_C.php
вы можете использовать его, после чего вы обрабатываете его после этого.
Я знаю, что это старый вопрос, но у меня есть еще одно альтернативное решение с jQuery:
var actionForm = $('<form>', {'action': 'nextpage.php', 'method': 'post'}).append($('<input>', {'name': 'action', 'value': 'delete', 'type': 'hidden'}), $('<input>', {'name': 'id', 'value': 'some_id', 'type': 'hidden'})); actionForm.submit();
В приведенном выше коде используется jQuery для создания тега формы, добавления скрытых полей в качестве полей сообщения и отправки его последним. Страница перейдет на целевую страницу формы с прикрепленными данными POST.
ps JavaScript и jQuery необходимы для этого случая. Как было предложено в комментариях к другим ответам, вы можете использовать <noscript>
для создания стандартной HTML-формы в случае, если JS отключен.
$ _SESSION – ваш друг, если вы не хотите связываться с Javascript, и все в порядке с тем, что он немного менее безопасен.
Предположим, вы пытаетесь передать электронное письмо:
На странице A:
// Start the session session_start(); // Set session variables $_SESSION["email"] = "awesome@email.com"; header('Location: page_b.php');
И на странице B:
// Start the session session_start(); // Show me the session! echo "<pre>"; print_r($_SESSION); echo "</pre>";
function post(path, params, method) { method = method || "post"; // Set method to post by default if not specified. var form = document.createElement("form"); form.setAttribute("method", method); form.setAttribute("action", path); for(var key in params) { if(params.hasOwnProperty(key)) { var hiddenField = document.createElement("input"); hiddenField.setAttribute("type", "hidden"); hiddenField.setAttribute("name", key); hiddenField.setAttribute("value", params[key]); form.appendChild(hiddenField); } } document.body.appendChild(form); form.submit(); }
Пример:
post('url', {name: 'Johnny Bravo'});