前言
最近公司某小伙子做了一个商城的微信支付相关的接口,其中包含退款,在测试过程中发现部分单据没有退款,微信支付提示退款金额跟支付金额不匹配(大于支付金额),检查数据库和调试过程中,发现商品的单价和手工计算出来的总价是跟订单金额匹配的,实在无法确认问题原因最终bug转向我来排查,于是有了此文
排查
由于手工计算出来的金额跟实际支付的金额是能匹配上的,所以一开始我以为是订单已经进行了部分退款,再次全部退款的话肯定会被微信阻止,因为这样的话就会出现超退。
第一步:是否已经部分退款
去微信支付平台排查是否有退款,结果发现并没有退款
由于微信平台没有查询到此单的退款,那么说明不是超退的问题,可能是传入的订单金额有问题,但是大部分单据又可以退款,所以也暂时陷入了僵局,不过为了保险起见,还是去看了一下传参处
第二步:检查传参
检查微信退款方法传参时,看了传入参数,由于微信传参的单位是分,所以看到传参处传入退款总金额代码(int)(100)*商品单价*退货数量(这里只是伪代码,多个商品肯定还要相加计算的),粗略一看没有问题,仔细一看不对,总价是直接double类型的乘以数量在乘以100再强转为int类型传入的,按照理论上来说是没有问题的,因为我们商品价格都是精确到分的,但是只是理论上,实际上就是Java的double类型有个大坑(不只是Java,JavaScript,c#等很多语言都有这个问题)