opencart关于coupon使用导致支付后订单欺诈的研究

  • A+
所属分类:常见问题

昨天为客户定制了根据用户组来限制coupon的使用。只有指定用户组可以使用,因为今天要弄活动。然后我开发测试可以。没有完成支付的测试。然后今天早上大批量的订单都是状态取消,客户紧急联系我处理。通过一早上的研究终于得到如下详情。

首先订单取消,先排除是支付的问题,跟踪支付代码,尝试手动更改状态,失败。说明是添加状态问题。

然后查看catalog下的model层order.php文件中的addOrderHistory方法,逐一排查。发现有可能是欺诈订单,去商店设置查看果然是这个状态。应该是这里没错,根据用户反馈是用了优惠券。于是查看model层关于优惠券的文件的confirm方法。得到如下代码

  1. public function confirm($order_info$order_total) {
  2.         $code = '';
  3.         $start = strpos($order_total['title'], '(') + 1;
  4.         $end = strrpos($order_total['title'], ')');
  5.         if ($start && $end) {
  6.             $code = substr($order_total['title'], $start$end - $start);
  7.         }
  8.         if ($code) {
  9.             $coupon_info = $this->getCoupon($code);
  10.             if ($coupon_info) {
  11.                 $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()");
  12.                  /* 忽略一些自己写的SQL */
  13.             } else {
  14.                 return $this->config->get('config_fraud_status_id');
  15.             }
  16.         }
  17.     }

发现应该问题就在这里,两个判断其中一个出问题。难道PHP版本导致函数弃用?查了第四行第五行的函数PHP4以上都支持才对。打印测试没问题。于是问题只能在getCoupon这个方法上了。这个方法是验证各种优惠券的设置。包括用户组的指定也是这里。

于是问题很明显就在getCoupon方法中了。然后去看这个方法,感觉哪里不对,比如cart方法不应该得到值,难道这个方法在这时候可以调取到什么?用户登陆这个不应该存在。也感觉不对。但是也要一个个排除,不能瞎猜。通过注释尝试过几次,感觉不是办法,可能是多个status都是false。于是还是用打印吧。通过打印得到几个问题。也证实了我前面猜想。于是这没法子解。只好重写了个方法,拿来验证支付后的优惠券验证。重写的方法利用订单信息来查询一些信息,拿来替换购物车或者用户用户组之类的验证。多写几个SQL就好了。

最后,有需要的客户可以联系我付费解决这个问题。QQ:184923973   QQ群:50415210

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: