PHP :: Emulate < form method = “post” > ;, rediriger l'utilisateur vers la page

StackOverflow https://stackoverflow.com/questions/104872

  •  01-07-2019
  •  | 
  •  

Question

Je travaille sur une application PHP qui se connecte à la passerelle de paiement Protx VSP Direct . Pour gérer " 3D Secure " À la demande de la société de traitement des cartes de crédit, je dois renvoyer l’utilisateur à un autre site Web, en imitant un formulaire qui a été posté. J'essaie d'utiliser les bibliothèques cURL , mais semble avoir rencontré un problème. Mon code est le suivant:

<?php  
$ch = curl_init();  
// Set the URL  
curl_setopt($ch, CURLOPT_URL, 'http://www.google.com/');  
// Perform a POST  
curl_setopt($ch, CURLOPT_POST, 1);  
// If not set, curl prints output to the browser  
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);   
// Set the "form fields"  
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);  
$output = curl_exec($ch);  
curl_close($ch);  
?>  

Tout ce que cela fait est de récupérer le contenu de l'URL passée et de ne transférer l'utilisateur nulle part. J'ai essayé googler et lire autant que je peux, mais je ne peux pas comprendre ce qui me manque. Des idées? Je ne veux pas avoir à créer un formulaire HTML qui se soumet automatiquement si je peux l'éviter.

Merci pour toute aide: -)

Était-ce utile?

La solution

L'API 3D Secure ne vous permet pas d'effectuer la demande en arrière-plan. Vous devez transférer l'utilisateur sur le site sécurisé 3D. Utilisez javascript pour soumettre automatiquement votre formulaire. Voici ce que notre fournisseur suggère:

<html> 
    <head> 
        <title>Processing your request...</title> 
    </head> 
    <body OnLoad="OnLoadEvent();"> 
        <form name="downloadForm" action="<%=RedirURL%>" method="POST"> 
            <noscript> 
                <br> 
                <br> 
                <div align="center"> 
                    <h1>Processing your 3-D Secure Transaction</h1> 
                    <h2>JavaScript is currently disabled or is not supported by your browser.</h2><BR> 
                    <h3>Please click Submit to continue the processing of your 3-D Secure transaction.</h3><BR> 
                    <input type="submit" value="Submit"> 
                </div> 
            </noscript> 
            <input type="hidden" name="PaReq" value="<%=PAREQ%>"> 
            <input type="hidden" name="MD" value="<%=TransactionID%>"> 
            <input type="hidden" name="TermUrl" value="<%=TermUrl%>"> 
        </form> 
        <SCRIPT LANGUAGE="Javascript"> 
            <!-- 
            function OnLoadEvent() { 
                document.downloadForm.submit(); 
            } 
            //--> 
        </SCRIPT> 
    </body> 
</html>

Autres conseils

Je pense que vous êtes un peu confus quant à ce que fait curl. Il fait exactement ce que vous avez expliqué, il agit en quelque sorte comme un navigateur, appelle le site et renvoie le contenu de ce message. Je ne connais aucun moyen de rediriger le côté serveur du navigateur et de représenter un message. Je créerais réellement une solution Javascript pour faire une telle chose.

Pour rediriger un utilisateur vers une autre page en PHP, vous pouvez envoyer un en-tête (" Emplacement: http://exemple.com/newpage"); . Cependant, malheureusement, pour la redirection de votre programme, toutes les variables POST sont supprimées (pour des raisons de sécurité). Si vous souhaitez que le navigateur de l'utilisateur envoie une demande POST à ??une autre URL, vous devez créer un formulaire qui se soumet lui-même. : (

Je préférerais de loin utiliser quelque chose en coulisse, tel que cURL, car je ne peux pas garantir à mes utilisateurs que JS sera activé, et l'affichage d'un formulaire pose d'autres problèmes que je préférerais éviter. C'est mon plan B cependant ;-)

Vous pouvez utiliser fsockopen () pour rediriger vers le nouveau site Web tout en préservant vos variables POST. Il existe un bon tutoriel sur la procédure à suivre pour ici .

Au cas où ce site Web serait mangé par le monstre Internet, j'ai copié et collé la fonction, mais je suggère de consulter le site Web d'origine pour le contexte.

function sendToHost($host,$method,$path,$data,$useragent=0)
{
    // Supply a default method of GET if the one passed was empty
    if (empty($method)) {
        $method = 'GET';
    }
    $method = strtoupper($method);
    $fp = fsockopen($host, 80);
    if ($method == 'GET') {
        $path .= '?' . $data;
    }
    fputs($fp, "$method $path HTTP/1.1\r\n");
    fputs($fp, "Host: $host\r\n");
    fputs($fp,"Content-type: application/x-www-form- urlencoded\r\n");
    fputs($fp, "Content-length: " . strlen($data) . "\r\n");
    if ($useragent) {
        fputs($fp, "User-Agent: MSIE\r\n");
    }
    fputs($fp, "Connection: close\r\n\r\n");
    if ($method == 'POST') {
        fputs($fp, $data);
    }

    while (!feof($fp)) {
        $buf .= fgets($fp,128);
    }
    fclose($fp);
    return $buf;
}

Ah, si j'ai mal compris ce que fait CURL, je me contenterai d'un formulaire HTML avec envoi automatique JS. Cela crée un peu plus de travail pour moi, mais si c'est le seul moyen, je devrai le faire.

Merci à tous pour votre aide.

Je pense que dans ce cas, vous devez utiliser un formulaire. Le site Web des sociétés de paiement par carte doit être visité par le navigateur de l'utilisateur, et non par votre code côté serveur.

Oui, 3dsecure, etc., est assez ennuyant à intégrer, mais fournit une réelle amélioration de la sécurité. Utilisez-le comme prévu.

Peut-être que je manque quelque chose; il semblerait que vous essayiez de recevoir les données de l'utilisateur, de les transférer via cURL au processeur de paiement, puis de rediriger l'utilisateur quelque part. Droit?

Si tel est le cas, il vous suffit de mettre ceci à la fin de votre code:

en-tête (" emplacement: http://www.yoursite.com/yoururl " );

Cependant, pour que cela fonctionne, le script NE PEUT PAS envoyer quoi que ce soit au client en cours de traitement; cela signifie que le script ne doit pas être exécuté au milieu d'un modèle, et un autre casse-tête est un espace au début du fichier, avant la balise d'ouverture.

Si vous devez enregistrer les données de la transaction POST d'origine, utilisez une session pour les enregistrer.

Cela devrait fonctionner pour une solution sans JS.

J'ai peut-être tout à fait tort, mais on dirait que vous essayez de faire quelque chose de similaire au modèle de proxy.

J'ai mis en place des modèles similaires pour d'autres sites sur lesquels j'ai travaillé et cela nécessite un peu de bricolage pour réussir.

Je mettrais RETURN_TRANSFER sur TRUE afin que vous puissiez analyser la réponse extraite et effectuer des actions au niveau de l'application en fonction.

http://en.wikipedia.org/wiki/Proxy_pattern

Bonne chance.

J'ai trouvé la fonction sendToHost () ci-dessus très utile, mais il existe une faute de frappe dans la source qui a pris un certain temps à déboguer: la valeur de l'en-tête Content-type contient un espace entre 'form-' et 'urlencoded' - devrait être 'application / x-www-form-urlencoded'

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top