PHP rediriger avec les données POST

j'ai fait quelques recherches sur ce sujet, et il ya des experts qui ont dit qu'il n'est pas possible , alors je voudrais demander pour une solution alternative.

Ma situation:

Page a: [check out.php] client remplit leurs données de facturation.

à la Page B: [processus.php] générer un numéro de facture et stocker les détails du client dans la base de données.

Page c: [thirdparty.com] Troisième passerelle de paiement (N'accepte que les données POST).

le client remplit ses données et place son panier à la Page A, Puis poste à la Page B. processus Intérieur.php, stocke les données postées dans la base de données et génère un numéro de facture. Après cela, postez les données du client et le numéro de facture à thirdparty.com passerelle de paiement. Le problème est de faire un POST dans la page B. cURL est capable de poster les données à la Page C, mais le problème est que la page n'a pas redirigé vers la page C. le client a besoin pour remplir les détails de carte de crédit à la Page C.

la passerelle de paiement de tiers nous a donné L'échantillon D'API, l'échantillon est POST le numéro de facture avec les détails du client. Nous ne voulons pas que le système génère un excédent de numéros de facture indésirables.

y a-t-il une solution pour cela? Notre solution actuelle est pour le client de remplir les détails dans la Page A, puis dans la Page B Nous créons une autre page montrant tous les détails du client là, où l'utilisateur peut cliquez sur le bouton "Confirmer" pour afficher la Page C.

notre objectif est que les clients n'aient à cliquer qu'une seule fois.

Espère que ma question est clair :)

200
demandé sur Quelklef 2011-04-07 09:54:19

8 réponses

générez un formulaire sur la Page B avec toutes les données et actions requises sur la Page C et soumettez-le avec JavaScript sur la page de charge. Vos données seront envoyées à la Page C sans trop de tracas pour l'utilisateur.

C'est la seule façon de le faire. Une redirection est un en-tête HTTP 303 que vous pouvez lire sur http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html , mais j'en citerai une partie:

la réponse à La demande peut être trouvé sous un URI différent et devrait être récupéré en utilisant une méthode GET sur cette ressource. Cette méthode existe principalement pour permettre la sortie d'un Script POST-activé pour rediriger l'agent utilisateur à une ressource sélectionnée. Le la nouvelle URI n'est pas une référence de remplacement pour la ressource initialement demandée. La réponse 303 ne doit pas être mise en cache, mais la réponse à la deuxième (redirigé) la requête peut être pouvant être mis en cache.

La seule façon de atteindre ce que vous faites est avec une page intermédiaire qui envoie l'utilisateur à la Page C. Voici un petit aperçu simple sur la façon dont vous pouvez atteindre cela:

<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>

vous devriez également avoir un simple formulaire" confirmer " à l'intérieur d'une étiquette noscript pour vous assurer que les utilisateurs sans Javascript seront en mesure d'utiliser votre service.

176
répondu Peeter 2016-11-13 16:27:25
/**
 * 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");
    }
}
34
répondu Eduardo Cuomo 2013-03-01 19:30:38

j'ai une autre solution qui rend cela possible. Cela exige que le client exécute Javascript (ce qui est une exigence raisonnable de nos jours).

il suffit D'utiliser une demande AJAX à la Page A pour aller générer votre numéro de facture et les détails du client dans l'arrière - plan (votre page précédente B), puis une fois la demande est retourné avec succès avec les informations correctes-il suffit de remplir le formulaire de soumission à votre passerelle de paiement (Page C).

cela permettra d'obtenir votre résultat de l'utilisateur en cliquant seulement sur un bouton et en se rendant à la passerelle de paiement. Ci-dessous, un pseudo

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 (à l'aide de jQuery pour des raisons de commodité, mais trivial à faire pur 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
  }
});
21
répondu MikeMurko 2013-03-15 03:30:11

$_SESSION est votre ami si vous ne voulez pas déconner avec Javascript et êtes d'accord avec le fait qu'il soit un peu moins sûr.

disons que vous essayez de passer un email:

à la page A:

// Start the session
session_start();

// Set session variables
$_SESSION["email"] = "awesome@email.com";

header('Location: page_b.php');

et à la Page B:

// Start the session
session_start();

// Show me the session!  
echo "<pre>";
print_r($_SESSION);
echo "</pre>";
9
répondu Robert Sinclair 2017-09-22 18:49:03

je sais que c'est une vieille question, mais j'ai encore une autre solution alternative avec 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();

le code ci-dessus utilise jQuery pour créer une étiquette de formulaire, en ajoutant des champs cachés comme champs de poste, et le soumettre enfin. La page sera envoyée à la page cible du formulaire avec les données de poste jointes.

p. S. JavaScript et jQuery sont nécessaires pour ce cas. Comme suggéré par les commentaires des autres réponses, vous pouvez faire usage de <noscript> étiquette pour créer un formulaire HTML standard dans le cas où JS est désactivé.

6
répondu Raptor 2015-03-23 03:37:37

vous pouvez laisser PHP faire un POST, mais alors votre php obtiendra le retour, avec toutes sortes de complications. Je pense que le plus simple serait de réellement laisser l'Utilisateur faire le POST.

donc, gentil-de ce que vous avez suggéré, vous obtiendrez en effet cette partie:

détails de remplissage de client dans la Page a, puis dans la Page B Nous créons une autre page montrer tous les détails de client là, cliquez sur un bouton de confirmation puis POST à la Page C.

Mais vous pouvez réellement faire un JavaScript soumettre sur la page B, il n'y a donc pas besoin d'un clic. Faites - en une page de" redirection " avec une animation de chargement, et vous êtes prêt.

5
répondu Nanne 2011-04-07 06:03:57

il y a un hack simple, utilisez $_SESSION et créez un array des valeurs postées, et une fois que vous allez au File_C.php vous pouvez l'utiliser puis vous faites après que le détruire.

5
répondu Jeffery ThaGintoki 2016-07-22 13:45:34
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();
}

exemple:

 post('url', {name: 'Johnny Bravo'});
-1
répondu njoshsn 2015-06-29 11:28:51