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
相关产品推荐
相关产品推荐

