解决修改积分发放时机的问题

2016-07-07 15:06 来源:www.chinab4c.com 作者:ecshop专家

我先帮大家整理一下修改思路:

  • 修改有关发货动作的代码,删除积分发放的相关代码
  • 修改所有涉及到处理积分的动作,正确处理积分的加减
  • 修改用户点击“确认收货”的执行代码,增加积分发放的代码

写的还够明白吧?

其实发放积分的时机一旦改变,则所有相关的操作都要修改,不然就可能出现问题,例如本来不该减的积分减去了,本来应该加的积分加不上了!呵呵

回答:
接下来还是这个order.php文件,搜索这句代码:

  1. /* 设为未发货 */
  2. elseif ('unship' == $operation)
复制代码


为什么修改它呢,因为现在已经不能简单的处理积分了,应该加上个条件,来区分当前情况下是不是需要修改积分!下面是改完后的代码:

  1. /* 设为未发货 */
  2. elseif ('unship' == $operation)
  3. {

  4. if($order['shipping_status'] == SS_SHIPPED)
  5. {
  6. /* 标记订单为“未发货”,更新发货时间 */
  7. update_order($order_id, array('shipping_status' => SS_UNSHIPPED, 'shipping_time' => 0));

  8. /* 记录log */
  9. order_action($order['order_sn'], $order['order_status'], SS_UNSHIPPED, $order['pay_status'], $action_note);

  10. /* 如果使用库存,则增加库存 */
  11. if ($_CFG['use_storage'] == '1' && $_CFG['stock_dec_time'] == SDT_SHIP)
  12. {
  13. change_order_goods_storage($order['order_id'], false);
  14. }

  15. /* 清除缓存 */
  16. clear_cache_files();
  17. }elseif($order['shipping_status'] == SS_RECEIVED)
  18. {
  19. /* 标记订单为“未发货”,更新发货时间 */
  20. update_order($order_id, array('shipping_status' => SS_UNSHIPPED, 'shipping_time' => 0));

  21. /* 记录log */
  22. order_action($order['order_sn'], $order['order_status'], SS_UNSHIPPED, $order['pay_status'], $action_note);
  23. /* 如果订单用户不为空,计算积分,并退回 */
  24. if ($order['user_id'] > 0)
  25. {
  26. /* 取得用户信息 */
  27. $user = user_info($order['user_id']);

  28. /* 计算并退回积分 */
  29. $integral = integral_to_give($order);
  30. log_account_change($order['user_id'], 0, 0, (-1) * intval($integral['rank_points']), (-1) * intval($integral['custom_points']), sprintf($_LANG['return_order_gift_integral'], $order['order_sn']));

  31. /* todo 计算并退回红包 */
  32. return_order_bonus($order_id);
  33. }

  34. /* 如果使用库存,则增加库存 */
  35. if ($_CFG['use_storage'] == '1' && $_CFG['stock_dec_time'] == SDT_SHIP)
  36. {
  37. change_order_goods_storage($order['order_id'], false);
  38. }

  39. /* 清除缓存 */
  40. clear_cache_files();
  41. }
  42. }
复制代码


改好了?
由于本人很懒,所以代码中存在重复的部分,勤奋的大家请自己修改代码结构哦~

order.php文件要修改的最后一个地方就是退货动作了,搜索下面这句代码:
  1. /* 退货 */
  2. elseif ('return' == $operation)
复制代码


