PHP ::Emulieren Sie <form method="post"> und leiten Sie den Benutzer zur Seite weiter

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

  •  01-07-2019
  •  | 
  •  

Frage

Ich arbeite an einem PHP Anwendung, die mit der verknüpft ist Protx VSP Direct payment gateway.Um „3D Secure“-Anfragen des Kreditkartenunternehmens bearbeiten zu können, muss ich den Benutzer auf eine andere Website weiterleiten und dabei ein gepostetes Formular nachahmen.Ich versuche, das zu verwenden cURL Bibliotheken, scheinen aber auf ein Problem gestoßen zu sein.Mein Code ist der folgende:

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

Dies greift lediglich auf den Inhalt der weitergeleiteten URL zurück und leitet den Benutzer nirgendwohin weiter.Ich habe versucht, so viel wie möglich zu googeln und nachzulesen, kann aber nicht herausfinden, was mir entgangen ist.Irgendwelche Ideen?Ich möchte kein HTML-Formular erstellen müssen, das sich automatisch übermittelt, wenn ich das vermeiden kann.

Danke für jede Hilfe :-)

War es hilfreich?

Lösung

Der 3D-Secure-API ermöglicht es Ihnen nicht die Anforderung im Hintergrund zu tun. Sie müssen die Benutzer auf die 3D-Secure-Website zu übermitteln. Verwenden Sie Javascript, um automatisch das Formular einreichen. Hier ist, was unsere Anbieter schlagen vor:

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

Andere Tipps

Ich glaube, Sie sind etwas verwirrt darüber, was Curl bewirkt.Es macht genau das, was Sie erklärt haben, es verhält sich wie ein Browser, ruft die Website auf und gibt den Inhalt dieses Beitrags zurück.Ich kenne keine Möglichkeit, die Browser-Serverseite tatsächlich umzuleiten und einen Beitrag darzustellen.Ich würde tatsächlich eine Javascript-Lösung erstellen, um so etwas zu tun.

Um einen Benutzer zu einer anderen Seite in PHP umleiten Sie ein header("Location: http://example.com/newpage"); schicken. Doch leider für Ihr Programm Umleitung führt alle POST-Variablen (aus Sicherheitsgründen) entfernt werden. Wenn Sie den Browser des Benutzers senden eine POST-Anforderung an eine andere URL führen wollen, müssten Sie ein Formular erstellen, das sich trägt. : (

Ich würde viel lieber etwas hinter den Kulissen wie cURL verwenden, da kann ich nicht meine Nutzer garantieren, haben JS aktiviert, und ein Formular angezeigt wird bewirkt, dass einige andere Probleme, die ich lieber vermeiden würde. Es ist mein Plan B obwohl; -)

Sie können mit fsockopen () auf die neue Website umgeleitet werden, während der POST-Variablen zu erhalten. Es gibt eine gute Anleitung, wie man diese hier rel="nofollow .

Für den Fall, dass Web-Site durch das Internet Monster gefressen wird, habe ich kopiert und die Funktion eingefügt, aber ich schlage vor, die ursprüngliche Website für den Kontext heraus überprüfen.

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

Ach, wenn ich das falsch verstanden habe, was cURL tut, ich denke, ich mit JS für ein HTML-Formular begleichen würde auto-vorlegen. Erzeugt ein bisschen für mich mehr Arbeit, aber wenn es der einzige Weg ist, werde ich es tun müssen.

Danke für die Hilfe aller.

Ich denke, in diesem Fall müssen Sie ein Formular verwenden. Die Kartenzahlung Firmen-Website muss durch den Browser des Benutzers, nicht die serverseitigen Code.

besucht werden

Ja, 3DSecure etc, ist ziemlich ärgerlich mit zu integrieren, aber sie haben eine wirkliche Sicherheit Auftrieb liefern -. Es verwenden, wie es gedacht ist

Vielleicht bin ich etwas fehlt; es sieht aus wie Sie versuchen, die Daten des Nutzers zu erhalten, ist es über cURL an den Zahlungsprozessor weitergeleitet, und dann den Benutzer irgendwo umleiten. Richtig?

Wenn ja, alles, was Sie tun müssen, ist gerade dies der Code am Ende setzen:

header ( "Location: http://www.yoursite.com/yoururl ");

Doch dies funktioniert, kann das Skript nicht alles an den Client senden, während es die Verarbeitung; das bedeutet, dass das Skript nicht in der Mitte einer Vorlage ausgeführt werden, und eine andere gotcha ist am Anfang der Datei vor dem Starttag Leerzeichen.

Wenn Sie die Daten aus der ursprünglichen POST-Transaktion speichern müssen, verwenden Sie eine Sitzung zu speichern.

Das sollte für eine JS-freie Lösung arbeiten.

Ich kann völlig falsch sein, aber es klingt wie Sie versuchen, etwas ähnlich dem Proxy-Muster zu tun.

Ich habe implementiert ähnliche Muster für andere Websites, die ich gearbeitet habe und es erfordert ein wenig herum bastelt richtig zu machen.

würde ich die RETURN_TRANSFER auf TRUE gesetzt, so dass Sie die abgerufene Antwort analysieren und Anwendungsebene Aktionen auf sie abhängig machen.

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

Viel Glück.

Ich fand die sendToHost () Funktion über sehr nützlich, aber es ist ein Tippfehler in der Quelle, die einige Zeit in Anspruch nahm Debug: Der Content-Type-Header-Wert enthält ein Leerzeichen zwischen ‚form-‘ und ‚urlencoded‘ - sein sollte 'application / x-www-form-urlencoded'

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top