PayPal智能按钮问题:无法禁用下单按钮及清空配送选项
问题分析
你的核心问题是:当检测到用户地址不支持配送时,仅调用actions.reject()只会触发PayPal的红色错误提示,但不会修改订单中已存在的默认英国配送选项,因此用户仍能选择旧选项完成下单。actions.reject()仅负责抛出错误提示,不具备更新订单数据或禁用按钮的能力,必须配合订单patch操作同步修改配送选项和金额,才能让PayPal界面正确响应。
修复方案
- 初始化
shippingTotal变量:避免无配送选项时出现变量未定义的报错 - 空配送选项场景先执行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
相关产品推荐
相关产品推荐