这个地方和“设置成未发货”的问题是一样的,不能再不加任何判断就去修改积分了,修改后的代码如下:

  1. /* 退货 */
  2. elseif ('return' == $operation)
  3. {

  4. if($order['shipping_status'] == SS_SHIPPED)
  5. {
  6. /* 标记订单为“退货”、“未付款”、“未发货” */
  7. $arr = array('order_status'=> OS_RETURNED,
  8. 'pay_status' => PS_UNPAYED,
  9. 'shipping_status'=> SS_UNSHIPPED,
  10. 'money_paid' => 0,
  11. 'order_amount'=> $order['money_paid']);
  12. update_order($order_id, $arr);
  13. /* todo 处理退款 */
  14. if ($order['pay_status'] != PS_UNPAYED)
  15. {
  16. $refund_type = $_REQUEST['refund'];
  17. $refund_note = $_REQUEST['refund_note'];
  18. order_refund($order, $refund_type, $refund_note);
  19. }
  20. /* 记录log */
  21. order_action($order['order_sn'], OS_RETURNED, SS_UNSHIPPED, PS_UNPAYED, $action_note);
  22. /* 如果使用库存,则增加库存(不论何时减库存都需要) */
  23. if ($_CFG['use_storage'] == '1')
  24. {
  25. change_order_goods_storage($order['order_id'], false);
  26. }
  27. /* 退货用户余额、积分、红包 */
  28. return_user_surplus_integral_bonus($order);
  29. /* 清除缓存 */
  30. clear_cache_files();
  31. }elseif($order['shipping_status'] == SS_RECEIVED)
  32. {
  33. /* 标记订单为“退货”、“未付款”、“未发货” */
  34. $arr = array('order_status'=> OS_RETURNED,
  35. 'pay_status' => PS_UNPAYED,
  36. 'shipping_status'=> SS_UNSHIPPED,
  37. 'money_paid' => 0,
  38. 'order_amount'=> $order['money_paid']);
  39. update_order($order_id, $arr);
  40. /* todo 处理退款 */
  41. if ($order['pay_status'] != PS_UNPAYED)
  42. {
  43. $refund_type = $_REQUEST['refund'];
  44. $refund_note = $_REQUEST['refund_note'];
  45. order_refund($order, $refund_type, $refund_note);
  46. }
  47. /* 记录log */
  48. order_action($order['order_sn'], OS_RETURNED, SS_UNSHIPPED, PS_UNPAYED, $action_note);
  49. /* 如果订单用户不为空,计算积分,并退回 */
  50. if ($order['user_id'] > 0)
  51. {
  52. /* 取得用户信息 */
  53. $user = user_info($order['user_id']);

  54. /* 计算并退回积分 */
  55. $integral = integral_to_give($order);
  56. log_account_change($order['user_id'], 0, 0, (-1) * intval($integral['rank_points']), (-1) * intval($integral['custom_points'])-2, sprintf($_LANG['return_order_gift_integral'], $order['order_sn']));

  57. /* todo 计算并退回红包 */
  58. return_order_bonus($order_id);
  59. }
  60. /* 如果使用库存,则增加库存(不论何时减库存都需要) */
  61. if ($_CFG['use_storage'] == '1')
  62. {
  63. change_order_goods_storage($order['order_id'], false);
  64. }
  65. /* 退货用户余额、积分、红包 */
  66. return_user_surplus_integral_bonus($order);
  67. /* 清除缓存 */
  68. clear_cache_files();
  69. }

  70. }
复制代码


以上代码中存在着重复的部分,有代码洁癖的人可以从新合理化结构噢~~


到这里为止,order.php已经被我们修理完毕了,呵呵

接下来就是最后一个步骤了,就是在user.php文件里增加一段代码用来处理积分的发放问题!

在该文件里搜索下面这句代码:

  1. /* 确认收货 */
  2. elseif ($action == 'affirm_received')
复制代码


这个地方的修改得到了论坛中json的指点,再次感谢他!

修改后的代码如下:

  1. /* 确认收货 */
  2. elseif ($action == 'affirm_received')
  3. {
  4. include_once(ROOT_PATH . 'includes/lib_transaction.php');

  5. //-----------------------------------------------------------------------------------------------------
  6. include_once(ROOT_PATH . 'includes/lib_order.php');
  7. //--------------------------------------------------------------------------------
  8. $order_id = isset($_GET['order_id']) ? intval($_GET['order_id']) : 0;

  9. if (affirm_received($order_id, $user_id))
  10. {

  11. //-----------------------------------------------------------------------------------------------------
  12. //获得该订单详细信息(包括积分情况)
  13. $order=get_order_detail($order_id,$user_id);

  14. //如果订单用户不为空,计算积分,并发给用户;发红包
  15. if($order['user_id'] > 0)
  16. {
  17. //取得用户信息
  18. $user = user_info($order['user_id']);
  19. // 计算并发放积分
  20. $integral = integral_to_give($order);
  21. log_account_change($order['user_id'], 0, 0, intval($integral['rank_points']), intval($integral['custom_points']), sprintf($_LANG['order_gift_integral'], $order['order_sn']));
  22. //发放红包
  23. send_order_bonus($order_id);
  24. }
  25. //------------------------------------------------------

  26. ecs_header("Location: user.php?act=order_list\n");
  27. exit;
  28. }
  29. else
  30. {
  31. $err->show($_LANG['order_list_lnk'], 'user.php?act=order_list');
  32. }
  33. }
复制代码


增加的代码我已经帮大家隔离出来了,希望能让大家看的更加清晰!

好了,要修改的就这么多东西了,剩下的就是枯燥的测试工作,留给大家吧!

支持,这样的帖子一定要顶

努力的兄弟,顶你。

非常感谢兄弟的辛苦劳动成果,我刚才也测试下你所说的积分漏洞,如果有人恶意利用的花,网站每天订单大的时候的确不怎么容易发现,可以说修补了一个严重的BUG,谢谢,我也是菜菜鸟一个

能帮到大家就OK

辛苦了

不错,现世中象你这样无私的兄弟伙是越来越少了,不象有的人动不动就谈钱。兄弟伙,好样的,顶你。