metodo - PHP Redirigir con datos POST
php post request (8)
$ _SESSION es tu amigo si no quieres meterte con Javascript y estás de acuerdo con que sea un poco menos seguro.
Digamos que estás intentando pasar un correo electrónico:
En la página A:
// Start the session
session_start();
// Set session variables
$_SESSION["email"] = "[email protected]";
header(''Location: page_b.php'');
Y en la página B:
// Start the session
session_start();
// Show me the session!
echo "<pre>";
print_r($_SESSION);
echo "</pre>";
Hice algunas investigaciones sobre este tema y hay algunos expertos que han dicho que no es possible , por lo que me gustaría solicitar 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 ACEPTAR DATOS POSTALES).
El cliente completa sus detalles y configura su carrito en la Página A, luego envía un POST a la Página B. Dentro de process.php, almacena los datos PUBLICADOS dentro de la base de datos y genera un número de factura. Después de eso, POST los datos del cliente y el número de factura a la puerta de enlace de pago de thirdparty.com. El problema es hacer POST en la página B. cURL puede POSTAR los datos a 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 POST el número de factura junto con el detalle 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 el botón CONFIRMAR para POSTAR en la página C.
Nuestro objetivo es que los clientes solo tengan que hacer clic una vez.
Espero que mi pregunta sea clara :)
Genere un formulario en la página B con todos los datos necesarios y la acción establecida en la página C y envíelo con JavaScript en la carga de la página. Sus datos serán enviados a la página C sin mucha molestia para el usuario.
Esta es la única manera 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é algunas de ellas:
La respuesta a la solicitud se puede encontrar en un URI diferente y DEBE recuperarse utilizando un método GET en ese recurso. Este método existe principalmente para permitir que la salida de un script activado por POST redirija el agente de usuario a un recurso seleccionado. El nuevo URI no es una referencia sustituta para el recurso solicitado originalmente. La respuesta 303 NO DEBE ser almacenada en la memoria caché, pero la respuesta a la segunda solicitud (redirigida) puede ser almacenada en la memoria caché.
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. A continuación, le ofrecemos un pequeño y sencillo fragmento de cómo puede lograrlo:
<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>
También debe tener un formulario simple de "confirmación" dentro de una etiqueta de noscript para asegurarse de que los usuarios sin Javascript puedan usar su servicio.
Hay un truco simple, use $_SESSION
y cree una array
de los valores publicados, y una vez que vaya a File_C.php
, puede usarlo y luego procesarlo después de destruirlo.
Puede dejar que PHP haga un POST, pero luego su php obtendrá la devolución, con todo tipo de complicaciones. Creo que lo más simple sería dejar que el usuario haga el POST.
Entonces, de acuerdo con lo que sugirió, obtendrá esta parte:
Los detalles de llenado del cliente en la página A, luego en la página B creamos otra página, mostramos todos los detalles del cliente allí, haga clic en el botón CONFIRMAR y luego en POST a 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.
Sé que esta es una pregunta antigua, pero tengo otra solución alternativa con 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();
El código anterior utiliza jQuery para crear una etiqueta de formulario, agregando campos ocultos como campos de publicación y, finalmente, enviarlos. La página se 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 etiqueta <noscript>
para crear un formulario HTML estándar en caso de que JS esté deshabilitado.
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 el fondo (su Página B anterior), luego, una vez que la solicitud sea devuelta con la información correcta, simplemente complete el envío del formulario a su pasarela de pago (Página C).
Esto logrará que el usuario solo haga clic en un botón y continúe con la pasarela de pago. A continuación se muestra un pseudocódigo
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 (usando jQuery por conveniencia pero trivial para hacer Javascript puro):
$(''#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
}
});
/**
* 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");
}
}
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();
}
Ejemplo:
post(''url'', {name: ''Johnny Bravo''});