问题描述
今天上班,技术客服反馈系统无法给微信支付用户退款,提示:“订单金额或退款金额与之前请求不一致,请核实后再试”。
问题排查
根据提供信息查询日志发现确实有这样的问题。首先排查了订单支付数据没有问题,其次看了是否有没有同事修改了代码。在排查代码的过程中发现关于退款金额的计算有些奇怪,php实现的部分代码如下:
<?php
...
return $payment->refund->byOutTradeNumber(
$order->id,
'REFUND' . $order->id,
$fee * 100,
$refund_fee ? $refund_fee * 100 : $fee
);
...
?>
byOutTradeNumber方法的第三、四参数要求是int型,而传递过来的$fee参数是string类型,发生类型强制转换就出问题了。
通过以下示例代码来复现一下:
<?php
$fee = "32.80";
var_dump($fee); // string(5) "32.80"
var_dump(floatval($fee)); // float(32.8)
var_dump(floatval($fee) * 100); // float(3280)
var_dump($fee * 100); // float(3280)
var_dump((int)($fee * 100)); // int(32