在这里使用Python和JQuery ..
我们以前在验证(JQuery插件)调用的form.submit();
中使用正常submitHandler
提交。这被提交给Braintree的透明重定向url,redirect-to设置为我们服务器上的GET处理程序。我们做确认,然后在我们的处理程序中进行另一次重定向。如果提交的数据没有通过braintree(比如一张不好的信用卡),那么我们会在处理程序的响应中将一些html写入<div id="error">errormessage</div>
,并将其插入到用户的页面中。
问题是如果我们的处理程序中存在错误,这会产生500状态代码,一切都会陷入地狱,用户的页面会有不良行为。
如果发生这种情况,我希望能够处理来自我们处理程序的500响应。
我以为我可以使用jQuery的AJAX的statusCode
属性来实现它。
这是我尝试过的(在submitHandler
中):
var data = $(form).serialize();
$.ajax({
type: 'POST',
url: braintree_url,
data: data,
statusCode: {
500: function() {
alert('broked response yo');
}
}
});
然后我故意在我们的处理程序中引发错误以强制500。
但我的ajax提交给Braintree网址是行不通的。然而form.submit();
工作正常。
我做错了什么?我认为表格可以通过这样的AJAX提交并产生相同的结果我错了吗?
FWIW,我们为html表单提供了许多属性,如下所示:
%form#addcard{"action": braintree_url, "method": "post", "autocomplete": "off", "submittype": "secure", "next": braintree_url, "target": "hidden_iframe")}
编辑:
我在阅读了一些关于ajax的更多信息之后意识到我在这里设置的可能原因是因为它正在调用另一个域(Braintree),这违反了相同的原始策略。所以浏览器没有执行它。
来自:http://api.jquery.com/jQuery.ajax/
由于浏览器安全限制,大多数“Ajax”请求都遵循相同的原始策略;请求无法成功从其他域,子域或协议中检索数据。
答案 0 :(得分:4)
好的......这是ajax的十年版本,但它对我来说非常棒:
使用普通表单提交(不调用$ .ajax),但在网页中定位隐藏的iframe:
<form action="<%= Braintree::TransparentRedirect.url %>" method="POST" target="braintree-result">
...
</form>
<iframe name="braintree-result" id="braintree-target" style="display:none;"></iframe>
然后使用jQuery挂钩到iframe的load
事件:
$('#braintree-target').on('load', function() {
var data = $.parseJSON( $(this).contents().text() );
// Handle response data here
});
然后更改您的braintree回调URL以返回JSON数据,这将在您的iframe中呈现,以便您可以在客户端处理它。而已!请注意,此方法假定您将braintree重定向回到与当前页面具有相同原点的URL。否则我认为您无法阅读iframe内容。