PAYATHON 2026

如何在 JavaScript if 条件中处理 Paylike popup 的 closed 值

支付小周

结论

"closed" 是回调函数 err 参数的值,需要在处理其他错误之前判断:

function (err, res) {
    if (err === 'closed') {
        window.location.href = '/preview';
        return;
    }

    if (err) {
        console.error(err);
        return;
    }

    const txn = res.transaction.id;
    console.log(txn);

    // 继续处理支付成功逻辑
}

原因

原代码有三个问题:

  1. console.log(err) 只会输出内容,它的返回值是 undefined,不能用来获取 "closed":
var action = console.log(err); // action 是 undefined
  1. 回调函数一开始遇到 err 就会执行 return:
if (err)
    return console.log(err);

因此,当 err 为 "closed" 时,函数已经结束,后面的判断没有机会执行。

  1. if (action = 'closed') 中的 = 是赋值运算符,不是比较运算符。严格比较应该使用 ===:
if (action === 'closed') {
    // ...
}

推荐写法

先处理 popup 被关闭的情况,再处理其他错误。没有错误时,继续执行支付成功逻辑:

function (err, res) {
    if (err === 'closed') {
        // Popup 被用户关闭
        window.location.href = '/preview';
        return;
    }

    if (err) {
        // 其他错误
        console.error('Payment error:', err);
        return;
    }

    // 支付成功
    const txn = res.transaction.id;
    console.log('Transaction ID:', txn);

    // 后续业务逻辑
}

把 '/preview' 换成实际的 preview page 地址,例如:

window.location.href = '/checkout/preview';

如果 preview page 是浏览器历史记录中的上一页,也可以使用:

window.history.back();

不过,history.back() 依赖用户的浏览历史,上一页未必是 preview page。在业务流程中,使用明确的 URL 通常更可靠。

如果 err 不是字符串

上面的代码假设 err 的实际值是字符串 "closed"。如果控制台显示的是一个对象,例如:

{
    message: 'closed'
}

就需要判断对象中的对应属性:

if (err && err.message === 'closed') {
    window.location.href = '/preview';
    return;
}

可以先查看 err 的真实类型和结构:

console.log(err);
console.log(typeof err);

不要根据 console.log() 的返回值进行判断。应该直接判断回调参数 err,或者判断它的具体属性。

备注:内容仅供参考。