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

Sylius:新增礼品卡处理器后传递给Stripe的订单总金额错误

问题原因
  • 核心原因:自定义礼品卡调整类型未被Stripe支付的金额计算逻辑识别。Sylius默认的Stripe集成计算支付金额时,仅会累加系统默认的调整类型(如运费、税费、通用折扣等),不会自动包含你新增的ORDER_GIFT_CARD_ADJUSTMENT自定义调整类型,所以计算支付金额时直接跳过了礼品卡抵扣部分。
  • 次要原因:处理器优先级配置不合理。你当前给礼品卡处理器设置的优先级为5,如果Stripe支付触发时的金额获取动作早于你的处理器执行,也会拿到未抵扣的金额,不过你已经确认数据库中订单总金额正确,所以该情况概率较低。
修复方案

1. 补充调整属性配置

在你创建礼品卡调整的代码中,补充设置调整的属性,确保调整的计算规则符合预期:
找到GiftCardProcessor.php中创建调整的代码段,补充两行配置:

$adjustment->setType(Adjustment::ORDER_GIFT_CARD_ADJUSTMENT);
$adjustment->setAmount(-$amount);
$adjustment->setLabel($this->translator->trans('gift_card.ui.gift_card'));
// 新增以下两行
$adjustment->setNeutral(false); // 标记该调整会影响订单总价
$adjustment->setIncluded(false); // 标记该调整未包含在商品/运费原有金额中,需单独抵扣

2. 修改Stripe支付金额取数逻辑

你需要修改Stripe集成中获取订单支付金额的逻辑,优先使用订单已计算完成的总金额,而非自行累加各部分金额:
如果使用的是Sylius官方Stripe插件,可通过重写PaymentAmountProvider服务,直接返回订单已经计算完成的总金额即可:
示例代码:

// 重写后的支付金额提供类
public function getAmount(OrderInterface $order): int
{
    // 直接返回订单已计算完成的总金额,避免自行累加漏掉自定义调整
    return $order->getTotal();
}

如果你需要保留原有累加逻辑,也可以在原有计算结果基础上叠加礼品卡调整的总金额:

public function getAmount(OrderInterface $order): int
{
    $originalCalculatedAmount = parent::getAmount($order);
    $giftCardAdjustmentTotal = $order->getAdjustmentsTotal(Adjustment::ORDER_GIFT_CARD_ADJUSTMENT);
    return $originalCalculatedAmount + $giftCardAdjustmentTotal;
}

3. (可选)调整处理器优先级

如果后续出现执行顺序问题,可以将礼品卡处理器的优先级调高,确保在所有金额计算相关处理器之前执行:
修改services.yaml中的优先级配置:

tags:
    - { name: sylius.order_processor, priority: 100 }

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 02:36:01