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

48次阅读

共计 439 个字符,预计需要花费 2 分钟才能阅读完成。

一、背景

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

二、排查过程

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

但这外面暗藏了一个问题,还记得咱们问题产生的条件必须是“购买某商品时”吗?如果独自购买这个商品的话,订单的金额是 19.9。咱们能够尝试:

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

这就导致了订单创立时给微信的领取数据是 1990,而再次领取时却是 1980,所以接口返回了“订单号反复”的谬误。

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

三、解决方案

 办法一 $total_fee = (int)(($order_money + 0.00001) * 100);  
办法二 $total_fee = (int)bcmul($order_money, 100);

正文完
 0