- A+
所属分类:常见问题
昨天为客户定制了根据用户组来限制coupon的使用。只有指定用户组可以使用,因为今天要弄活动。然后我开发测试可以。没有完成支付的测试。然后今天早上大批量的订单都是状态取消,客户紧急联系我处理。通过一早上的研究终于得到如下详情。
首先订单取消,先排除是支付的问题,跟踪支付代码,尝试手动更改状态,失败。说明是添加状态问题。
然后查看catalog下的model层order.php文件中的addOrderHistory方法,逐一排查。发现有可能是欺诈订单,去商店设置查看果然是这个状态。应该是这里没错,根据用户反馈是用了优惠券。于是查看model层关于优惠券的文件的confirm方法。得到如下代码
- public function confirm($order_info, $order_total) {
- $code = '';
- $start = strpos($order_total['title'], '(') + 1;
- $end = strrpos($order_total['title'], ')');
- if ($start && $end) {
- $code = substr($order_total['title'], $start, $end - $start);
- }
- if ($code) {
- $coupon_info = $this->getCoupon($code);
- if ($coupon_info) {
- $this->db->query("INSERT INTO `" . DB_PREFIX . "coupon_history` SET coupon_id = '" . (int)$coupon_info['coupon_id'] . "', order_id = '" . (int)$order_info['order_id'] . "', customer_id = '" . (int)$order_info['customer_id'] . "', amount = '" . (float)$order_total['value'] . "', date_added = NOW()");
- /* 忽略一些自己写的SQL */
- } else {
- return $this->config->get('config_fraud_status_id');
- }
- }
- }
发现应该问题就在这里,两个判断其中一个出问题。难道PHP版本导致函数弃用?查了第四行第五行的函数PHP4以上都支持才对。打印测试没问题。于是问题只能在getCoupon这个方法上了。这个方法是验证各种优惠券的设置。包括用户组的指定也是这里。
于是问题很明显就在getCoupon方法中了。然后去看这个方法,感觉哪里不对,比如cart方法不应该得到值,难道这个方法在这时候可以调取到什么?用户登陆这个不应该存在。也感觉不对。但是也要一个个排除,不能瞎猜。通过注释尝试过几次,感觉不是办法,可能是多个status都是false。于是还是用打印吧。通过打印得到几个问题。也证实了我前面猜想。于是这没法子解。只好重写了个方法,拿来验证支付后的优惠券验证。重写的方法利用订单信息来查询一些信息,拿来替换购物车或者用户用户组之类的验证。多写几个SQL就好了。