现象:支付网关已退一笔金额,Magento Credit Memo却多退或少退。必须先区分基础币种、订单币种、税、运费和Adjustment。
| 阶段 | 具体操作 |
|---|---|
| 取证 | 比对sales_creditmemo的base_grand_total/grand_total与网关退款币种和最小货币单位,确认没有把分当元。 |
| 定位 | 部分退款按订单行可退款数量创建,税与折扣使用Magento计算结果;不要在网关回调再次手工创建第二张Credit Memo。 |
| 修复 | 运费退款和Adjustment Positive/Negative分别记录业务原因,网关只发送最终允许的金额。 |
| 复核 | 以网关transaction_id做幂等;结果未知时先查询网关,不能超时就再次refund。 |
可执行检查
SELECT increment_id,base_grand_total,grand_total,shipping_amount,tax_amount,discount_amount,adjustment_positive,adjustment_negative FROM sales_creditmemo WHERE order_id=:order_id;SELECT txn_id,txn_type,parent_txn_id,is_closed FROM sales_payment_transaction WHERE order_id=:order_id;
通过标准:全额、部分、仅运费及重复回调测试中,Magento累计退款、网关累计退款和订单可退款余额完全一致。

