PHP :: Emulate< form method =“ post”&gt ;,将用户转发到页面

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

  •  01-07-2019
  •  | 
  •  

我正在开发一个链接到 Protx VSP Direct支付网关 PHP 应用程序。处理“3D安全”来自信用卡处理公司的请求,我需要将用户转发到不同的网站,模仿已发布的表单。我正在尝试使用 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表单,如果我可以避免的话。

感谢您的帮助: - )

有帮助吗?

解决方案

3D Secure API不允许您在后台执行请求。您需要将用户转发到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>

其他提示

我觉得你对curl的作用有点困惑。它完全按照你的解释,它有点像浏览器,并调用网站并返回该帖子的内容。我不知道你有什么办法可以实际重定向浏览器服务器端并代表帖子。我实际上会创建一个Javascript解决方案来做这样的事情。

要在PHP中将用户重定向到另一个页面,您可以发送标题(“Location:http://example.com/newpage"); ”。但是,遗憾的是,对于程序重定向导致删除所有POST变量(出于安全原因)。如果要使用户的浏览器将POST请求发送到其他URL,则必须创建一个提交自身的表单。 :(

我更喜欢在幕后使用像cURL这样的东西,因为我不能保证我的用户会启用JS,并且显示表单会导致其他一些我宁愿避免的问题。这是我的计划B; - )

您可以使用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;
}

啊,如果我误解了cURL的作用,我想我会选择使用JS自动提交的HTML表单。为我创造了更多的工作,但如果这是唯一的方法,我将不得不这样做。

感谢所有人的帮助。

我认为在这种情况下你需要使用一个表格。卡支付公司网站需要由用户的浏览器访问,而不是服务器端代码。

是的,3dsecure等,与它集成非常烦人,但它们确实提供了真正的安全性提升 - 按照预期使用它。

也许我错过了一些东西;看起来您正在尝试接收用户的数据,通过cURL将其转发给支付处理器,然后将用户重定向到某处。正确?

如果是这样,您需要做的只是将其放在代码的末尾:

标题(&quot;位置: http://www.yoursite.com/yoururl &quot; );

但是,为了使其工作,脚本在处理时不能向客户端发送任何内容;这意味着脚本不应该在模板中间执行,而另一个问题是在开始标记之前的文件开头是空格。

如果您需要保存原始POST事务中的数据,请使用会话进行保存。

这应该适用于无JS解决方案。

我可能完全错了,但听起来你正试图做类似代理模式的事情。

我已经为我合作过的其他网站实施了类似的模式,并且确实需要进行一些修补才能做到正确。

我将RETURN_TRANSFER设置为TRUE,以便您可以分析检索到的响应并根据它来进行应用程序级操作。

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

祝你好运。

我发现上面的sendToHost()函数非常有用,但是源中有一个拼写错误需要一些时间来调试:Content-type标头值包含'form-'和'urlencoded'之间的空格 - 应该是'应用程序/ x WWW的形式进行了urlencoded'

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top