Я провел некоторое исследование по этой теме, и есть некоторые эксперты, которые сказали, что это невозможно , поэтому я хотел бы попросить альтернативное решение.
Моя ситуация:
Страница A: [checkout.php] Клиент заполняет свои платежные реквизиты.
Страница B: [process.php] Создайте номер счета и сохраните информацию о клиенте в базе данных.
Страница C: [thirdparty.com] Третий платежный шлюз (ТОЛЬКО ПРИНИМАЮТ ПОЧТОВЫЕ ДАННЫЕ).
Клиент заполняет свои данные и устанавливает свою корзину на странице A, затем отправляет POST на страницу B. Внутри process.php сохраняют данные POST в базе данных и генерируют номер счета-фактуры. После этого отправьте данные клиента и номер счета на платежный шлюз Thirdparty.com. Проблема заключается в выполнении процедуры POST на странице B. cURL может отправить данные на страницу C, но проблема заключается в том, что страница не перенаправлена на страницу C. Клиент должен заполнить данные кредитной карты на странице C.
Сторонний платежный шлюз предоставил нам пример API, образец POST - номер счета-фактуры вместе с данными клиента. Мы не хотим, чтобы система генерировала избыток нежелательных номеров счетов.
Есть ли решение для этого? Наше текущее решение заключается в том, чтобы клиент заполнял детали на странице A, а затем на странице B мы создаем еще одну страницу, на которой отображаются все данные клиента, где пользователь может нажать кнопку ПОДТВЕРДИТЬ, чтобы отправить сообщение на страницу C.
Наша цель - чтобы клиенты нажимали только один раз.
Надеюсь, мой вопрос ясен :)
Ответы:
Создайте форму на странице B со всеми необходимыми данными и действиями, установленными на странице C, и отправьте ее с JavaScript при загрузке страницы. Ваши данные будут отправлены на страницу C без особых хлопот для пользователя.
Это единственный способ сделать это. Перенаправление - это HTTP-заголовок 303, который вы можете прочитать на http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html , но я приведу некоторые из них:
Единственный способ добиться того, что вы делаете, - это промежуточная страница, которая отправляет пользователя на страницу C. Вот небольшой / простой фрагмент о том, как этого добиться:
Вы также должны иметь простую форму «подтверждения» внутри тега noscript, чтобы пользователи без Javascript могли использовать ваш сервис.
источник
$a
и$b
с помощьюhtmlentities/htmlspecialchars
, см stackoverflow.com/questions/6180072/php-forward-data-post/...<noscript><input type="submit" value="Click here if you are not redirected."/></noscript>
внутри<form>
language
атрибут является устаревшим, он должен быть<script type="text/javascript">...</script>
источник
$url
он просто заменяет содержимое существующей страницы содержимым$url
страницы. Важно отметить , что PHP-код на$url
странице не оценивается.redirect_post()
, который на стороне сервера, php code, отправляет запрос на СЕРВЕР для$url
. Если$url
это.php
страница, я отмечаю, что php не оценивается - возвращается html с тегами php. Разве нет смысла отправлять POST-данные в сценарий на стороне сервера?У меня есть другое решение, которое делает это возможным. Это требует, чтобы клиент работал под управлением Javascript (что я считаю справедливым требованием в наши дни).
Просто используйте AJAX-запрос на странице A, чтобы перейти и сгенерировать номер счета-фактуры и данные клиента в фоновом режиме (ваша предыдущая страница B), а затем, как только запрос будет успешно возвращен с правильной информацией - просто завершите отправку формы на ваш платежный шлюз. (Страница C).
Это приведет к тому, что пользователь нажмет только одну кнопку и перейдет к платежному шлюзу. Ниже приведен псевдокод
HTML:
JS (используя jQuery для удобства, но тривиально сделать чистый Javascript):
источник
$ _SESSION - ваш друг, если вы не хотите связываться с Javascript
Допустим, вы пытаетесь передать письмо:
На странице А:
И на странице B:
Уничтожить сеанс
источник
Вы можете позволить PHP делать POST, но тогда ваш php получит ответ, со всеми видами сложностей. Я думаю, что самым простым было бы на самом деле позволить пользователю делать POST.
Итак, вроде того, что вы предложили, вы действительно получите эту часть:
Сведения о клиенте заполняются на странице A, затем на странице B мы создаем еще одну страницу, на которой отображаются все сведения о клиенте, нажмите кнопку ПОДТВЕРДИТЬ, затем POST на страницу C.
Но на самом деле вы можете сделать отправку javascript на странице B, поэтому нет необходимости в клике. Сделайте «страницу перенаправления» с анимацией загрузки, и все готово.
источник
Я знаю, что это старый вопрос, но у меня есть еще одно альтернативное решение с помощью jQuery:
Приведенный выше код использует jQuery для создания тега формы, добавления скрытых полей в качестве полей публикации и, наконец, отправки его. Страница будет перенаправлена на целевую страницу формы с прикрепленными данными POST.
ps JavaScript и jQuery требуются для этого случая. Как следует из комментариев других ответов, вы можете использовать
<noscript>
тег для создания стандартной формы HTML в случае, если JS отключен.источник
Существует простой способ взлома, использования
$_SESSION
и созданияarray
объявленных значений, и как только вы перейдете к нему,File_C.php
вы сможете использовать его, а затем обработать, после чего уничтожить его.источник
Я знаю, что вопрос
php
ориентирован, но лучший способ перенаправитьPOST
запрос, вероятно, использует.htaccess
, то есть:Объяснение:
По умолчанию, если вы хотите перенаправить запрос с данными POST, браузер перенаправляет его через GET с помощью
302 redirect
. Это также удаляет все данные POST, связанные с запросом . Браузер делает это в качестве меры предосторожности, чтобы предотвратить любую непреднамеренную повторную отправку транзакции POST.Но что, если вы все равно хотите перенаправить POST-запрос с его данными? В HTTP 1.1 для этого есть код состояния. Код состояния
307
указывает, что запрос должен повторяться с тем же методом HTTP и данными. Таким образом, ваш запрос POST будет повторяться вместе с его данными, если вы используете этот код состояния.SRC
источник
Я столкнулся с похожими проблемами с POST-запросом, когда GET-запрос работал нормально на моем бэкэнде, который я передаю переменным и т. Д. Проблема заключается в том, что бэкэнд выполняет много перенаправлений, которые не работают с методами fopen или php header.
Таким образом, единственный способ, с помощью которого я работал, состоял в том, чтобы поместить скрытую форму и передать значения с помощью отправки POST при загрузке страницы.
источник
Вы можете использовать сеансы для сохранения
$_POST
данных, затем получить эти данные и установить их для$_POST
последующего запроса.Пользователь отправляет запрос на /dirty-submission-url.php
.
Затем браузер перенаправляет и запрашивает
/clean-submission-url
с вашего сервера. У вас будет некоторая внутренняя маршрутизация, чтобы выяснить, что с этим делать.В начале запроса вы сделаете:
Теперь через оставшуюся часть вашего запроса вы можете получить доступ,
$_POST
как и при первом запросе.источник
$_POST
данные в строку запроса и таким образом передать их на следующую страницу. Но тогда данные не могут быть слишком большими. И это, вероятно, не работает, если загрузка файлов вовлечена, но я не уверен.Попробуй это:
Отправьте данные и запрос с заголовком http на странице B для перенаправления на шлюз
Дополнительные заголовки:
источник
Здесь есть другой подход, который работает для меня:
если вам нужно перенаправить на другую веб-страницу (
user.php
) и включить переменную PHP ($user[0]
):или
источник
Пример:
источник