微信回调成功,订单状态未改变,大家及时更改。

bug问题 · Axin · 于 5年前 发布 · 2184 次阅读

记一次生产环境,微信回调不能更改订单状态事件。

不知道新版fecshop 1.6会不会。大家自己对应下

环境说明

fecshop 1.4.6.1

步骤说明

找到文件路径:

vendor\fancyecommerce\fecshop\services\payment\Wxpay.php

代码片段:

// 127行
\Yii::info('check order totla amouont['.($order_total_amount * 100).' == '.$total_fee.']', 'fecshop_debug');
// 微信支付的人民币单位为分
if(($order_total_amount * 100) != $total_fee){
	return false;
}

改为

注:前提安装PHP BC高精确度函数库
// 微信支付的人民币单位为分
if(bccomp($order_total_amount * 100, $total_fee) !== 0){
	return false;
}

继...

中午修改好,晚上又出现十几单订单状态未改变问题,跟踪日志:

日志如下

2018-12-18 17:27:28 Array[info][fecshop_debug] check order totla amouont[3221 == 3220]

检查代码

 // 还是浮点数运算问题
 文件位置:vendor\fancyecommerce\fecshop\services\page\Currency.php
 // 行144
 return ceil($price * $rate * 100) / 100;
 改为
 return bcmul($price, $rate, 2);
 
 错误示例:
 $increment_id = '201812181612631100000982';
 $this->_order = Yii::$service->order->getByIncrementId($increment_id);
 $base_grand_total = $this->_order['base_grand_total'];
 var_dump($base_grand_total);//string(5) "32.20"
 $order_total_amount = Yii::$service->page->currency->getCurrencyPrice($base_grand_total, 'CNY');
 var_dump($order_total_amount);//float(32.21)
 
 其他位置的运算,都要看下。

本文由 Axin 创作,采用 知识共享署名 3.0 中国大陆许可协议 进行许可。 可自由转载、引用,但需署名作者且注明文章出处。

共收到 13 条回复 技术分享
Fecmall#15年前 0 个赞

有没有打印一下 $order_total_amount * 100 $total_fee 的值?

另外你的性能优化解决了?

Axin#25年前 0 个赞

说明:

// PHP 浮点数运算问题
记:永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等。如果确实需要更高的精度,应该使用任意精度数学函数
示例代码:

// 举例
$base_grand_total = 64.82;
$total_fee = 6482;

$order_total_amount = Yii::$service->page->currency->getCurrencyPrice($base_grand_total, 'CNY');

var_dump(($order_total_amount * 100));//float(6482)

var_dump(($order_total_amount * 100) == $total_fee);//false
Axin#35年前 0 个赞

性能优化,已经解决。谢谢作者

原来那篇帖子,作者可删除了,我这边看了下没有权限,因为作者你已经概括全面了。

按你的帖子做就行了

Fecmall#45年前 0 个赞

为这个问题,安装个php扩展有点动作太大

将:https://github.com/fecshop/yii2_fecshop/blob/master/services/payment/Wxpay.php#L138

改成

if (round($order_total_amount * 100) != round($total_fee) {

试一下可以不?

successgo#55年前 0 个赞

使用 bc 系统函数更靠谱些。

题外话,或者干脆使用分为单位,像微信的做法,就不会出现小数的问题。

Fecmall#65年前 0 个赞

@successgdc #5楼 不能使用,fec是多货币

@Axin #3楼 改为使用bc函数,这个库php里面默认就有,多谢你的提议,我修正下代码

successgo#75年前 0 个赞

@Fecshop 其实把需要做的改进工作或者发现的问题,先发到 git issue 里面,如果有时间可以自己修复,如果没有时间,可以让别人帮忙修复,可以让热心的伙伴更容易的融入我们整个的开源中来。

Fecmall#85年前 0 个赞

恩,你的提议很好

执行起来总是有一定的偏差,我想的是这样,fecshop作为主体,后面除了修复bug,基本不变动了,如果想做其他的功能,可以以扩展composer包的方式做开发,这样各自独立,fecshop作为一个电商框架,除了修复bug和安全问题,不做新功能了

github搜搜了一下,有几个fecshop插件:

https://github.com/kaykay012/paymentsk

https://github.com/zks888/fecshop_couchbase

https://github.com/kaykay012/migration

Fecmall#105年前 0 个赞

@successgdc #7楼

fecshop尽量精简,本来想在上面做一个后台配置,然后可以把在配置文件中的配置改成在后台配置,执行的过程中发现做了后,会让使用更加的复杂,所以就放弃了。

对于扩展,小的可以称之为插件扩展之类,大的可以称之为扩展系统,我后面也会写一些模板和插件之类的。

successgo#115年前 0 个赞

Fecshop 目前趋于稳定,但是在我使用这几个月以来,发现 Fecshop 还需要以下几点:

代码规范化

让 Fecshop 更加适合插件化开发(学习 wordpress 丰富的插件生态)

successgo#125年前 0 个赞

有一点点跑题了呢

Fecmall#135年前 0 个赞

@successgdc #11楼

恩,细细调整,有好的方式,可以发PR,提交bug也可以在github issue提

添加回复 (需要登录)
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册
Your Site Analytics