Investigué un poco sobre este tema, y hay algunos expertos que han dicho que no es posible , por lo que me gustaría pedir una solución alternativa.
Mi situación:
Página A: [checkout.php] El cliente completa sus detalles de facturación.
Página B: [process.php] Genere un número de factura y almacene los detalles del cliente en la base de datos.
Página C: [thirdparty.com] Tercera pasarela de pago (SOLO ACEPTA DATOS POSTALES).
El cliente completa sus datos y configura su carrito en la página A, luego envía las POST a la página B. Dentro de process.php, almacena los datos publicados en la base de datos y genera un número de factura. Después de eso, PUBLICA los datos del cliente y el número de factura en la pasarela de pago de thirdparty.com. El problema es hacer POST en la página B. cURL puede PUBLICAR los datos en la página C, pero el problema es que la página no redirigió a la página C. El cliente debe completar los detalles de la tarjeta de crédito en la página C.
La pasarela de pago de terceros nos dio la muestra de API, la muestra es PUBLICAR el número de factura junto con los detalles del cliente. No queremos que el sistema genere un exceso de números de factura no deseados.
¿Hay alguna solución para esto? Nuestra solución actual es que el cliente complete los detalles en la página A, luego en la página B creamos otra página que muestra todos los detalles del cliente allí, donde el usuario puede hacer clic en un botón CONFIRMAR para PUBLICAR en la página C.
Nuestro objetivo es que los clientes solo tengan que hacer clic una vez.
Espero que mi pregunta sea clara :)
Respuestas:
Genere un formulario en la página B con todos los datos y acciones requeridos establecidos en la página C y envíelo con JavaScript al cargar la página. Sus datos serán enviados a la página C sin mucha molestia para el usuario.
Esta es la única forma de hacerlo. Una redirección es un encabezado HTTP 303 que puede leer en http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html , pero citaré algunos de ellos:
La única forma de lograr lo que está haciendo es con una página intermedia que envía al usuario a la página C. Aquí hay un fragmento pequeño / simple sobre cómo puede lograrlo:
También debe tener un simple formulario de "confirmación" dentro de una etiqueta noscript para asegurarse de que los usuarios sin Javascript puedan usar su servicio.
fuente
$a
y,$b
al usarhtmlentities/htmlspecialchars
, consulte stackoverflow.com/questions/6180072/php-forward-data-post/…<noscript><input type="submit" value="Click here if you are not redirected."/></noscript>
dentro de<form>
language
atributo está en desuso, debería serlo<script type="text/javascript">...</script>
fuente
$url
solo reemplaza el contenido de la página existente con el contenido de la$url
página. Es importante destacar que el código php en la$url
página no se evalúa.redirect_post()
, que es del lado del servidor, código php, envía una solicitud al SERVIDOR para a$url
. Si$url
es una.php
página, noto que no se evalúa el php: html se devuelve con las etiquetas php todavía en él. ¿No tiene sentido enviar datos POST a un script del lado del servidor?Tengo otra solución que hace esto posible. Requiere que el cliente ejecute Javascript (lo que creo que es un requisito justo en estos días).
Simplemente use una solicitud AJAX en la página A para ir y generar su número de factura y los detalles del cliente en segundo plano (su página B anterior), luego, una vez que la solicitud se devuelva con éxito con la información correcta, simplemente complete el envío del formulario a su pasarela de pago (Página C).
Esto logrará el resultado de que el usuario solo haga clic en un botón y se dirija a la pasarela de pago. A continuación hay un pseudocódigo
HTML:
JS (usando jQuery por conveniencia pero trivial para hacer Javascript puro):
fuente
$ _SESSION es tu amigo si no quieres meterte con Javascript
Digamos que estás intentando pasar un correo electrónico:
En la página A:
Y en la página B:
Para destruir la sesión
fuente
Puede dejar que PHP haga una POST, pero luego su php obtendrá el retorno, con todo tipo de complicaciones. Creo que lo más simple sería dejar que el usuario haga la POST.
Entonces, más o menos de lo que sugirió, obtendrá esta parte:
Detalles del cliente en la página A, luego en la página B creamos otra página que muestra todos los detalles del cliente allí, haga clic en el botón CONFIRMAR y luego PUBLICAR en la página C.
Pero en realidad puede hacer un envío de JavaScript en la página B, por lo que no es necesario hacer clic. Conviértalo en una página de "redireccionamiento" con una animación de carga y listo.
fuente
Sé que esta es una vieja pregunta, pero tengo otra solución alternativa con jQuery:
El código anterior usa jQuery para crear una etiqueta de formulario, agregando campos ocultos como campos de publicación y, por último, enviarlo. La página reenviará a la página de destino del formulario con los datos POST adjuntos.
ps JavaScript y jQuery son necesarios para este caso. Como lo sugieren los comentarios de las otras respuestas, puede utilizar la
<noscript>
etiqueta para crear un formulario HTML estándar en caso de que JS esté deshabilitado.fuente
Hay un truco simple, usa
$_SESSION
y crea unoarray
de los valores publicados, y una vez que vas aFile_C.php
usarlo, puedes usarlo y luego procesarlo después de destruirlo.fuente
Soy consciente de que la pregunta está
php
orientada, pero la mejor manera de redirigir unaPOST
solicitud es probablemente usando.htaccess
, es decir:Explicación:
De forma predeterminada, si desea redirigir la solicitud con datos POST, el navegador la redirige a través de GET con
302 redirect
. Esto también elimina todos los datos POST asociados con la solicitud . El navegador hace esto como precaución para evitar cualquier reenvío involuntario de la transacción POST.Pero, ¿qué pasa si desea redirigir la solicitud POST de todos modos con sus datos? En HTTP 1.1, hay un código de estado para esto. El código de estado
307
indica que la solicitud debe repetirse con el mismo método y datos HTTP. Por lo tanto, su solicitud POST se repetirá junto con sus datos si utiliza este código de estado.SRC
fuente
Me enfrenté a problemas similares con la solicitud POST donde la solicitud GET funcionaba bien en mi backend, que estoy pasando mis variables, etc. El problema radica en que el backend realiza muchas redirecciones, que no funcionaron con fopen o los métodos de encabezado php.
Entonces, la única manera de hacerlo funcionar fue poner un formulario oculto y empujar los valores con un envío POST cuando se carga la página.
fuente
Puede usar sesiones para guardar
$_POST
datos, luego recuperar esos datos y configurarlos$_POST
en la solicitud posterior.El usuario envía su solicitud a /dirty-submission-url.php.
Haga:
Luego, el navegador redirige y solicita
/clean-submission-url
a su servidor. Tendrá un enrutamiento interno para descubrir qué hacer con esto.Al comienzo de la solicitud, hará:
Ahora, a través del resto de su solicitud, puede acceder
$_POST
como podría a la primera solicitud.fuente
$_POST
datos en una cadena de consulta y pasarlos a la página siguiente de esa manera. Pero entonces los datos no pueden ser demasiado grandes. Y esto probablemente no funcione si están involucradas las cargas de archivos, pero no estoy seguro.Prueba esto:
Envíe datos y solicite con el encabezado http en la página B para redirigir a Gateway
Encabezados adicionales:
fuente
Aquí hay otro enfoque que funciona para mí:
si necesita redirigir a otra página web (
user.php
) e incluye una variable PHP ($user[0]
):o
fuente
Ejemplo:
fuente