with('itemList')->find()->toArray(); if(!$order_info['pay_state']) return ['code'=>201,'msg' => '订单未支付']; if($order_info['money'] <= 0) return ['code'=>201,'msg' => '免费门票不支持退款']; if(in_array($order_info['refund_state'],[1,2,4,5])) return ['code'=>201,'msg' => '订单已申请退款']; $refund_money = StoreOrderRefund::getRefundMoney($order_id); if($refund_money >= $order_info['money']) return ['code'=>201,'msg' => '订单已全额退款']; Db::startTrans(); try { foreach ($order_info['item_list'] as $item_info) { if($item_info['money'] <= 0) continue; if($item_info['is_hx'] || $item_info['ticket_status']) throw new Exception('门票已审核无法退款'); $refund_info = StoreOrderRefund::where(['order_id'=>$order_id,'item_id'=>$item_info['id'],'order_type'=>1])->find(); if(!empty($refund_info) && in_array($refund_info->status,[0,1,3,4])) continue; Data::save('StoreOrderRefund',[ 'user_id' => $order_info['user_id'], 'order_id' => $order_id, 'item_id' => $item_info['id'], 'order_type' => 1, 'is_deleted' => 0, 'sell_price' => $item_info['total_money'], 'refund_money' => $item_info['money'],//优惠后价格 'refund_no' =>$order_info['pay_no'].'_'.$item_info['id'], 'status' => 0, 'source' => $source, ],'order_id',['order_id'=>$order_id,'item_id'=> $item_info['id'],'order_type'=>1]); } ActivityApply::where('id',$order_id)->update(['refund_state'=>1]); // UserMessage::sendUserMessage($order_info['user_id'],'activity',4,1,0,$order_info['id'],$message,$order_info['id']); UserMessage::sendUserMessage($order_info['user_id'],'apply',4,1,0,$order_info['id'],$message,$order_info['id']); Db::commit(); }catch (\Exception $e){ Db::rollback(); return ['code'=>201,'msg' => $e->getMessage() ]; } return ['code'=>200,'msg' => '申请成功']; } /** * 订单退款【按整个订单退款】 * @param $order_id 订单id */ public static function orderRefundMoney($order_id,$message = '') { $order_info = ActivityApply::where('id',$order_id)->with('itemList')->find()->toArray(); if(!$order_info['pay_state']) return ['code'=>201,'msg' => '订单未支付']; if($order_info['money'] <= 0) return ['code'=>201,'msg' => '免费门票不支持退款']; if(!in_array($order_info['refund_state'],[2,4])) return ['code'=>201,'msg' => '退款状态有误']; $refund_money = StoreOrderRefund::getHasRefund($order_id); if($refund_money >= $order_info['money']) return ['code'=>201,'msg' => '订单已全额退款']; // (1.h5微信,2.h5支付宝,3.app微信,4.app支付宝,5.h5微信内支付,9线下支付) $apply_refund = StoreOrderRefund::where('order_id',$order_id)->where('order_type',1)->where('status','in','0,1,4')->select()->toArray(); if(empty($apply_refund)) return ['code'=>201,'msg' => '没有退款记录']; $total_money = array_sum(array_column($apply_refund,'refund_money'));// 需要退款金额 Db::startTrans(); try { $refund_no = $order_info['pay_no'].'_'.$order_id.'_'.$order_info['act_id']; if(in_array($order_info['pay_type'],[1,3,5])){ // h5 $app = $order_info['pay_type'] == 3 ? Factory::payment(config('app.app_wx')) : Factory::payment(config('app.wx_pay')); $result = $app->refund->byOutTradeNumber($order_info['pay_no'], $refund_no, $order_info['money'] * 100, $total_money *100, ['refund_desc' => '订单退款']); if($result['return_code'] != 'SUCCESS') throw new Exception('微信退款异常'); if($result['result_code'] != 'SUCCESS') throw new Exception($result['err_code_des']); } // 支付宝退款 if(in_array($order_info['pay_type'],[2,4,7])) { $result = Alipay::aliRefund($order_info['pay_no'], $total_money,$order_info['pay_type'] == 2 ?'H5':'APP'); if(!$result) throw new Exception('支付宝退款异常'); } GoodsOrderRefund::where('id','in',array_column($apply_refund,'id'))->update(['status'=>3]); ActivityApply::where('id',$order_id)->update(['refund_state'=>5]); //UserMessage::sendUserMessage($order_info['user_id'],'activity',4,2,0,$order_info['id'],$message,$order_info['id']); UserMessage::sendUserMessage($order_info['user_id'],'apply',4,1,0,$order_info['id'],$message,$order_info['id']); Db::commit(); }catch (\Exception $e){ Db::rollback(); GoodsOrderRefund::where('id','in',array_column($apply_refund,'id'))->update(['status'=>4]); ActivityApply::where('id',$order_id)->update(['refund_state'=>4]); return ['code'=>201 ,'msg'=>$e->getMessage()]; } return ['code'=>200,'msg'=>'退款成功']; } /** * 订单申请退款【按票退款】 * @param $order_id 订单id * @param $item_id 票id * @param $source 1用户申请2后台操作 * @param $is_refund 是否立即退款 */ public static function orderApplyRefund($order_id,$item_id,$source,$is_refund = 0) { //$ret_val = static::$ret_val;// ['code' => 200 , 'msg'=>'ok','extend'=>'']; $order_info = ActivityApply::where('id',$order_id)->find()->toArray(); $item_info = ActivityApplyItem::where('id',$item_id)->find()->toArray(); if(!$order_info['pay_state']) return ['code'=>201,'msg' => '订单未支付']; if($item_info['money'] <= 0) return ['code'=>201,'msg' => '免费门票不支持退款']; $refund_money = StoreOrderRefund::getRefundMoney($order_id); if($refund_money >= $order_info['money'])return ['code'=>201,'msg' => '订单已全额退款']; $refund_info = StoreOrderRefund::where(['order_id'=>$order_id,'item_id'=>$item_id,'order_type'=>1])->find(); if(!empty($refund_info) && in_array($refund_info->status,[0,1,3,4])) return ['code'=>201,'msg' => '订单已申请退款']; if($item_info['is_hx'] || $item_info['ticket_status'])return ['code'=>201,'msg' => '票已核销无法申请']; // 申请记录详情 Data::save('StoreOrderRefund',[ 'user_id' => $order_info['user_id'], 'order_id' => $order_id, 'item_id' => $item_id, 'order_type' => 1, 'is_deleted' => 0, 'sell_price' => $item_info['total_money'], 'refund_money' => $item_info['money'],//优惠后价格 'refund_no' => $order_info['pay_no'].'_'.$item_info['id'], 'status' => 0, 'source' => $source, ],'order_id',['order_id'=>$order_id,'item_id'=>$item_id,'order_type'=>1]); if($is_refund) { $refund_id = StoreOrderRefund::where(['order_id'=>$order_id,'item_id'=>$item_id,'order_type'=>1])->value('id'); $refund_res = static::orderRefund($refund_id); return $refund_res; } return ['code'=>200,'msg' => '申请成功']; } /** * 确定退款 * @param $refund_id 退款记录id */ public static function orderRefund($refund_id) { $refund_info = StoreOrderRefund::where('id',$refund_id)->find()->toArray(); if(in_array($refund_info['status'],[2,3,5]) || $refund_info['is_deleted']) return ['code'=>201,'msg' => '退款记录异常']; $order_info = ActivityApply::where('id',$refund_info['order_id'])->find()->toArray(); $item_info = ActivityApplyItem::where('id',$refund_info['item_id'])->find()->toArray(); if($item_info['is_hx'] || $item_info['ticket_status'])return ['code'=>201,'msg' => '票已核销无法退款']; // (1.h5微信,2.h5支付宝,3.app微信,4.app支付宝,5.h5微信内支付,9线下支付) if($refund_info['refund_money'] <= 0 || $refund_info['refund_money'] > $order_info['money']) return ['code'=>201,'订单退款金额有误']; Db::startTrans(); try { $refund_no = $refund_info['refund_no'] ? $refund_info['refund_no'] : get_order_sn(); //微信退款 if(in_array($order_info['pay_type'],[1,3,5,6])){ // h5 $app = $order_info['pay_type'] == 3 ? Factory::payment(config('app.app_wx')) : Factory::payment(config('app.wx_pay')); $result = $app->refund->byOutTradeNumber($order_info['pay_no'], $refund_no, $order_info['money'] * 100, $refund_info['refund_money']*100, ['refund_desc' => '订单退款']); // var_dump($result); if($result['return_code'] != 'SUCCESS') throw new Exception('微信退款异常'); if($result['result_code'] != 'SUCCESS') throw new Exception($result['err_code_des']); // 修改退款记录状态 GoodsOrderRefund::where(['id'=>$refund_info['id']])->update(['refund_no'=>$refund_no,'status'=>3]); } // 支付宝退款 if(in_array($order_info['pay_type'],[2,4,7])) { $result = Alipay::aliRefund($order_info['pay_no'], $refund_info['refund_money'],$order_info['pay_type'] == 2 ?'H5':'APP'); if(!$result) throw new Exception('支付宝退款异常'); // 修改退款记录状态 GoodsOrderRefund::where(['id'=>$refund_info['id']])->update(['refund_no'=>$refund_no,'status'=>3]); } if(in_array($order_info['pay_type'],[9])) { // 修改退款记录状态 GoodsOrderRefund::where(['id'=>$refund_info['id']])->update(['refund_no'=>$refund_no,'status'=>3]); } Db::commit(); }catch (\Exception $e){ Db::rollback(); GoodsOrderRefund::where(['id'=>$refund_info['id']])->update(['status'=>4]); return ['code'=>201 ,'msg'=>$e->getMessage()]; } return ['code'=>200,'msg'=>'退款成功']; } // 活动变更消息推送 public static function activityChange($act_id) { $where = []; $where[] = ['a.pay_state','=',1]; $where[] = ['a.refund_state','=',0]; $act_info = \app\common\model\Activity::where('id',$act_id)->find()->toArray(); $act_title = $act_info['title']; $list = ActivityApplyItem::field('i.id,i.apply_id,i.phone,i.email,i.user_id,i.act_id') ->alias('i')->where($where) ->leftJoin('ActivityApply a','i.apply_id = a.id') ->leftJoin('StoreOrderRefund r','r.item_id = i.id') ->group('i.user_id') ->select()->toArray(); $message = '由于不可抗因素,您报名的《'.$act_title.'》活动,参会地点及时间变更为:'.$act_info['start_time'].','; $message.=$act_info['province'].$act_info['city'].$act_info['county'].$act_info['address'].',请悉知,跟您带来的不便,敬请谅解!期待与您再次相遇'; foreach ($list as $item_info) { $refund_info = StoreOrderRefund::getRefundInfo($item_info['apply_id'],$item_info['id'],1); if(!empty($refund_info && in_array($refund_info['status'],[0,1,3,5])))continue; // 站内信 && 极光 // UserMessage::sendUserMessage($item_info['user_id'],'activity',2,0,0,$item_info['act_id'],$message,$item_info['id']); UserMessage::sendUserMessage($item_info['user_id'],'activity',2,0,0,$item_info['act_id'],$message,$item_info['act_id']); // 短信推送 // 邮箱提示 $content = '您报名的活动:'.$act_title.'已发生变更'; if($item_info['email'] && strpos ('@', $item_info['email'])) send_email($item_info['email'],$content); } } }