在实施支付网关时,我遇到了最好的用户体验,将弹出窗口用于 3D 安全流程。
流程是这样的:
- 用户在付款页面上并将信用卡数据输入到托管字段中。
- 在“购买”onclick 事件中,我调用网关的 javascript 片段来获取卡令牌。
- 我将其发布到后端。
- 后端检查是否需要 3DS。
- 如果是,前端会打开一个带有 3DS 表单的新窗口。
onclick 的代码如下:
var win;
$("#buy").click(function() {
gateway.Tokenize(function(token) {
$.ajax({
url: 'backend.php',
type: "POST",
data: {
token: token
}
}).done(function(data) {
if (data.threeDRequired) {
win = window.open(data.url, "_blank");
win.focus();
}
});
});
});
通常这没有问题并且弹出窗口会打开,但如果Tokenize
方法或$.ajax
调用完成时间过长,则会触发弹出窗口阻止程序。即使加入async: false
通话$.ajax
也无济于事。
我能做些什么来在所有情况下都能做到这一点吗?目前我能想到的唯一解决方案是在单击事件开始时打开一个弹出窗口,然后在可用时加载 URL,或者如果弹出窗口被阻止,则让用户单击其他按钮。两者似乎都不理想。