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

Magento 2.2.7单步结账:添加折扣码后强制更新配送方式

在Magento 2.2.7单步结账中添加折扣码后强制刷新配送方式

在Magento 2.2.7的单步结账场景里,我遇到过用户添加免运费这类折扣码后,配送方式列表不会自动更新的问题——明明折扣已经生效,但用户还是看不到对应的配送选项。后来通过重写优惠券应用的核心逻辑,在折扣码成功生效后强制触发配送信息的重新获取,完美解决了这个问题,分享给你:

完整代码实现

define([
    'ko',
    'jquery',
    'Magento_Checkout/js/model/quote',
    'Magento_Checkout/js/model/resource-url-manager',
    'Magento_Checkout/js/model/error-processor',
    'Magento_SalesRule/js/model/payment/discount-messages',
    'mage/storage',
    'mage/translate',
    'Magento_Checkout/js/action/get-payment-information',
    'Magento_Checkout/js/model/totals',
    'Magento_Checkout/js/model/full-screen-loader'
], function (
    ko,
    $,
    quote,
    urlManager,
    errorProcessor,
    messageContainer,
    storage,
    $t,
    getPaymentInformationAction,
    totals,
    fullScreenLoader
) {
    'use strict';

    return function (couponCode, isApplied) {
        var quoteId = quote.getQuoteId(),
            url = urlManager.getApplyCouponUrl(couponCode, quoteId),
            message = $t('Your coupon was successfully applied!!');

        fullScreenLoader.startLoader();

        return storage.put(
            url,
            {},
            false
        ).done(function (response) {
            var deferred;

            if (response) {
                isApplied(true);
                totals.isLoading(true);
                // 触发支付/配送信息的重新获取,这是强制刷新配送方式的核心
                deferred = $.Deferred();
                getPaymentInformationAction(deferred);

                $.when(deferred).done(function () {
                    fullScreenLoader.stopLoader();
                    totals.isLoading(false);
                    console.log("配送方式已更新");
                });

                messageContainer.addSuccessMessage({
                    'message': message
                });
            }
        }).fail(function (response) {
            fullScreenLoader.stopLoader();
            totals.isLoading(false);
            errorProcessor.process(response, messageContainer);
        });
    };
});

关键逻辑拆解

  • 核心刷新触发点:
    getPaymentInformationAction是实现配送方式刷新的关键,它会向后端请求最新的订单支付与配送信息——包括折扣码生效后符合条件的所有配送选项,相当于强制让系统重新计算并返回当前订单的配送方式列表。

  • 异步流程处理:
    用$.Deferred()来管理异步请求的状态,确保只有在后端返回最新配送信息后,才关闭加载遮罩并结束加载状态,避免用户看到未更新的内容。

  • 用户体验优化:
    通过fullScreenLoader和totals.isLoading标记加载状态,既防止用户重复操作,也能让用户直观感受到系统正在更新信息。

你只需要把这段代码替换Magento默认的Magento_SalesRule/js/action/apply-coupon文件,或者通过requirejs映射规则重写该模块,就能实现添加折扣码后自动刷新配送方式的效果。

内容的提问来源于stack exchange,提问作者Dario Vranjković

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:24:04