这次的现象很具体:结账右侧有“包装费 10 元”,应付总额也增加了 10 元,支付成功后后台订单却没有包装费,发票金额又少了 10 元。

前端组件不是事实来源。它只把 Quote Totals 中的一段数据显示出来;订单创建时并不会自动猜测哪个自定义 segment 需要持久化。

环节需要存在的内容
Quote计算 Total Collector设置base与display金额
数据库 quote、sales_order及需要的invoice/creditmemo字段
转换 Quote到Order显式传值
后续单据 开票、退款、邮件和PDF读取同一规则

先查支付前 Quote 与创建后的 Order:

SELECT entity_id, grand_total, base_grand_total, custom_fee, base_custom_fee
FROM quote WHERE entity_id = :quote_id;

SELECT entity_id, grand_total, base_grand_total, custom_fee, base_custom_fee
FROM sales_order WHERE quote_id = :quote_id;

Quote 正确而 Order 为空,问题在字段声明或转换;Quote 自己就为空,前端可能只是临时拼了显示值。

金额字段必须同时处理基础币种与订单币种,并明确税前、税后及折扣顺序。只加到 grand_total 会造成明细和总额对不上;只保存展示币种会让多币种退款无法还原。

我会这样验收

  • 费用适用与不适用的商品各下一单;
  • 切换币种后核对 base/display 两组金额;
  • 部分开票、部分退款,确认费用是否按设计分摊;
  • 重复 collectTotals 不得把费用累加两次。

最后再看支付网关请求。如果 Magento 订单总额与网关捕获金额不同,不能只在后台补一列,而要重新核对费用进入 grand total 的时点。