Pergunta

Eu estou trabalhando em um aplicativo PHP que as ligações para o Protx VSP Direct payment gateway. Para lidar com "3D Secure" pedidos da empresa de processamento de cartão de crédito, eu preciso encaminhar o usuário para um site diferente, imitando um formulário que foi postado. Eu estou tentando usar as bibliotecas cURL, mas parecem ter atingido um problema. Meu código é o seguinte:

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

Tudo isso faz é pegar o conteúdo da URL passou, e não para a frente a qualquer usuário. Eu tentei pesquisando e lendo tanto quanto eu posso, mas não consigo descobrir o que eu estou sentindo falta. Alguma ideia? Eu não quero ter que criar um formulário HTML que se auto-sustenta se eu puder evitá-lo.

Obrigado por qualquer ajuda: -)

Foi útil?

Solução

O Secure API 3D não permite que você faça o pedido em segundo plano. Você precisa encaminhar o usuário para o site seguro do 3D. Use JavaScript para automaticamente enviar seu formulário. Aqui está o que o nosso provedor sugere:

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

Outras dicas

Eu acho que você está um pouco confuso quanto ao que onda faz. Ele faz exatamente o que você explicou, ele age como uma espécie de navegador e faz a chamada para o local e retorna o conteúdo desse post. Eu não sei de qualquer maneira que você pode realmente redirecionar lado do servidor do navegador e representam um post. Eu realmente criar uma solução Javascript para fazer tal coisa a.

Para redirecionar o usuário para outra página em PHP você pode enviar uma header("Location: http://example.com/newpage");. No entanto, infelizmente para o seu redirecionamento programa causa todas as variáveis ??POST para ser removido (por razões de segurança). Se você quiser causar navegador do usuário para enviar um pedido POST para uma URL diferente, você teria que criar um formulário que se submete. : (

Eu prefiro usar algo nos bastidores como cURL, como eu não posso garantir que meus usuários terão JS habilitado, e exibindo um formulário faz com que alguns outros problemas que eu prefiro evitar. É o meu plano B embora; -)

Você pode usar fsockopen () para redirecionar para o novo web site, preservando suas variáveis ??POST. Há um bom tutorial sobre como fazer isso aqui .

No caso de web site é devorado pelo monstro Internet, eu copiado e colado a função mas eu sugiro verificar o web site original para o contexto.

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 eu mal entendido já que cURL faz, eu acho que eu vou resolver para um formulário HTML com JS auto-enviar. Cria um pouco mais trabalho para mim, mas se é o único caminho, eu vou ter que fazê-lo.

Obrigado pela ajuda todos.

Eu acho que, neste caso, você precisará usar um formulário. As necessidades de empresas de pagamento cartão de web sites a serem visitados pelo navegador do usuário, e não o código do lado do servidor.

Sim, 3DSecure etc, são muito chato de se integrar com, mas eles não fornecem um impulso segurança real -. Usá-lo como ele é destinado

Talvez eu estou faltando alguma coisa; parece que você está tentando receber os dados do usuário, encaminhá-lo via cURL para o processador de pagamento, em seguida, redirecionar a algum lugar usuário. Certo?

Se assim for, tudo que você precisa fazer é apenas colocar isso no final do seu código:

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

No entanto, para que isso funcione, o script não é possível enviar qualquer coisa para o cliente enquanto ele está processando; Isso significa que o script não deve ser executado no meio de um modelo, e outra pegadinha é um espaço em branco no início do arquivo antes da tag de abertura.

Se você precisa salvar os dados da transação POST original, use uma sessão para salvá-lo.

Isso deve trabalhar para uma solução JS-livre.

Eu posso ser totalmente errado, mas parece que você está tentando fazer algo semelhante ao padrão Proxy.

Eu tenho implementado padrões semelhantes para outros sites que eu trabalhei com ele e requer um pouco de ajustes ao redor para obter direito.

Eu definir o RETURN_TRANSFER como TRUE para que você possa analisar as ações de resposta e nível de aplicação make recuperados, dependendo isso.

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

Boa sorte.

Eu encontrei a função sendToHost () acima muito útil, mas não é um erro de digitação na fonte que levou algum tempo para depuração: o valor cabeçalho do tipo de conteúdo contém um espaço entre 'form-' e 'urlencoded' - deve ser 'application / x-www-form-urlencoded'

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top