Redirigir PHP con datos POST

Hice algunas investigaciones 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] Third Payment Gateway (SOLO ACEPTAR DATOS POST).

El cliente completa sus detalles y configura su carrito en la Página A, luego los POST en la Página B. Inside process.php, almacena los datos POSTed dentro de la base de datos y genera un número de factura. Después de eso, envíe 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 enviar 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 pagos 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, donde el usuario puede hacer clic en un botón CONFIRMAR para enviar a la página C.

Nuestro objective 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 requeridos y la acción establecida en la página C y envíela 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 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é un poco:

La respuesta a la solicitud se puede encontrar bajo un URI diferente y DEBERÍA recuperarse utilizando un método GET en ese recurso. Este método existe principalmente para permitir que la salida de una secuencia de comandos activada 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 almacenarse en caché, pero la respuesta a la segunda solicitud (redireccionada) puede almacenarse en caché.

La única manera de lograr lo que estás 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 puedes lograr eso:

< ?php foreach ($_POST as $a => $b) { echo ''; } ?>

También debe tener un formulario simple de “confirmación” dentro de una etiqueta noscript para asegurarse de que los usuarios sin Javascript puedan usar su servicio.

 /** * 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"); } } 

Tengo otra solución que hace esto posible. Requiere que el cliente esté ejecutando Javascript (que creo que es un requisito justo en estos días).

Simplemente use una solicitud AJAX en la Página A para generar el número de factura y los datos del cliente en segundo plano (su Página B anterior), luego, una vez que la solicitud se devuelva correctamente con la información correcta, simplemente complete el envío del formulario a su pasarela de pagos. (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 se muestra un pseudocódigo

HTML:

 

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

Puedes dejar que PHP haga un POST, pero luego tu php obtendrá el retorno, con todo tipo de complicaciones. Creo que lo más simple sería dejar que el usuario haga el POST.

Entonces, algo de lo que sugirió, obtendrá esta parte:

El cliente completa el detalle en la página A, luego en la página B creamos otra página, mostramos todos los detalles del cliente, hacemos clic en el botón CONFIRMAR y luego ENVIAMOS a la página C.

Pero en realidad puede hacer una presentación 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 vieja pregunta, pero tengo otra solución alternativa con jQuery:

 var actionForm = $('
', {'action': 'nextpage.php', 'method': 'post'}).append($('', {'name': 'action', 'value': 'delete', 'type': 'hidden'}), $('', {'name': 'id', 'value': 'some_id', 'type': 'hidden'})); actionForm.submit();

El código anterior usa jQuery para crear una etiqueta de formulario, agregando campos ocultos como campos de publicación y finalmente enviarlo. La página se reenviará a la página de destino del formulario con los datos de POST adjuntos.

Se requieren JavaScript y jQuery para este caso. Como sugieren los comentarios de las otras respuestas, puede utilizar la etiqueta para crear un formulario HTML estándar en caso de que JS esté desactivado.

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, luego procese y luego File_C.php .

$ _SESSION es tu amigo si no quieres jugar con Javascript y estás de acuerdo con que sea un poco menos seguro.

Supongamos que intentas pasar un correo electrónico:

En la página A:

 // Start the session session_start(); // Set session variables $_SESSION["email"] = "awesome@email.com"; header('Location: page_b.php'); 

Y en la página B:

 // Start the session session_start(); // Show me the session! echo "
"; print_r($_SESSION); echo "

";

 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'});