一、背景
在做微信支付项目的时候,微信要求金额的单位必须为分,而数据库中订单金额单位是元,所以使用订单金额*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);
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。