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

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

喝醉的清茶发布于 2020-11-12

一、背景

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

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

二、排查过程

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

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

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

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

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

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

三、解决方案

方法一 $total_fee = (int)(($order_money + 0.00001) * 100);

方法二 $total_fee = (int)bcmul($order_money, 100);

php微信支付浮点数

阅读 385发布于 2020-11-12

本作品系原创,采用《署名-非商业性使用-禁止演绎 4.0 国际》许可协议


喝醉的清茶

技术~ 生活~

avatar

喝醉的清茶

欢迎关注微信公众号:

165 声望

4 粉丝

0 条评论

得票时间

avatar

喝醉的清茶

欢迎关注微信公众号:

165 声望

4 粉丝

宣传栏

一、背景

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

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

二、排查过程

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

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

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

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

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

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

三、解决方案

方法一 $total_fee = (int)(($order_money + 0.00001) * 100);

方法二 $total_fee = (int)bcmul($order_money, 100);

以上是 【php】复盘微信支付金额不正确问题—PHP浮点型计算 的全部内容, 来源链接: utcz.com/a/111871.html

回到顶部