我应该使用他们的无声订单帖子呼叫第三方供应商 - Cybersource。问题是我有一个手风琴页面有3个窗格,帐户创建,服务地址和计费(在第三个窗格上)。
我正在尝试从[http://mydomain/billing][1]转到{http://cybersource/silentorderpost/pay][1]进行ajax调用。
在帖子参数中我设置了响应url = [http://mydomain/billing][1]这是CS将回复的响应。
当Ajax帖子从我的网站发送到CS网站时,我没有得到回调,但是Cybersource将回复发布回我的网站[http://mydomain/billing][1],这会重新载入我想要避免的整个手风琴页面。我理解在Ajax调用期间,Ajax期望在同一个域上响应"称为webservice",即我的Ajax帖子期望Cybersource会在[http://cybersource/response][1]之类的帖子上发布响应。然而,CS发布或重定向到我的网站的响应,这可能是原因,我从来没有得到我的回调。当响应被发布时,我的整个手风琴页面重新加载,这会导致各种各样的问题。
我的代码:
function myFunction() {
//document.getElementById("myForm1").submit();
var http= new XMLHttpRequest();
var url = "https://testsecureacceptance.cybersource.com/silent/pay";
var params = document.getElementById("queryStr");
http.open("POST", url, true);
http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
http.send(params);
//Send the proper header information along with the request
http.onreadystatechange = function() {//IT NEVER COMES BACK TO THIS SECTION
if(http.readyState == 4) {
alert(http.responseText);
console.log("I came back");
}
}
}
</script>
function myFunction() {
//document.getElementById("myForm1").submit();
var http= new XMLHttpRequest();
var url = "https://testsecureacceptance.cybersource.com/silent/pay";
var params = document.getElementById("queryStr");
http.open("POST", url, true);
http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
http.send(params);
//Send the proper header information along with the request
http.onreadystatechange = function() {//IT NEVER COMES BACK TO THIS SECTION
if(http.readyState == 4) {
alert(http.responseText);
console.log("I came back");
}
}
}
</script>
USING JQUERY:
function myFunction() {
//document.getElementById("myForm1").submit();
var http= new XMLHttpRequest();
var url = "https://testsecureacceptance.cybersource.com/silent/pay";
var params = document.getElementById("queryStr");
var jqxhr = $.post( url, function() {
alert( "success" );
})
.done(function() {
alert( "second success" );
})
.fail(function() {
alert( "error" );
})
.always(function() {
alert( "finished" );
});
// Set another completion function for the request above
jqxhr.always(function() {
alert( "second finished" );
});
}
任何解决方案?
答案 0 :(得分:0)
var xhr = new XMLHttpRequest();
xhr.open('POST',url,true);
var params = document.getElementById("queryStr");
// you need to call this method:
xhr.send(params);
xhr.onreadystatechange = function() {
if (xhr.readyState == 4 && xhr.status == 200) {
//return stuff
} else {
//return stuff
}
}
就像我在评论中写的那样,您还需要在状态发生变化之前通过xmlhttprequestObject.send()
将您的请求发送到服务器。
问候
答案 1 :(得分:0)
我找到了出路。在我的表单上我添加了一个iframe,现在当我收到来自CS的帖子回复时,我的页面没有重新加载,而是在iframe中更新了响应。
<form action="https://testsecureacceptance.cybersource.com/silent/pay" method ="post" target="myIframe"> ..... </form>
<iframe src="" name="myIframe"></iframe>
答案 2 :(得分:0)
当我整合网络源无声后订单时,我遇到了同样的问题。我用带有隐藏输入字段的表单解决了它,以创建签名和不可见的iframe作为我的表单的目标。
在整合网络源静音帖子时,您需要注意的几件事情 1.确保您传递了所有必填字段 2.生成唯一的应用程序编号和uuid,否则网络资源会将其视为重复请求 3.创建签名以确保输入字段不被篡改 4.不要使用ajax提交请求,在这种情况下,呼叫可能会成功,但网络来源不会调用您为客户回复配置的回复URL。