Javascript JQuery重新获得对外部弹出窗口的控制
作为支付流程的一部分,我必须通过调用表单打开twitter引导模式,该表单反过来打开一个外部窗口,以启动流程,银行渠道引导用户输入数据并进行购买 我遇到的问题是,我的页面被隐藏,我无法恢复对进程的控制,因为通道窗口正在执行Javascript JQuery重新获得对外部弹出窗口的控制,javascript,jquery,ruby-on-rails,twitter-bootstrap,slim-lang,Javascript,Jquery,Ruby On Rails,Twitter Bootstrap,Slim Lang,作为支付流程的一部分,我必须通过调用表单打开twitter引导模式,该表单反过来打开一个外部窗口,以启动流程,银行渠道引导用户输入数据并进行购买 我遇到的问题是,我的页面被隐藏,我无法恢复对进程的控制,因为通道窗口正在执行 window.close(); 命令(我不能更改或把手放在上面),所以当我更改了初始值时 window.open("", "payment_method_page", "width=8, height=6"); 对于一个模式,频道页面仍在等待和徘徊,尽管事实上,在内部我可
window.close();
命令(我不能更改或把手放在上面),所以当我更改了初始值时
window.open("", "payment_method_page", "width=8, height=6");
对于一个模式,频道页面仍在等待和徘徊,尽管事实上,在内部我可以看到付款是成功的或有一些失败。同时,应用程序暂停
我已经试过了:
$('#paymentModal').modal('hide');
以及:
甚至:
$('#paymentModal').on('click', 'a', function(event) {event.preventDefault(); window.open("", "payment_method_page", "width=800, height=600");});
,认为由于我的模态识别了过程,我可以被迫关闭;但外部窗口对此命令漠不关心
如何通过JQuery强制关闭第三方窗口
Javascript特定操作
$(document).ready(function() {
$('#payment_button_id_copy').val(#{@order.payments.first.payment_button["codigoMedioPago"]})
$('#payment_frequency_copy').val("#{@order.payments.first.payment_frequency}")
//window.open("", "payment_method_page", "width=800, height=600");
$('#paymentModal').modal('show');
$('#params_form').submit();
});
参数表
.hide
= simple_form_for @order, url: main_app.payment_jump_path, html: { id: 'params_form'}, data: {target: "#paymentModal", toggle: "modal"} do
- @order.available_payment_methods.each do |method|
= hidden_field_tag "order[payments_attributes][][payment_method_id]", method.id, id: "payment_method_id_copy"
= hidden_field_tag "order[payments_attributes][][payment_button_id]", nil, id: "payment_button_id_copy"
= hidden_field_tag "order[payments_attributes][][payment_frequency]", nil, id: "payment_frequency_copy"
button.submit-btn data-target="#paymentModal" data-toggle="modal" type="submit"
等待外部窗口关闭的Javascript
$(document).ready(function(event){
start_at = +new Date();
$.poll(10000, function(retry){
$.get('/payments/check.json', function(response, status){
if (response['completed'] == true) {
$('#paymentModal').modal('hide');
$('.payment-message-waiting').hide();
$('.payment-message-success').removeClass('hide');
$('form#checkout_form_payment_button').submit();
} else {
if (response['failed'] == true) {
$('.payment-message-waiting').hide();
$('.payment-message-error').removeClass('hide')
} else {
retry_at = +new Date();
delta = retry_at-start_at
// 5 min => 300000 miliseconds => 5 * 60 * 1000
if ( delta > 300000 ){
window.location = '/content/session-expired';
} else {
retry();
}
}
}
})
})
$.poll(5000, function(retry) {
$.get('/payments/check_payment_presence.js', function(response, status){
var payment_info = document.getElementById('payment-info').hasChildNodes();
if(!payment_info) {
retry();
}
})
})
});
我实现的解决方案(感谢@hermes_sandoval的帮助)是强制另一个页面在modal内的Iframe中打开,这样,如果服务需要很长时间才能处理,用户就可以始终控制它
javascript:
$(document).ready(function() {
$('#payment_button_id_copy').val(#{@order.payments.first.payment_button["codigoMedioPago"]})
$('#payment_frequency_copy').val("#{@order.payments.first.payment_frequency}")
$('#iframeRedirect').html('');
var iframe = "<iframe name='payment_method_page' style='height: 660px;'/>";
$('#iframeRedirect').append(iframe);
$('#paymentModal').modal('show');
$('#params_form').submit();
});
javascript:
$(文档).ready(函数(){
$(“#付款按钮_id_copy”).val(#{@order.payments.first.payment_按钮[“codigoMedioPago”]})
$(“#付款频率(副本)”).val(“#{@order.payments.first.payment(频率)”)
$('#iframeRedirect').html('');
var-iframe=“”;
$('#iframeRedirect')。追加(iframe);
$('paymentModal').modal('show');
$('params_form')。提交();
});
仔细阅读支付网关通知。您会发现它有一个“响应URL”,在该URL上,它为每个已处理的付款(包括失败的付款)发送响应请求。您还将发现响应结构有很好的文档记录。您需要做的是设置服务器(后端)以处理来自支付网关的所有请求。但这两个过程是完全不同的。您可能希望使用一个数据库,在其中存储所有网关请求(当用户离开时),并在从网关获得结果后通过响应URL完成这些请求。请注意,来自网关的请求不是用户旅程的一部分。用户结束付款后,可以在您的服务器上返回到“谢谢”页面,但这与响应URL无关,响应URL可能会在几分钟后出现(一些支付网关处理付款最多需要30分钟)。还请注意,随着请求状态的更改,每个付款请求可能会得到多个响应。所有网关都很好地记录了这一点。最后,但并非最不重要的一点是,不要在支付实践中使用建议。唯一的权威是网关的技术人员。
javascript:
$(document).ready(function() {
$('#payment_button_id_copy').val(#{@order.payments.first.payment_button["codigoMedioPago"]})
$('#payment_frequency_copy').val("#{@order.payments.first.payment_frequency}")
$('#iframeRedirect').html('');
var iframe = "<iframe name='payment_method_page' style='height: 660px;'/>";
$('#iframeRedirect').append(iframe);
$('#paymentModal').modal('show');
$('#params_form').submit();
});