网关后台显示Capture成功,Magento订单仍Processing/Pending Payment且没有Invoice。第一原则是停止自动重试支付,避免二次扣款。
定位与修复记录
1. 固定复现范围
用订单号、网关transaction_id和金额在两边对账。确认Capture确实settled/authorized-captured,而不是只创建了authorization。
2. 确认真实原因
查sales_payment_transaction与order_payment中的last_trans_id、amount_paid。已有capture交易但无Invoice,说明回调在保存Invoice前中断;完全无交易记录则先安全补录网关事实。
3. 执行修复
通过InvoiceService为可开票数量创建Invoice,设置capture case为NOT_CAPTURE并关联现有transaction_id,注册后在数据库事务中保存Invoice与Order。绝不能调用CAPTURE_ONLINE。
4. 恢复后处理
把补救脚本限制到一个明确订单,执行前输出dry-run信息并备份。随后修复Webhook幂等与事务边界,让重复回调只返回成功。
SELECT entity_id,increment_id,state,status,total_paid,total_invoiced FROM sales_order WHERE increment_id='000000123';
SELECT txn_id,txn_type,parent_txn_id,is_closed,additional_information FROM sales_payment_transaction WHERE order_id=:order_id;
SELECT entity_id,increment_id,state,grand_total FROM sales_invoice WHERE order_id=:order_id;验收清单
- 补建后total_paid、total_invoiced与网关Capture金额一致,只出现一个capture transaction;退款入口可用且客户只收到一次发票邮件。
- 金额或币种对不上时不要自动补Invoice,先交由财务和支付负责人确认。

