管理员创建 Credit Memo 时看到“Refund Online”和“Refund Offline”,如果选错,后台都可能显示已退款,但支付平台结果完全不同。在线退款调用支付模块的 refund/capture 交易;离线退款只在 Magento 记录财务变化,通常用于已经在外部完成退款或无需网关处理的场景。

先确认订单支付能力

支付方法是否支持 online refund、invoice 是否在线捕获、transaction 是否有可退款余额,决定按钮和执行。授权未捕获、已过退款期或网关交易 ID 缺失时,不能假设在线一定可用。

退款前记录三组金额

订单 paid/refunded、invoice 可退款、支付平台 captured/refunded。部分退款还要核对税、运费、折扣和手续费。币种站点同时记录 base 与 order currency,避免把汇率差当成少退款。

网关超时是未知结果

请求超时不代表退款失败,平台可能已受理。不要立刻重试;先按幂等键或交易查询接口确认。支付模块应保存网关 refund transaction ID,并使相同 Credit Memo 重放不会再次退款。

离线退款的正确使用

已经在支付后台人工退过款,再在 Magento 选择 Offline 记录对账是合理流程;若选择 Online,就可能重复退款。反过来,尚未在外部退款却选 Offline,客户不会收到钱。后台权限和操作提示应明确,敏感金额操作要有审核与历史。

库存是独立决定

Return to Stock 与在线/离线支付退款不是同一个开关。退钱可以不退货,退货入库也可能在仓库验收后发生。修复流程时分别设计财务、库存与邮件动作。

测试全额、部分、运费、外币、超时重试和已外部退款场景;最终 Magento Credit Memo、payment transaction 和平台账单三方金额一致,且同一退款事件只有一次。

交易记录怎么对账

查询 sales_payment_transaction,确认 txn_id、parent_txn_id、txn_type、is_closed 与附加信息。在线退款应产生与 capture 关联的 refund transaction;离线记录不应伪造网关 txn_id。支付扩展若把多个退款复用同一 ID,会导致后续查询和幂等失效。

权限与审计

只有授权角色可执行退款,金额、原因、操作者、时间和外部凭证要进入订单历史。高金额可增加双人审核。不要在 comment 中粘贴完整网关响应,其中可能含客户与商户敏感数据。

Webhook 的后续更新

有些网关退款先 accepted,稍后 Webhook 才确认 succeeded/failed。Magento 不应在 accepted 时永久标记最终成功,也不能让失败回调重复生成 Credit Memo。为退款建立状态机,并处理乱序、重复和部分成功。

部分退款的数量和税费

Credit Memo 可按商品数量、运费、调整退款和调整费用计算。网关通常只接收最终金额,不理解 Magento 的行级原因;金额、币种和小数精度必须与 capture 余额一致。多次部分退款之和不能超过已捕获金额,最后一次的舍入差额要可解释。