274 votes

PHP redirection avec les données POST

J'ai fait quelques recherches sur ce sujet, leur sont certains experts a déclaré qu'il n'est pas possible, alors je voudrais demander à la solution alternative.

Ma situation:

Page Une: [checkout.php]le Client de remplir leur facturation détaillée.

Page B: [process.php]Générer le Numéro de la Facture et client de magasin de détail dans la base de données

Page C: [thirdparty.com]Troisième Passerelle de Paiement (SEULEMENT ACCEPTER des données POST)

Client de remplir leurs Clients de détail et panier en Page Une, puis après, à la Page B. à l'Intérieur de process.php obtenir le poste de magasin de données à l'intérieur de la base de données et de générer le numéro de la facture. Après que nous publier les données du client et le numéro de facture à un tiers de la passerelle de paiement. Le problème est de savoir comment faire du POST dans la page B. cURL en mesure d'afficher les données de la Page C, mais le problème est que la page n'est pas redirigé vers la page de C. Le client a besoin pour remplir les détails de Carte de Crédit en Page C.

La troisième partie de la passerelle de paiement nous a donné l'API de l'échantillon, l'échantillon est le POSTE le numéro de la facture avec la clientèle de détail. Nous ne voulons pas que le système de générer beaucoup indésirables numéro de facture.

Est-il une solution à cela. Notre solution actuelle est, le Client de remplir en détail dans la Page, puis dans la Page B nous créer une autre page afficher tous les clients de détail, cliquez sur un bouton de confirmation puis après, à la Page C.

Notre objectif est, les clients ont seulement besoin d'avoir un seul clic.

Espère que ma question est clair :)

234voto

Peeter Points 4580

Générer un formulaire sur la Page B avec toutes les données nécessaires et de l'action définie sur la Page de C et de le soumettre avec JavaScript au chargement de la page. 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 303 HTTP en-tête que vous pouvez lire sur http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.htmlmais je vais vous citer certains:

La réponse à la demande peut être trouvé sous un autre URI et DEVRAIT être récupérées à l'aide d'une méthode GET sur cette ressource. Cette méthode existe principalement pour permettre la sortie d'un POST-script activé pour rediriger l' l'agent utilisateur à une ressource sélectionnée. L' nouvel URI n'est pas un substitut de référence pour l'origine de la demande de ressources. 303 réponse ne DOIT PAS être mis en cache, mais la réponse à la deuxième (redirigé) la demande peut être pouvant être mis en cache.

La seule façon d'obtenir ce que vous faites est avec un middlepage qui renvoie l'utilisateur à la Page C. Voici un petit/simple snipplet sur comment vous pouvez le faire:

<form action='Page_C.php' method='post' name='frm'>
<?php
foreach ($_POST as $a => $b) {
echo "<input type='hidden' name='".htmlentities($a)."' value='".htmlentities($b)."'>";
}
?>
</form>
<script language="JavaScript">
document.frm.submit();
</script>

Vous devez également avoir un simple "confirmer" de la forme à l'intérieur d'une balise noscript pour s'assurer que les utilisateurs sans Javascript sera en mesure d'utiliser votre service.

42voto

Eduardo Cuomo Points 1433
/**
 * 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");
    }
}

26voto

MikeMurko Points 1144

J'ai une autre solution qui rend cela possible. Il exige que le client doit être en cours d'exécution Javascript (qui je pense est un juste exigence de ces jours).

Utilisez simplement une requête AJAX sur la Page d'Un aller et générer votre numéro de facture et le client les détails en arrière-plan sur votre Page précédente B), puis une fois que la demande sera retourné avec succès avec les informations correctes - il suffit de remplir le formulaire de soumission sur votre passerelle de paiement (Page C).

Cela permettra d'atteindre votre résultat de l'utilisateur seul clic sur un bouton et de procéder à la passerelle de paiement. Ci-dessous quelques pseudo-code

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

6voto

Nanne Points 35880

Vous pouvez laisser PHP faire un POST, mais alors votre php obtiendrez le retour, avec toutes sortes de complications. Je pense que le plus simple serait effectivement permettre à l'utilisateur de faire de la POSTE.

Donc, de type de ce que vous avez suggéré, vous aurez en effet, cette partie:

Client de remplir en détail dans la Page, puis dans la Page B nous créer une autre page afficher tous les clients de détail, cliquez sur un bouton de confirmation puis après, à la Page C.

Mais vous pouvez réellement faire un javascript soumettre à la page B, donc il n'est pas nécessaire pour un clic. En faire une "redirection" de la page avec une animation de chargement, et vous êtes fixés.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X