You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PayPal智能按钮问题:无法禁用下单按钮及清空配送选项

问题分析

你的核心问题是:当检测到用户地址不支持配送时,仅调用actions.reject()只会触发PayPal的红色错误提示,但不会修改订单中已存在的默认英国配送选项,因此用户仍能选择旧选项完成下单。actions.reject()仅负责抛出错误提示,不具备更新订单数据或禁用按钮的能力,必须配合订单patch操作同步修改配送选项和金额,才能让PayPal界面正确响应。

修复方案
  1. 初始化shippingTotal变量:避免无配送选项时出现变量未定义的报错
  2. 空配送选项场景先执行patch:先清空订单的配送选项、更新运费金额,再触发错误提示,确保PayPal界面同步更新状态

修改后的代码如下:

var processPatches = function(data, shippingId, orderTotal, actions) {
    var patches = [];
    var shippingTotal = 0; // 初始化运费变量,避免未定义错误

    var options = [];

    if (data.options !== null && data.options !== undefined) {
        if (data.options.length == 0) {
            // 先构建patch清空配送选项并更新金额
            patches.push({
                op: "replace",
                path: '/purchase_units/@reference_id==\'default\'/amount',
                value: {
                    currency_code: "GBP",
                    value: orderTotal.toFixed(2),
                    breakdown: {
                        item_total: {
                            currency_code: "GBP",
                            value: orderTotal.toFixed(2)
                        },
                        shipping: {
                            currency_code: "GBP",
                            value: "0.00"
                        }
                    }
                }
            });

            patches.push({
                op: "replace",
                path: "/purchase_units/@reference_id=='default'/shipping/options",
                value: [] // 设置为空数组,让PayPal显示无可用选项
            });

            // 先执行patch更新订单,再触发reject显示错误
            return actions.order.patch(patches).then(function() {
                return actions.reject();
            });
        }

        var found = false;
        for (var i = 0; i < data.options.length; i++) {
            var obj = {
                id: data.options[i].id,
                label: data.options[i].label,
                amount: {
                    value: data.options[i].value,
                    currency_code: "GBP"
                }
            };

            if (data.options[i].id == shippingId) {
                obj.selected = true;
                found = true;
                shippingTotal = parseFloat(data.options[i].value);
            } else
                obj.selected = false;

            options.push(obj);
        }

        if (!found && options.length > 0) {
            options[0].selected = true;
            shippingTotal = parseFloat(options[0].value);
        }
    }

    patches.push({
        op: "replace",
        path: '/purchase_units/@reference_id==\'default\'/amount',
        value: {
            currency_code: "GBP",
            value: (orderTotal + shippingTotal).toFixed(2),
            breakdown: {
                item_total: {
                    currency_code: "GBP",
                    value: orderTotal.toFixed(2)
                },
                shipping: {
                    currency_code: "GBP",
                    value: shippingTotal.toFixed(2)
                }
            }
        }
    });

    if (data.options !== null && data.options !== undefined) {
        console.log("address changed");
        patches.push({
            op: "replace",
            path: "/purchase_units/@reference_id=='default'/shipping/options",
            value: options
        });
    }

    return actions.order.patch(patches);
};
关键修改点说明
  • 初始化shippingTotal:防止在无配送选项时出现变量未定义的报错,保证patch操作正常执行
  • 空选项时先执行patch:通过replace操作将shipping/options设为空数组,同时把运费金额改为0,强制PayPal界面更新为「无可用配送选项」状态
  • patch后再调用actions.reject():先完成订单数据的同步更新,再触发错误提示,此时PayPal会自动禁用「继续购买」按钮,用户无法继续下单

内容的提问来源于stack exchange,提问作者Stuart Palmer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 04:21:32