我正在使用链接到PHP
的{{1}}应用程序。要处理来自信用卡处理公司的“3D安全”请求,我需要将用户转发到其他网站,模仿已发布的表单。我正在尝试使用Protx VSP Direct payment gateway
库,但似乎遇到了问题。我的代码如下:
cURL
所有这一切都是抓取传递的URL的内容,而不是将用户转发到任何地方。我尽可能多地尝试谷歌搜索和阅读,但无法弄清楚我错过了什么。有任何想法吗?我不想创建一个自动提交自己的HTML表单,如果我可以避免的话。
感谢您的帮助: - )
答案 0 :(得分:2)
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>
答案 1 :(得分:0)
我觉得你对curl的作用有点困惑。它完全按照你的解释,它有点像浏览器,并调用网站并返回该帖子的内容。我不知道你有什么办法可以实际重定向浏览器服务器端并代表帖子。我实际上会创建一个Javascript解决方案来做这样的事情。
答案 2 :(得分:0)
要将用户重定向到PHP中的另一个页面,您可以发送header("Location: http://example.com/newpage");
。但是,遗憾的是,对于程序重定向导致所有POST变量都被删除(出于安全原因)。如果要使用户的浏览器将POST请求发送到其他URL,则必须创建一个提交自身的表单。 :(
答案 3 :(得分:0)
我更喜欢在幕后使用像cURL这样的东西,因为我不能保证我的用户会启用JS,并且显示表单会导致其他一些我宁愿避免的问题。这是我的计划B; - )
答案 4 :(得分:0)
您可以使用fsockopen()重定向到新网站,同时保留POST变量。有一个很好的教程如何完成这个here。
如果该网站遭到互联网怪物的攻击,我已经复制并粘贴了该功能,但我建议您查看原始网站的上下文。
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;
}
答案 5 :(得分:0)
啊,如果我误解了cURL的作用,我想我会选择使用JS自动提交的HTML表单。为我创造了更多的工作,但如果这是唯一的方法,我将不得不这样做。
感谢所有人的帮助。
答案 6 :(得分:0)
我认为在这种情况下你需要使用一个表格。卡支付公司网站需要由用户的浏览器访问,而不是服务器端代码。
是的,3dsecure等,与它集成非常烦人,但它们确实提供了真正的安全性提升 - 按照预期使用它。
答案 7 :(得分:0)
也许我错过了一些东西;看起来您正在尝试接收用户的数据,通过cURL将其转发给支付处理器,然后将用户重定向到某处。正确?
如果是这样,您需要做的只是将其放在代码的末尾:
标题(“位置:http://www.yoursite.com/yoururl”);
但是,为了使其工作,脚本在处理时不能向客户端发送任何内容;这意味着脚本不应该在模板中间执行,而另一个问题是在开始标记之前的文件开头是空格。
如果您需要保存原始POST事务中的数据,请使用会话进行保存。
这应该适用于无JS解决方案。
答案 8 :(得分:0)
我可能完全错了,但听起来你正试图做类似代理模式的事情。
我已经为我合作过的其他网站实施了类似的模式,并且确实需要进行一些修补才能做到正确。
我将RETURN_TRANSFER设置为TRUE,以便您可以分析检索到的响应并根据它来执行应用程序级操作。
祝你好运。答案 9 :(得分:0)
我发现上面的sendToHost()函数非常有用,但是源中有一个拼写错误需要一些时间来调试:Content-type标头值包含'form-'和'urlencoded'之间的空格 - 应该是'应用程序/ x WWW的形式进行了urlencoded'