背景
今天测试支付宝扫码支付时,出现了这个问题
首先,我们的业务场景是售卖机,Android端,通关选取商品后,下单点击支付方式,选择支付宝 此时,无法显示支付二维码 描述如下:
通过线上报错信息发现,提示错误:ACQ.INVALID_PARAMETER,其实就是 “非法的订单总金额格式”
而且,
注意到:当金额为 0.03、0.04 时才报错,0.01、0.02、0.05 元都正正常运行
但是,
本地测试时,无法复现线上情况,
于是进行支付金额的打印、比对,排查问题所在 ...
分析、解决
Window10
与 Linux
的系统差异
float(0.04) //支付金额
object(stdClass)#173 (2) {
["alipay_trade_precreate_response"]=>
object(stdClass)#172 (4) {
["msg"]=>
string(15) "Business Failed"
["code"]=>
string(5) "40004"
["sub_msg"]=>
string(42) "参数无效:订单总金额格式错误"
["sub_code"]=>
string(21) "ACQ.INVALID_PARAMETER"
}
["sign"]=>
string(344) "WMtAqprkfNUnS9zXiSRdenpsZ7sHjgV1SUcejTSWNDQ/GGYZCTqJDW3QCxARJna0L1IMpNCaCiK4+8cJt7mgHJ1HJEKCR8B9qKylQqG7s4vZD+SJpgYxDZTkdYUW9m4OxbOvJn599LCdliDkz0VLIiXHO54jOxULgsa3GtHqup6xkiDsT5zBQafFm9XRofoOoyXBlkNGfDo80t2rdab6O4ligMZlPeGQYxLfG08RUTzvKgIuacunwdxT06yFPqr53l/3IolVGSRi4byGPSXpNOcHrjjuNmG+DQFrM8/sy0R9lw296fRC43Y/8qDFwYiuqLkI5kmmYB89Ka/GfzUrkg=="
}
0.01
、0.02
就没问题、0.03
、0.04
就无法通过
floatval()
强制转化存在误差、于是使用了 sprintf()
强制两位小数形式转化
幸运的是,再次测试,完美解决.
希望能帮到有需要的道友 …
//订单总价
$orderTotal = floatval(array_sum(array_column($cartList, 'total')));
$orderTotal = sprintf("%.2f",$orderTotal);