开票接口返回 1004 价税合计与订单金额不一致,订单 99.99,发票明细三行税额分别四舍五入后合计 100.00。用户申请了三次都被打回。乍看像缓存或者权限的锅,追下去往往不是。
$totalTax = round($amount * 0.06 / 1.06, 2); $diff = $totalTax - array_sum($lineTax); $lineTax[$maxIdx] = round($lineTax[$maxIdx] + $diff, 2);
追下去是这么回事:税额按每行单独 round 到分,三行各自进位累积出一分误差,合计与订单总额对不上。开票平台要求明细合计严格等于价税合计。
「发票金额舍入」这类改动最怕改一半,回滚脚本先准备好,再动生产。一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。
先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。
具体做法是,先按总额算出总税额,再把差额调整到金额最大的那一行,保证合计相等;开票前在本地做一次合计校验,不等就调整再提交,别等平台返回 1004;调整逻辑写成独立函数,开红票时复用同一套规则。
验收就看一点,同一笔订单重复开票,明细合计与价税合计相等,接口返回成功。
