共计 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);
正文完