OrderCallback.php 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. <?php
  2. namespace app\common\service;
  3. use app\common\model\ActivityApply;
  4. use app\common\model\GoodsOrder;
  5. use app\common\model\GoodsOrderRefund;
  6. use app\common\model\LevelOrder;
  7. use app\common\model\User;
  8. use app\common\model\UserLevelRank;
  9. use app\common\model\UserMessage;
  10. use app\common\model\UserMoneyInfo;
  11. use app\common\model\UserWallet;
  12. use app\common\model\WashOrder;
  13. use EasyWeChat\Factory;
  14. use library\tools\Data;
  15. use think\Db;
  16. use think\Exception;
  17. /**
  18. * 订单回调逻辑
  19. * Class OrderCallback
  20. */
  21. class OrderCallback
  22. {
  23. // 商城商品订单支付逻辑
  24. public static function goodsOrderCallBack($order_info,$pay_type)
  25. {
  26. $ret_val = true;$msg='';
  27. Db::startTrans();
  28. try{
  29. // 更改订单状态
  30. GoodsOrder::where('id',$order_info['id'])->update(['status'=>1,'pay_state'=>1,'pay_at'=>date('Y-m-d H:i:s')]);
  31. Db::commit();
  32. }catch (\Exception $e){
  33. $ret_val = false;
  34. $msg = $e->getMessage();
  35. Db::rollback();
  36. }
  37. return ['ret_val'=>$ret_val,'msg'=>$msg];
  38. }
  39. // 商城商品订单支付逻辑
  40. public static function washOrderCallBack($order_info,$pay_type)
  41. {
  42. $ret_val = true;$msg='';
  43. Db::startTrans();
  44. try{
  45. // 更改订单状态
  46. WashOrder::where('id',$order_info['id'])->update(['status'=>1,'pay_state'=>1,'pay_at'=>date('Y-m-d H:i:s')]);
  47. Db::commit();
  48. }catch (\Exception $e){
  49. $ret_val = false;
  50. $msg = $e->getMessage();
  51. Db::rollback();
  52. }
  53. return ['ret_val'=>$ret_val,'msg'=>$msg];
  54. }
  55. // 订单金额退款
  56. public static function refundMoney($refund_info =[],$order_info=[],$order_id = 0)
  57. {
  58. $ret = ['code'=>200,'msg'=>'退款成功'];
  59. if(empty($order_info)) $order_info = GoodsOrder::where('id',$order_id)->find()->toArray();
  60. if(empty($refund_info)) $refund_info = GoodsOrderRefund::where(['order_id'=>$order_id])->find()->toArray();
  61. if(!in_array($order_info['refund_state'],[2,3])) return ['code'=>201,'订单退款审核状态有误'];
  62. if($refund_info['refund_money'] <= 0 || $refund_info['refund_money'] > $order_info['price_total'])return ['code'=>201,'订单退款金额有误'];
  63. $refund_no = $refund_info['refund_no'] ? $refund_info['refund_no'] : get_order_sn();
  64. Db::startTrans();
  65. try {
  66. switch ($order_info['pay_type']){
  67. case 1:
  68. $app = Factory::payment(config('app.wx_pay'));
  69. $result = $app->refund->byOutTradeNumber($order_info['pay_no'], $refund_no, $order_info['price_total']*100, $refund_info['refund_money']*100, ['refund_desc' => '订单退款']);
  70. if($result['return_code'] != 'SUCCESS') throw new Exception('退款异常');
  71. if($result['result_code'] != 'SUCCESS') throw new Exception($result['err_code_des']);
  72. // 修改退款记录状态
  73. GoodsOrderRefund::where(['id'=>$refund_info['id']])->update(['refund_no'=>$refund_no,'status'=>3]);
  74. // 修改订单状态
  75. GoodsOrder::where('id',$refund_info['order_id'])->update(['status'=>8]);
  76. // 积分退回
  77. if($order_info['integral']) UserWallet::userIntegralChange($order_info['user_id'],$order_info['integral'],'订单退款退回',9,1,$order_info['id']);
  78. // 余额退回
  79. if($order_info['balance']) UserWallet::userMoneyChange($order_info['user_id'],$order_info['balance'],'订单退款退回',2, 1,$order_info['id']);
  80. // 券暂不出来
  81. break;
  82. case 2:
  83. break;
  84. case 3:
  85. break;
  86. case 4: //4移动支付(微信)
  87. $app = Factory::payment(config('app.app_wx'));
  88. $result = $app->refund->byOutTradeNumber($order_info['pay_no'], $refund_no, $order_info['price_total']*100, $refund_info['refund_money']*100, ['refund_desc' => '订单退款']);
  89. if($result['return_code'] != 'SUCCESS') throw new Exception('退款异常');
  90. if($result['result_code'] != 'SUCCESS') throw new Exception($result['err_code_des']);
  91. // 修改退款记录状态
  92. GoodsOrderRefund::where(['id'=>$refund_info['id']])->update(['refund_no'=>$refund_no,'status'=>3]);
  93. // 修改订单状态
  94. GoodsOrder::where('id',$refund_info['order_id'])->update(['status'=>8]);
  95. // 积分退回
  96. if($order_info['integral']) UserWallet::userIntegralChange($order_info['user_id'],$order_info['integral'],'订单退款退回',9,1,$order_info['id']);
  97. // 余额退回
  98. if($order_info['balance']) UserWallet::userMoneyChange($order_info['user_id'],$order_info['balance'],'订单退款退回',2, 1,$order_info['id']);
  99. // 券暂不出来
  100. break;
  101. case 5:
  102. break;
  103. case 6:
  104. break;
  105. }
  106. // 订单相关返利追回
  107. self::goodsOrderRefundBack($order_info , $order_id);
  108. Db::commit();
  109. }catch (\Exception $e){
  110. $ret['code'] = 201;
  111. $ret['msg'] = $e->getMessage();
  112. Db::rollback();
  113. }
  114. return $ret;
  115. }
  116. // 商城订单退款(相关返利追回)
  117. public static function goodsOrderRefundBack($order_info , $order_id)
  118. {
  119. if(empty($order_info)) $order_info = GoodsOrder::where('id',$order_id)->find()->toArray();
  120. if($order_info['rebate_refund'] == 1) return true;
  121. $where = [];
  122. $where[] = ['order_id','=',$order_info['id']];
  123. $where[] = ['type','in',[7,8,9]];
  124. $money_list = UserMoneyInfo::where($where)->select()->toArray();
  125. foreach ($money_list as $mv) {
  126. UserWallet::userMoneyChange($mv['user_id'],$mv['money'],'佣金订单退款追回',10);
  127. }
  128. GoodsOrder::where('id',$order_info['id'])->update(['rebate_refund'=>1]);
  129. return true;
  130. }
  131. //开通会员订单支付回调
  132. public static function levelOrderCallBack($order_info,$pay_type)
  133. {
  134. $ret_val = true;$msg='';
  135. Db::startTrans();
  136. try{
  137. // 更改订单状态
  138. LevelOrder::where('id',$order_info['id'])->update(['status'=>1,'pay_state'=>1,'pay_at'=>date('Y-m-d H:i:s')]);
  139. // 是否已是会员
  140. $check_level = UserLevelRank::where(['user_id'=>$order_info['user_id'],'level_id'=>$order_info['level_id']])->find();
  141. // 续费或是新开会员
  142. $start_time = $check_level && $check_level->end_time >time() ? $check_level->start_time :time();
  143. $end_time = $check_level && $check_level->end_time >time() ? strtotime('+'.$order_info['month'].' month',$check_level->end_time) : strtotime('+'.$order_info['month'].' month') ;
  144. Data::save('UserLevelRank', ['user_id'=>$order_info['user_id'],'level_id'=>$order_info['level_id'],'start_time'=>$start_time,'end_time'=>$end_time,'end_date'=>date('Y-m-d H:i:s',$end_time), 'user_id',['user_id'=>$order_info['user_id']]]);
  145. // Data::save('UserLevelRank',['user_id'=>$order_info['user_id'],'level_id'=>$order_info['level_id'],'start_time'=>$start_time,'end_time'=>$end_time,'end_date'=>date('Y-m-d H:i:s',$end_time),'user_id',['user_id'=>$order_info['user_id'],'level_id'=>$order_info['level_id']]]);
  146. $max_level = UserLevelRank::where([['user_id','=',$order_info['user_id']],['end_time','>',time()]])->order('level_id desc')->select()->toArray();
  147. if(!empty($max_level)) User::where(['id'=>$order_info['user_id']])->update(['level_id'=>intval($max_level[0]['level_id']),'level_exp'=>$max_level[0]['end_date']]);
  148. Db::commit();
  149. }catch (\Exception $e){
  150. $ret_val = false;
  151. $msg = $e->getMessage();
  152. Db::rollback();
  153. }
  154. return ['ret_val'=>$ret_val,'msg'=>$msg];
  155. }
  156. // 活动报名
  157. public static function activityOrderCallBack($order_info)
  158. {
  159. $ret_val = true;$msg='';
  160. Db::startTrans();
  161. try{
  162. // 更改订单状态
  163. ActivityApply::where('id',$order_info['id'])->update(['status'=>1,'pay_state'=>1,'pay_at'=>date('Y-m-d H:i:s')]);
  164. UserMessage::sendUserMessage($order_info['user_id'],'activity',1,0,0,$order_info['id']);
  165. Db::commit();
  166. }catch (\Exception $e){
  167. $ret_val = false;
  168. $msg = $e->getMessage();
  169. Db::rollback();
  170. }
  171. return ['ret_val'=>$ret_val,'msg'=>$msg];
  172. }
  173. }