【发布时间】:2014-07-13 03:02:42
【问题描述】:
更新:我已将其范围缩小到 Ajax 调用。我可以使用普通的表单提交,仍然使用相同的 PHP 代码并且它可以工作。阿贾克斯没有。因此,如果任何熟悉 Ajax 的人有一个想法......或者如果您对如何在没有用户交互的情况下从代码执行 POST 有更好的想法......
更新 2: 如果我用下面的代码替换 GetPaymentSetup() 函数,它也可以使用 PostTo。这似乎是重定向的东西......
public function GetPaymentSetup() {
$script1 = "<script type=\"text/javascript\">
function post_to_url() {
var form = document.createElement('form');
form.action = '" . self::PROXY_URL . "';
form.method = 'POST';
var input = document.createElement('input');
input.type = 'hidden';
input.name = 'clientId';
input.value = '" . self::CLIENTID . "';
document.body.appendChild(input);
form.appendChild(input);
var input1 = document.createElement('input');
input1.type = 'hidden';
input1.name = 'clientCode';
input1.value = '" . self::CLIENTCODE . "';
document.body.appendChild(input1);
form.appendChild(input1);
var input2 = document.createElement('input');
input2.type = 'hidden';
input2.name = 'postTo';
input2.value = '" . self::POSTTO_URL . "';
document.body.appendChild(input2);
form.appendChild(input2);
var input3 = document.createElement('input');
input3.type = 'hidden';
input3.name = 'target';
input3.value = 'GetPaymentSetup';
document.body.appendChild(input3);
form.appendChild(input3);
form.submit();
}
</script>";
$html2 = "<br><button id='hidformbtn' onclick=\"post_to_url()\">Click 3</button><br>";
echo $script1;
echo $html2;
}
我想这会奏效。在某些情况下,我需要将其自动化,但这不是问题。我只是想知道为什么 jQuery/Ajax 会失败。
我到处搜索,但找不到与此系统相关的任何问题。所以我需要一些指导,也许可以作为将来使用它的任何人的参考。我的任务是与 ModPay.com 的支付系统集成。它也称为 TotalTransact。出于测试目的,他们有一个足够简单的页面,您可以在没有任何实际数据交换的情况下进行 POST 并获取响应。我已经编写了适用于此的代码,但是当我向“PostTo a different url”添加一个选项时,我没有得到回复。首先,这是他们的 API 文档中描述该选项的方式:
如果您提供 PostTo=URL 参数,则调用 xxxxx 页面会将其结果发布到提供的 url,而不是 返回带有结果的网页。
我想将结果发布到不同的 url,以便更轻松地拆分解析。如果我不使用此参数,我会从发出请求的页面中返回 ok 的结果。如果我使用该参数,我仍然会获得成功的 POST,但没有返回。他们的开发人员摸不着头脑,所以我更倾向于认为这与我的代码有关。
我已验证他们可以直接发布到我的 PostTo 网址。所以我知道这不是问题。我还添加了“Access-Control-Allow-Origin”标头,以确保它们可以正常回发以避免跨域问题。
这是PHP中的相关代码:
function post($url, $data) {
$header = array("Content-Type: application/x-www-form-urlencoded");
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
//curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC ) ;
//curl_setopt($curl, CURLOPT_SSLVERSION,3);
//curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
//curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($curl, CURLOPT_HEADER, true); //This option returns some data to the screen
curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)");
//curl_setopt($curl, CURLOPT_COOKIEFILE, ''); //write cookies. empty string to ignore.
//curl_setopt($curl, CURLOPT_COOKIEJAR, ''); //read cookies
//curl_setopt($curl, CURLOPT_VERBOSE, '1');
//curl_setopt($curl, CURLOPT_NOPROXY, 1); // causes POST to fail
//curl_setopt($curl, CURLOPT_HTTPHEADER,array("Expect:"));
//curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
$response = curl_exec($curl);
curl_close($curl);
return $response;
}
在哪里
$data = http_build_query($_POST, '', '&');
并且 $_POST 来自另一个页面上的 AJAX 调用(避免浏览器 CORS 问题的代理):
public function GetPaymentSetup($useButton) {
$script = "<script type=\"text/javascript\">";
if($useButton == true) {
$script .= "
$(document).ready(function() {
$(\"button\").click(function() {
";
}
$script .= "
var request = jQuery.ajax ({
type: 'POST',
url: '" . self::PROXY_URL . "',
crossDomain: true,
data: { \"clientId\" : \"" . self::CLIENTID . "\",
\"clientCode\" : \"" . self::CLIENTCODE . "\",
\"postTo\" : \"" . self::POSTTO_URL . "\"
}
success: function(responseData, textStatus, jqXHR) {
$('#dresponse').html(responseData);
},
error: function(responseData, textStatus, errorThrown) {
$('#dresponse').html('Error. POST failed.');
}
});";
if($useButton == true) {
$script .= "
});});";
}
$script .= " </script>";
if($useButton == true)
$html = "<button>click</button><div id='dresponse'></div>";
else
$html = "<div id='dresponse'></div>";
echo $script;
echo $html;
}
谁能解释一下为什么我使用这条线:
\"postTo\" : \"" . self::POSTTO_URL . "\"
POSTTO_URL 页面永远不会得到任何返回。但是,如果我删除该行,我会得到回复吗?再一次,使用 POSTTO_URL,我在原始 AJAX 调用中也没有收到错误,因此它作为一个成功的 POST。我可以通过将 CLIENTID 更改为其他内容来验证这一点,然后我会失败。
这是我正在做的事情,还是他们不正确的事情?有没有人有与他们集成的经验?
提前致谢!
【问题讨论】:
-
我还应该提到,无论我是否使用 PostTo,所有注释掉的 curl 选项都没有区别。
-
如果你把
postTourl直接放在那里会发生什么? -
没有任何变化。我假设您的意思是 \"postTo\" : \"xxxx\",对吗?
-
类似
postTo: 'xxxx' -
不。我确实在上面添加了一个更新,UPDATE 2,展示了如果我不使用 jQuery/Ajax,它是如何成功工作的。