复盘微信支付金额不正确问题—PHP浮点型计算

喝醉的清茶

一、背景

在做微信支付项目的时候,微信要求金额的单位必须为分,而数据库中订单金额单位是元,所以使用订单金额*100是正确的做法,但是会经常出现少一分钱的状况,这是为什么呢?

image.png

二、排查过程

订单支付金额的计算非常复杂,所以单位转化为分之后再转化为整型,可以保证微信支付参数不出错,也是正确的做法。

但这里面隐藏了一个问题,还记得我们问题发生的条件必须是“购买某商品时”吗?如果单独购买这个商品的话,订单的金额是19.9。我们可以尝试:

echo (int)(19.9 * 100); // 结果为1989,而非1990

这就导致了订单创建时给微信的支付数据是1990,而再次支付时却是1980,所以接口返回了“订单号重复”的错误。

此时我们会发现少了一分钱,为什么呢?让我们看一下PHP官方文档来了解一下。

image.png

三、解决方案

方法一 $total_fee = (int)(($order_money + 0.00001) * 100);  
方法二 $total_fee = (int)bcmul($order_money, 100);
阅读 829

喝醉的清茶
技术~ 生活~
165 声望
15 粉丝
0 条评论
你知道吗?

165 声望
15 粉丝
宣传栏