PHP :: Emulate <form method = "post">, пересылка пользователя на страницу - PullRequest
5 голосов
/ 19 сентября 2008

Я работаю над приложением PHP, которое ссылается на Protx VSP Direct payment gateway. Чтобы обрабатывать запросы «3D Secure» от компании, занимающейся обработкой кредитных карт, мне нужно перенаправить пользователя на другой веб-сайт, имитируя опубликованную форму. Я пытаюсь использовать библиотеки cURL, но, похоже, столкнулся с проблемой. Мой код следующий:

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

Все, что это делает, это захватывает содержимое URL-адреса, через который проходит, и никуда не пересылает пользователя. Я пробовал гуглить и читать столько, сколько смогу, но не могу понять, чего мне не хватает. Есть идеи? Я не хочу создавать HTML-форму, которая автоматически подает себя, если я могу избежать этого.

Спасибо за любую помощь: -)

Ответы [ 10 ]

2 голосов
/ 19 сентября 2008

API 3D Secure не позволяет выполнять запрос в фоновом режиме. Вам необходимо перенаправить пользователя на безопасный 3D-сайт. Используйте JavaScript для автоматической отправки вашей формы. Вот что предлагает наш провайдер:

<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>
0 голосов
/ 28 мая 2009

Мне показалось, что вышеприведенная функция sendToHost () очень полезна, но в источнике есть опечатка, для отладки которой потребовалось некоторое время: значение заголовка Content-type содержит пробел между «form-» и «urlencoded» - должно быть 'применение / х-WWW-форм-urlencoded'

0 голосов
/ 20 сентября 2008

Я могу быть совершенно не прав, но похоже, что вы пытаетесь сделать что-то похожее на Прокси-шаблон.

Я реализовал аналогичные шаблоны для других сайтов, с которыми работал, и для того, чтобы разобраться в этом, требуется немного поработать.

Я бы установил для RETURN_TRANSFER значение TRUE, чтобы вы могли анализировать полученный ответ и выполнять действия уровня приложения в зависимости от него.

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

Удачи.

0 голосов
/ 20 сентября 2008

Может быть, я что-то упустил; похоже, что вы пытаетесь получить данные пользователя, переслать их через cURL в платежный процессор и затем перенаправить пользователя куда-нибудь. Правильно?

Если это так, все, что вам нужно сделать, это просто поместить это в конец кода:

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

Однако, чтобы это работало, скрипт НЕ МОЖЕТ отправлять что-либо клиенту во время его обработки; это означает, что скрипт не должен выполняться в середине шаблона, а другой пробел - пробел в начале файла перед открывающим тегом.

Если вам нужно сохранить данные из исходной транзакции POST, используйте сеанс для их сохранения.

Это должно работать для решения без JS.

0 голосов
/ 20 сентября 2008

Я думаю, что в этом случае вам нужно использовать форму. Веб-сайт компании, производящей платежные карты, должен посещать браузер пользователя, а не ваш серверный код.

Да, 3dsecure и т. Д. Довольно неудобны для интеграции, но они обеспечивают реальное повышение безопасности - используйте его по назначению.

0 голосов
/ 19 сентября 2008

Ах, если я неправильно понял, что делает cURL, я полагаю, что я согласен на HTML-форму с автоматической отправкой JS. Создает для меня немного больше работы, но если это единственный способ, мне придется это сделать.

Спасибо за помощь всем.

0 голосов
/ 19 сентября 2008

Вы можете использовать fsockopen () для перенаправления на новый веб-сайт, сохраняя при этом ваши переменные POST. Есть хорошее руководство о том, как это сделать здесь .

На тот случай, если этот веб-сайт съеден интернет-монстром, я скопировал и вставил эту функцию, но предлагаю проверить исходный веб-сайт на предмет контекста.

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;
}
0 голосов
/ 19 сентября 2008

Я бы предпочел использовать что-то за кулисами, например, cURL, так как я не могу гарантировать, что у моих пользователей будет включен JS, а отображение формы вызывает некоторые другие проблемы, которых я бы предпочел избежать. Это мой план Б, хотя; -)

0 голосов
/ 19 сентября 2008

Чтобы перенаправить пользователя на другую страницу в PHP, вы можете отправить header("Location: http://example.com/newpage");. Однако, к сожалению, для вашей программы перенаправление вызывает удаление всех переменных POST (по соображениям безопасности). Если вы хотите, чтобы браузер пользователя отправлял запрос POST на другой URL-адрес, вам нужно будет создать форму, которая будет отправлена ​​сама. (

0 голосов
/ 19 сентября 2008

Я думаю, вы немного озадачены тем, что делает керл. Он делает именно то, что вы объяснили, он действует как браузер и выполняет вызов на сайт и возвращает содержание этого сообщения. Я не знаю, каким образом вы можете перенаправить серверную часть браузера и представить пост. Я бы на самом деле создал решение Javascript, чтобы сделать такую ​​вещь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...