这几天在 飞跃|Fly 联合 天津卫万事通网络有限科技公司 开发的一款小程序中在对接微信支付功能的时候出现了以下问题:
调用微信支付JSAPI的时候只能支付整数金额,如果支付带小数的金额那么就会报错:invalid total_fee
根据错误不难发现是因为total_fee不正确。
由于微信支付里的total_fee的单位是分。所以实际金额得乘以100。但是问题来了,前端传给后台是string型的,现在要乘以100,可能很多人跟我一样,首先想到的是把string转成Double型再乘以100,我就是这样做的,然后就报了上面的错。
那么这个点早就在后端:WxPay.API.php文件中实现了
/**
* @param string $out_trade_no
* @param string $openid
* @param int $amount
* @param int $time_out
* @return mixed
* @throws WxPayException
*/
public function transfers($data = [], $time_out = 10)
{
$url = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers';
$package = [
'mch_appid' => $this->appid,
'mchid' => $this->mch_id,
'partner_trade_no' => $data['out_trade_no'],
'openid' => $data['openid'],
'check_name' => 'NO_CHECK',
'amount' => $data['amount']=100,
'desc' => $data['desc'],
'spbill_create_ip' => strval($_SERVER['REMOTE_ADDR']),
'nonce_str' => self::getNonceStr(),
];
$package['sign'] = self::makeSign($package);
$xml = self::toXml($package);
$response = self::postXmlCurlPem($data['pem'], $xml, $url, $time_out);
// 校验
$data = self::fromXml($response);
return $data;
}
那么问题出在哪呢?我新在微信开发者工具中反复调试中发现:
parseFloat(t.detail.value).toFixed(2)
的结果,然后我发现,如果传过来的to为21.2,输出的结果是21.20,估计就是这个.0导致了上面的错误。
那也是说不能带小数点,得把小数部分去掉,可以用js自带的
Math.round()方法,写法如下:
var e = Math.round(parseFloat(t.detail.value)).toFixed(2), n = this.siteInfo
评论 (0)