(function($){
'use strict';
var paymentPopup=null;
var messageListenerAdded=false;
var paymentMessageProcessed=false;
$(document).ready(function(){
$('button[name="buy_now"]').click(function(e){
e.preventDefault();
$('input[name="is_buy_now"]').val("true");
$('input[name="product_id"]').val($('*[name="add-to-cart"]').val());
$(this).closest('form').submit();
});
initPopupPayment();
window.abclBlockRedirect=false;
if(!messageListenerAdded){
console.log('ABCL: 添加全局postMessage监听器');
window.addEventListener('message', function(event){
console.log('ABCL: 收到postMessage', event.origin, event.data);
handlePaymentMessage(event);
}, false);
messageListenerAdded=true;
}
handlePopupReturnIfNeeded();
});
function initPopupPayment(){
$.ajaxPrefilter(function(options, originalOptions, jqXHR){
if(options.url&&options.url.indexOf('wc-ajax=checkout')!==-1){
var originalSuccess=options.success;
options.success=function(data, textStatus, jqXHR){
if(data&&data.result==='success'&&data.use_popup){
console.log('ABCL: 拦截到弹窗支付响应', data);
window.abclBlockRedirect=true;
var paymentData=$.extend(true, {}, data);
data.redirect='';
data.reload=false;
data.refresh=false;
data.messages='';
$('.woocommerce-checkout').unblock();
console.log('ABCL: 准备处理弹窗支付', paymentData);
requestAnimationFrame(function(){
handlePopupPayment(paymentData);
});
return;
}
if(originalSuccess){
originalSuccess.call(this, data, textStatus, jqXHR);
}};}});
$(document.body).on('checkout_place_order_abcl_gateway', function(event){
return true;
});
$(document.body).on('checkout_error', function(){
closePaymentModal();
});
}
function handlePopupPayment(paymentData){
console.log('ABCL: 启动弹窗支付模式', paymentData);
paymentMessageProcessed=false;
resetCheckoutFormState();
showPaymentModal();
var width=paymentData.popup_width||1200;
var height=paymentData.popup_height||800;
var dualScreenLeft=window.screenLeft!==undefined ? window.screenLeft:screen.left;
var dualScreenTop=window.screenTop!==undefined ? window.screenTop:screen.top;
var currentWidth=window.innerWidth
? window.innerWidth
: (document.documentElement.clientWidth ? document.documentElement.clientWidth:screen.width);
var currentHeight=window.innerHeight
? window.innerHeight
: (document.documentElement.clientHeight ? document.documentElement.clientHeight:screen.height);
var left=dualScreenLeft + Math.max(0, (currentWidth - width) / 2);
var top=dualScreenTop + Math.max(0, (currentHeight - height) / 2);
var windowFeatures='width=' + width +
',height=' + height +
',left=' + left +
',top=' + top +
',resizable=yes,scrollbars=yes,status=yes';
var paymentTimeout=setTimeout(function(){
if(paymentPopup&&!paymentPopup.closed){
console.log('ABCL: 支付超时');
updateModalStatus('warning', '⏱️ Payment is taking longer than expected, please verify the payment status');
var $modal=$('#abcl-payment-modal');
if(!$modal.find('.abcl-timeout-actions').length){
$modal.find('.abcl-modal-body').append(`
<div class="abcl-timeout-actions" style="margin-top: 20px;">
<button class="abcl-button abcl-button-primary" onclick="window.location.reload()">
Refresh the page to check the order
</button>
<button class="abcl-button" style="background: #f3f4f6; color: #666;" onclick="$('#abcl-payment-modal').fadeOut(300, function(){ $(this).remove(); })">
Close
</button>
</div>
`);
}}
}, 10 * 60 * 1000);
try {
paymentPopup=window.open(paymentData.popup_url, 'abcl_payment_window', windowFeatures);
if(!paymentPopup||paymentPopup.closed||typeof paymentPopup.closed==='undefined'){
clearTimeout(paymentTimeout);
showManualRedirect(paymentData.popup_url);
}else{
updateModalStatus('success', 'Payment window opened. Please complete the payment in the new window.');
var checkPopupClosed=setInterval(function(){
if(paymentPopup&&paymentPopup.closed){
clearInterval(checkPopupClosed);
clearTimeout(paymentTimeout);
setTimeout(function(){
if($('#abcl-payment-modal').is(':visible')){
updateModalStatus('warning', 'The payment window was closed. If you already finished the payment, please wait...');
setTimeout(function(){
closePaymentModal();
}, 5000);
}}, 500);
}}, 500);
}} catch (error){
clearTimeout(paymentTimeout);
console.error('ABCL: 打开弹窗失败', error);
handlePaymentError('Failed to open the payment window: ' + error.message);
}}
function showPaymentModal(){
console.log('ABCL: 显示支付模态框');
$('#abcl-payment-modal').remove();
var modalHtml=`
<div id="abcl-payment-modal" class="abcl-modal">
<div class="abcl-modal-overlay"></div>
<div class="abcl-modal-content">
<button class="abcl-modal-close" title="关闭">&times;</button>
<div class="abcl-modal-header">
<h3>Processing Your Payment</h3>
</div>
<div class="abcl-modal-body">
<div class="abcl-loader">
<div class="abcl-spinner"></div>
</div>
<p class="abcl-status-message">Opening the payment window, please wait...</p>
<!-- 手动跳转区域 -->
<div id="abcl-manual-redirect" style="display: none;">
<div class="abcl-warning-box">
<p><strong>⚠️ The browser blocked the popup</strong></p>
<p>Please click the button below to open the payment page manually:</p>
<a id="abcl-manual-payment-link" href="#" target="_blank" class="abcl-button abcl-button-primary">
<span>Open Payment Page</span>
</a>
<p class="abcl-hint">After completing the payment, please return to this page.</p>
</div>
</div>
</div>
<div class="abcl-modal-footer">
<p class="abcl-secure-text">🔒 Secure Payment</p>
</div>
</div>
</div>
`;
$('body').append(modalHtml);
$('body').addClass('abcl-modal-open');
$('#abcl-payment-modal').fadeIn(300);
$('#abcl-payment-modal .abcl-modal-close').on('click', function(){
if(confirm('Are you sure you want to cancel the payment? The order has already been created; please contact support if you need assistance.')){
if(paymentPopup&&!paymentPopup.closed){
paymentPopup.close();
}
closePaymentModal();
window.abclBlockRedirect=false;
}});
$('#abcl-payment-modal .abcl-modal-overlay').on('click', function(e){
e.stopPropagation();
$('#abcl-payment-modal .abcl-modal-content').addClass('shake');
setTimeout(function(){
$('#abcl-payment-modal .abcl-modal-content').removeClass('shake');
}, 500);
});
}
function updateModalStatus(type, message){
var $modal=$('#abcl-payment-modal');
var $statusMessage=$modal.find('.abcl-status-message');
var $loader=$modal.find('.abcl-loader');
$statusMessage.text(message);
if(type==='success'){
$loader.removeClass('error').addClass('success');
}else if(type==='error'){
$loader.removeClass('success').addClass('error');
}else if(type==='warning'){
$loader.hide();
}}
function showManualRedirect(url){
var $modal=$('#abcl-payment-modal');
$modal.find('.abcl-loader').hide();
$modal.find('.abcl-status-message').hide();
$modal.find('#abcl-manual-redirect').show();
$modal.find('#abcl-manual-payment-link').attr('href', url);
}
function closePaymentModal(){
window.abclBlockRedirect=false;
resetCheckoutFormState();
$('#abcl-payment-modal').fadeOut(300, function(){
$(this).remove();
$('body').removeClass('abcl-modal-open');
});
}
function handlePaymentMessage(event){
console.log('ABCL: 收到postMessage', event.origin, event.data);
console.log('ABCL: event.data类型:', typeof event.data);
console.log('ABCL: event.data.type:', event.data ? event.data.type:'undefined');
if(!event.data||event.data.type!=='abcl_payment_result'){
console.log('ABCL: 忽略非支付消息，data.type=' + (event.data ? event.data.type:'null'));
return;
}
if(paymentMessageProcessed){
console.log('ABCL: 消息已处理，忽略重复消息');
return;
}
paymentMessageProcessed=true;
console.log('ABCL: 开始处理支付结果');
var data=event.data;
console.log('ABCL: 支付状态', data.status);
if(paymentPopup&&!paymentPopup.closed){
console.log('ABCL: 关闭支付弹窗');
try {
paymentPopup.close();
} catch (e){
console.error('ABCL: 关闭弹窗失败', e);
}}
paymentPopup=null;
window.abclBlockRedirect=false;
console.log('ABCL: 已解除跳转保护');
if(data.status==='success'){
console.log('ABCL: 支付成功，准备跳转到', data.order_received_url);
updateModalStatus('success', '✅ Payment successful! Redirecting...');
setTimeout(function(){
$(window).off('beforeunload');
window.onbeforeunload=null;
if(data.order_received_url){
console.log('ABCL: 开始跳转');
window.location.href=data.order_received_url;
}else{
window.location.reload();
}}, 1000);
}else if(data.status==='cancelled'){
console.log('ABCL: 用户取消支付');
closePaymentModal();
$(document.body).trigger('abcl_payment_cancelled', data);
}else if(data.status==='failed'){
console.log('ABCL: 支付失败', data.message);
updateModalStatus('error', '❌ Payment failed');
handlePaymentError(data.message||'Unknown error');
setTimeout(function(){
closePaymentModal();
}, 3000);
}}
function handlePaymentError(errorMessage){
console.error('ABCL: 支付错误', errorMessage);
var $modal=$('#abcl-payment-modal');
$modal.find('.abcl-loader').hide();
$modal.find('.abcl-status-message').html(`
<div style="color: #ef4444; font-weight: 600; margin: 20px 0;">
❌ Payment Failed
</div>
<div style="color: #666; margin-bottom: 20px;">
${errorMessage}
</div>
`);
if(!$modal.find('.abcl-error-actions').length){
$modal.find('.abcl-modal-body').append(`
<div class="abcl-error-actions" style="margin-top: 20px;">
<button class="abcl-button abcl-button-primary" onclick="window.location.reload()">
Try Again
</button>
<button class="abcl-button" style="background: #f3f4f6; color: #666;" onclick="$('#abcl-payment-modal').fadeOut(300, function(){ $(this).remove(); })">
Cancel
</button>
</div>
`);
}
setTimeout(function(){
if($('#abcl-payment-modal').is(':visible')){
closePaymentModal();
}}, 30000);
}
function resetCheckoutFormState(){
var $form=$('form.checkout');
if(!$form.length) return;
$form.removeClass('processing');
$form.find(':input, button').prop('disabled', false);
$('#place_order').prop('disabled', false);
$('.woocommerce-error, .woocommerce-message, .woocommerce-info').removeAttr('role');
$('.woocommerce-checkout, form.checkout').unblock();
}
function handlePopupReturnIfNeeded(){
try {
var isPaymentWindow=window.name==='abcl_payment_window';
var hasOpener = !!window.opener&&!window.opener.closed;
if(!isPaymentWindow||!hasOpener){
return;
}
var currentPath=window.location.pathname||'';
var currentHash=window.location.hash||'';
var currentSearch=window.location.search||'';
var searchParams=new URLSearchParams(currentSearch);
var lowerHref=window.location.href.toLowerCase();
var isOrderReceived=currentPath.indexOf('/order-received/')!==-1||lowerHref.indexOf('/order-received/')!==-1;
var isCheckoutPage=currentPath.indexOf('/checkout')!==-1||lowerHref.indexOf('/checkout')!==-1;
if(isOrderReceived){
var orderReceivedUrl=window.location.href;
console.log('ABCL: 弹窗检测到订单完成页面，发送成功消息');
window.opener.postMessage({
type: 'abcl_payment_result',
status: 'success',
order_received_url: orderReceivedUrl
}, '*');
setTimeout(function(){
try {
window.close();
} catch (errSuccessClose){
console.error('ABCL: 关闭支付弹窗失败', errSuccessClose);
}}, 500);
return;
}
if(!isCheckoutPage){
return;
}
console.log('ABCL: 弹窗已返回checkout，发送取消消息并准备关闭');
window.opener.postMessage({
type: 'abcl_payment_result',
status: 'cancelled',
message: 'Payment window returned to checkout'
}, '*');
setTimeout(function(){
try {
window.close();
} catch (errCancelClose){
console.error('ABCL: 关闭支付弹窗失败', errCancelClose);
}}, 500);
} catch (error){
console.error('ABCL: 检测弹窗返回checkout时发生错误', error);
}}
})(jQuery);