现象:支付网关已退一笔金额,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累计退款、网关累计退款和订单可退款余额完全一致。