PHP :: Emula < form method = & # 8220; pubblica & # 8221; > ;, inoltrando l'utente alla pagina

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

  •  01-07-2019
  •  | 
  •  

Domanda

Sto lavorando ad un'applicazione PHP che si collega al Protx VSP Direct payment gateway . Per gestire " 3D Secure " richieste dalla società di elaborazione delle carte di credito, devo inoltrare l'utente a un sito Web diverso, imitando un modulo che è stato pubblicato. Sto cercando di utilizzare le librerie cURL , ma sembra che abbia riscontrato un problema. Il mio codice è il seguente:

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

Tutto ciò che fa è afferrare il contenuto dell'URL passato e non inoltrare l'utente da nessuna parte. Ho provato a cercare e leggere su Google il più possibile, ma non riesco a capire cosa mi sto perdendo. Qualche idea? Non voglio creare un modulo HTML che si autoinvia se posso evitarlo.

Grazie per l'aiuto :-)

È stato utile?

Soluzione

L'API 3D Secure non consente di eseguire la richiesta in background. Devi inoltrare l'utente al sito sicuro 3D. Usa JavaScript per inviare automaticamente il tuo modulo. Ecco cosa suggerisce il nostro provider:

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

Altri suggerimenti

Penso che tu sia un po 'confuso su ciò che fa il ricciolo. Fa esattamente quello che hai spiegato, si comporta come un browser e fa la chiamata al sito e restituisce il contenuto di quel post. Non so in alcun modo che tu possa effettivamente reindirizzare il lato server del browser e rappresentare un post. Vorrei davvero creare una soluzione Javascript per fare una cosa del genere.

Per reindirizzare un utente a un'altra pagina in PHP puoi inviare un'intestazione (" Posizione: http://example.com/newpage"); . Tuttavia, sfortunatamente per il reindirizzamento del programma, tutte le variabili POST vengono rimosse (per motivi di sicurezza). Se si desidera che il browser dell'utente invii una richiesta POST a un URL diverso, è necessario creare un modulo che si inoltri. : (

Preferirei di gran lunga usare qualcosa dietro le quinte come cURL, in quanto non posso garantire che i miei utenti avranno JS abilitato e la visualizzazione di un modulo causa alcuni altri problemi che preferirei evitare. È il mio piano B però ;-)

È possibile utilizzare fsockopen () per reindirizzare al nuovo sito Web preservando le variabili POST. C'è un buon tutorial su come realizzare questo qui .

Nel caso in cui il sito Web venga mangiato dal mostro di Internet, ho copiato e incollato la funzione ma suggerisco di controllare il sito Web originale per il contesto.

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, se ho capito male cosa fa cURL, immagino che mi accontenterò di un modulo HTML con l'invio automatico di JS. Crea un po 'più di lavoro per me, ma se è l'unico modo, dovrò farlo.

Grazie per l'aiuto a tutti.

Penso che in questo caso sia necessario utilizzare un modulo. Il sito Web delle società di pagamento con carta deve essere visitato dal browser dell'utente, non dal codice lato server.

Sì, 3dsecure ecc. sono piuttosto fastidiosi da integrare, ma forniscono una vera spinta alla sicurezza: usalo come previsto.

Forse mi manca qualcosa; sembra che tu stia cercando di ricevere i dati dell'utente, inoltrarli tramite cURL al processore di pagamento e quindi reindirizzare l'utente da qualche parte. Giusto?

In tal caso, tutto ciò che devi fare è semplicemente inserirlo alla fine del codice:

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

Tuttavia, affinché funzioni, lo script NON PUN inviare nulla al client durante l'elaborazione; ciò significa che lo script non deve essere eseguito nel mezzo di un modello e un altro gotcha è uno spazio bianco all'inizio del file prima del tag di apertura.

Se è necessario salvare i dati dalla transazione POST originale, utilizzare una sessione per salvarli.

Dovrebbe funzionare per una soluzione priva di JS.

Potrei sbagliarmi completamente ma sembra che tu stia provando a fare qualcosa di simile al Proxy Pattern.

Ho implementato schemi simili per altri siti con cui ho lavorato e richiede un po 'di armeggi per avere ragione.

Imposterei RETURN_TRANSFER su TRUE in modo da poter analizzare la risposta recuperata ed eseguire azioni a livello di applicazione in base ad essa.

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

Buona fortuna.

Ho trovato molto utile la funzione sendToHost () sopra, ma c'è un errore di battitura nell'origine che ha richiesto del tempo per il debug: il valore dell'intestazione Content-type contiene uno spazio tra 'form-' e 'urlencoded' - dovrebbe essere '/ x-www-form-urlencoded applicazione'

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top