sms = $sms; $this->dynamic = $dynamic; $this->orderCon = $orderCon; } /** * 等级购买 */ public function memberCharge(Request $request) { $user = auth()->user(); $user_id = $user->id; if (empty($user_id)) { return $this->failure('no user_id'); } $rank_id = $request->input('rank_id', 0); if (empty($rank_id)) { return $this->failure('请选择会员'); } $rank = Rank::find($rank_id); if (empty($rank)) { return $this->failure('请选择会员'); } $trade_no = $this->getTradeNO(); $type = $request->input('type', 'rank');//rank:自己充值 rank_other:替别人充值 $score = $this->getAccountScore($user_id); $invite_order = null; //当前会员等级 if ($type == 'other_rank') { $openid = $this->getOpenid(); $invite_order = InviteOrder::create([ 'openid'=>$openid, 'trade_no'=>$trade_no, ]); $price = $rank->price; $goods = '替人升级'.$rank->name; }else{ $user_rank_id = User::where('id', $user_id)->value('rank_id'); if (empty($user_rank_id) /*&& $user_rank_id == 1*/) { $price = $rank->price; }else{ $user_rank = Rank::find($user_rank_id); if ($rank_id <= $user_rank_id) { return $this->failure('您的会员等级已是'.$user_rank->name); } $price = ($rank->price * 100 - $user_rank->price * 100) / 100; } $goods = '升级'.$rank->name; } $num = $request->input('num', 1); if ($score->remain_amount >= $price) { $cash = 0; $score = $price; }else{ $cash = $price - $score->remain_amount; $score = $score->remain_amount; } $pay_order = array( 'user_id' => $user_id, 'trade_no' => $trade_no, 'pay_status' => 'UNPAID', 'cash' => $cash, 'score' => $score, ); $order = array( 'user_id'=>$user_id, 'type_id'=>$rank_id, 'goods'=>$goods, 'price'=>$price, 'num'=>$num, 'type'=>$type, 'trade_no'=>$trade_no, ); $wx_pay = []; if ($cash>0) { $wx_pay = $this->constructWXPay($pay_order, $user_id); }else{ $pay_order['pay_status'] = "PAID"; $order['pay_status'] = "PAID"; //修改会员 $user->rank_id = $rank_id; $user->save(); $h = RankHistory::where('user_id', $user_id)->where('rank_id', $rank_id)->whereNotNull('deadline')->first(); if ($rank_id == 1) { if (empty($h)) {//没有会员 RankHistory::create([ 'user_id'=>$user_id, 'rank_id'=>$rank_id, ]); } }else{ RankHistory::create([ 'user_id'=>$user_id, 'rank_id'=>$rank_id, 'deadline'=>date('Y-m-d H:i:s', strtotime( '+1 month')), ]); } } //支付订单 $order_pay = PayOrder::create($pay_order); $order = Order::create($order); $order_pay->wx_pay = $wx_pay; return $this->success('ok', compact('order_pay', 'invite_order')); } /** * 升级会员 * @param Request $request [description] * @return [type] [description] */ public function memberChargeV2(Request $request) { try { $user = auth()->user(); //购买的会员等级 $sub_rank_id = $request->input('sub_rank_id'); $sub_rank = SubRank::find($sub_rank_id); if (empty($sub_rank)) { return $this->failure('没有该会员'); } $rank = Rank::find($sub_rank->rank_id); $goods = '购买'.$sub_rank->month.'个月'.$rank->name.'VIP'; //判断会员等级 if ($user->rank_id > $sub_rank->rank_id) { return $this->failure('当前会员等级高于购买会员等级'); } //订单号 $trade_no = $this->getTradeNO(); $cash = $price = $sub_rank->discount_price; $score = 0; //支付类型 $remark = ''; $pay_type = $request->pay_type; if($pay_type=='coin'&&$rank->pay_type=='coin'&&$rank->can_cash_amount>0&&$rank->can_coin_amount){ //当前福币 $total_coin = $user->totalCoin(); if($total_coin){ if($total_coin>=$rank->can_coin_amount){ $cash = $cash-$rank->can_cash_amount; $remark = '花费福币'.$rank->can_coin_amount.'个,抵扣金额'.$rank->can_cash_amount.'元'; $score = $rank->can_coin_amount; }else{ $cash = $cash- ($total_coin/10); $remark = '花费福币'.($total_coin).'个,抵扣金额'.($total_coin/10).'元'; $score = $total_coin; } } } //订单 $pay_order = array( 'user_id' => $user->id, 'trade_no' => $trade_no, 'pay_status' => 'UNPAID', 'cash' => $cash, 'score' => $score, ); $order = array( 'user_id'=>$user->id, 'type_id'=>$sub_rank_id, 'goods'=>$goods, 'price'=>$price, 'num'=>1, 'type'=>'rank', 'trade_no'=>$trade_no, 'from_openid'=>$request->input('from_openid'), 'from_user_id'=>$request->input('from_user_id'), 'chat_user_id'=>$request->input('chat_user_id'), 'share_type'=>$request->input('share_type')??'normal', 'remark'=>$remark, ); \DB::beginTransaction(); //支付订单 $order_pay = PayOrder::create($pay_order); $order = Order::create($order); $wx_pay = []; if ($cash>0) { $wx_pay = $this->constructWXPay($pay_order, $user->id,$rank->name); }else{ $order_pay->pay_status = 'PAID'; $order_pay->is_hooked = 1; $order->pay_status = 'PAID'; $order_pay->save(); $order->save(); $result = $this->markRankOrder($order->id); } $order_pay->wx_pay = $wx_pay; \DB::commit(); return $this->success('ok', $order_pay); } catch (\Exception $e) { \DB::rollBack(); $this->getError($e); return $this->failure('支付失败,请稍后再试'); } } /** * 生成分享图片 */ public function makeSharePicture(Request $request, $invite_order_id) { $invite_order = InviteOrder::where('id', $invite_order_id)->first(); $app = EasyWechat::miniProgram(); $data = []; $data['is_hyaline'] = true; $response = $app->app_code->get('/pages/home/sharing?from_openid='.$invite_order->openid.'&id='.$invite_order_id, $data); $time = time(); $path = $time.'qrcode.png'; $filename = $response->saveAs(storage_path('qrcode'), $path); //http://images.ufutx.com/201807/14/697f5a2e6e6f5348a07eb6e4d966a026.jpeg $image1 = 'http://images.ufutx.com/201807/16/4b07337a30b8b1bb311c1944dc0169cb.jpeg'; $image2 = storage_path().'/qrcode/'.$path; $new_image = $this->imageAddImage($image1, $image2, 371, 371, 208, 818, 'top-leftt'); $order = Order::where('trade_no', $invite_order->trade_no)->first(); $rank_name = Rank::where('id', $order->type_id)->value('name'); $openid = $invite_order->openid; $wechat = Wechat::where('openid', $openid)->first(); if (!empty($wechat)) { if (!empty($wechat->avatar) || !empty($wechat->avatar2)) { $avatar = $wechat->avatar2?$wechat->avatar2:$wechat->avatar; $new_image = $this->imageAddImage($new_image, $avatar, 183, 183, 302, 75, 'top-left'); } } $name = ''; if ($wechat->user_id) { $name = User::where('id', $wechat->user_id)->value('name'); } // $new_image = $this->textAddImage($new_image, $rank_name, 15, 70, 550, '#000000', 'right'); $file_path = storage_path()."/qrcode/".$time."invite_qrcode.png"; $new_image->save($file_path); $pic = ''; if(file_exists($file_path)){ $pic = $this->uploadFile($file_path); try{ unlink($file_path); }catch(Exception $e) { return $this->failure($e->getMessage()); exit(); } } $invite_order->invite_pic = $pic; $invite_order->save(); return $this->success('ok', compact('pic')); } public function constructWXPay($pay_order, $user_id, $detail='福恋') { $openid = $this->getOpenid(); $attributes = array( 'trade_type' => 'JSAPI', // JSAPI,NATIVE,APP... 'body' => $detail, 'detail' => $detail, 'out_trade_no' => $pay_order['trade_no'], 'total_fee' => ($pay_order['cash']*100), 'notify_url' => config('app.url').'/api/mark/order/pay/'.$pay_order['trade_no'], // 支付结果通知网址,如果不设置则会使用配置里的默认地址 'openid' => $openid, ); $result = \WechatService::pay($attributes); return $result; } public function compareTime($time1, $time2) { $str_time1 = strtotime($time1); $str_time2 = strtotime($time2) + 30 * 24 * 3600; if ($str_time1 >= $str_time2) {//已過期 return false; }else{ return true; } } /** * 支付回调 */ public function markOrderPay(Request $request, $trade_no) { if ($trade_no) { $pay_order = PayOrder::where('trade_no', $trade_no)->first(); if (empty($pay_order)) { $message = '订单不存在,订单号:'.$trade_no; return $this->failure('订单不存在'); } if ($pay_order->is_hooked) { return $this->success('ok'); } $order = Order::where('trade_no', $trade_no)->first(); if ($pay_order->cash > 0 ) { //当前时间大于订单时间30天不能查询 $now_time = date('Y-m-d H:i:s'); $order_time = $pay_order->created_at->toDateTimeString(); $compare_result = $this->compareTime($now_time, $order_time); if ($compare_result) { $result = \WechatService::orderPaid($trade_no); }else{ $result = false; } }elseif ($pay_order->score > 0 && $pay_order->cash == 0 ) { $result = true; }else{ $result = false; } if ($result) { if ($order->type == 'rank') { $result = $this->markRankOrder($order->id); if (empty($result)) { return; } //添加平台订单收益 $this->addPaasAccountHistoriy($order->id, $trade_no, 'RANK', $order->user_id); // MakeShareConsumeCash::dispatch($pay_order)->onQueue('love'); }elseif ($order->type == 'score') { $result = $this->changeScore($order->user_id, $pay_order->cash, 'gained', '福分充值'); }elseif ($order->type == 'gift') { if ($pay_order->cash > 0) { $this->changeScore($order->user_id, $pay_order->cash, 'gained', '福分充值'); } $gift = Gift::find($order->type_id); //收礼物user_id $other_user_id = GiftHistory::where('trade_no', $order->trade_no)->where('type', 'GIVEN')->value('other_user_id'); $result = $this->changeScore($order->user_id, $pay_order->cash + $pay_order->score, 'used', '送礼物['.$gift->name.']', $other_user_id); if (!$result) { $this->sms->sentMessage('15872844805', '订单号:'.$order->trade_no.' 福分溢出'); // return $this->failure('支付失败福分溢出'); PayOrder::where('trade_no', $trade_no)->update(['is_hooked'=>1,'pay_status'=>'PAID']); return; } $this->changeScore($other_user_id, $pay_order->cash + $pay_order->score, 'gained', '收礼物['.$gift->name.']', $order->user_id); GiftHistory::where('trade_no', $order->trade_no)->update(['status'=>1]); //更新礼物库 $user_gift = UserGift::where('user_id', $other_user_id)->where('gift_id', $order->type_id)->first(); if (empty($user_gift)) { $user_gift = UserGift::create([ 'user_id'=>$other_user_id, 'gift_id'=>$order->type_id, 'num'=>0, ]); } $user_gift->num += $order->num; $user_gift->save(); $content = '送了'.$order->num.$gift->unit.$gift->name.'给你!'; $this->sendNotice($other_user_id, $order->user_id, 'gift', $content); //短信通知 $user_name = User::where('id', $order->user_id)->value('name'); $mobile = User::where('id', $other_user_id)->value('mobile'); if ($mobile) { $message = '用户【'.$user_name.'】送给你一'.$gift->unit.$gift->name.'!请访问小程序查看'; $this->sms->sentMessage($mobile, $message); } }elseif ($order->type == 'other_rank') { if ($pay_order->score > 0) { $result = $this->changeScore($order->user_id, $pay_order->score, 'used', $message='替Ta支付'); if (!$result) { $this->sms->sentMessage('15872844805', '订单号:'.$order->trade_no.' 福分溢出'); return $this->failure('支付失败福分溢出'); } } InviteOrder::where('trade_no', $order->trade_no)->where('status', 0)->update(['status'=>1]); }elseif ($order->type == 'meet') { //约见记录 $appointment = Appointment::find($order->type_id); $history = new AppointmentHistory(); $history->user_id = $order->user_id; $history->point_id = $appointment->id; $history->price = $appointment->price; $history->num = $appointment->num; $history->type = $appointment->type; $history->save(); $user = User::find($order->user_id); $user_name = $user->name; if ($appointment->type == 'active' || $appointment->type == 'passive') { $message = '用户'.$user_name.'购买了'.$appointment->name.'服务'; $this->sms->sentMessage('13377553550', $message); } //订阅消息通知用户 // $user = User::find($order->user_id); // $this->orderSuccessNoticeToUser($order, $user); }elseif ($order->type == 'approve') { //赠送一个月市级会员 $this->addUserRank($order->user_id, 1, 1); User::where('id', $order->user_id)->update(['approve_time'=>3]); //分享注册认证 获得奖励 $from_openid = User::where('id', $order->user_id)->value('from_openid'); if ($from_openid) { $array['from_openid'] = $from_openid; $array['user_id'] = $order->user_id; $array['type'] = 'approve'; $array['num'] = 2; ReferreAward::dispatch($array)->onQueue('love'); } //分享认证退认证费 // $this->refundApprove($from_openid); //订阅信息通知用户 // $user = User::find($order->user_id); // $this->orderSuccessNoticeToUser($order, $user); }elseif ($order->type == 'activity') { $key = Redis::setnx('activity'.$trade_no,1); if($key!=1){ $PayLog = new PayLog; $PayLog->type = 'activity'; $PayLog->user_id = $order->user_id??0; $PayLog->trade_no = $trade_no; $PayLog->remark = '回调异常'; $PayLog->save(); return ; } $user = User::where('id', $order->user_id)->first(); $wechat = wechat::where('user_id', $order->user_id)->first(); $avatar = ''; if (!empty($wechat)) { $avatar = $wechat->avatar2?$wechat->avatar2:$wechat->avatar; } $sex = $user->sex; if (empty($sex)) { $sex = $wechat->gender; } $member = new ActivityMember; $member->is_joined = 1; $member->user_id = $order->user_id; $member->activity_id = $order->type_id; $member->name = $member->name?$member->name:$user->name; $member->mobile = $member->mobile?$member->mobile:$user->mobile; $member->avatar = $member->avatar?$member->avatar:$avatar; $member->linkmen = $order->linkmen; $member->from_openid = $order->from_openid; $member->save(); //添加平台订单收益 $this->addPaasAccountHistoriy($order->id, $trade_no, 'ACTIVITY', $order->user_id); //通知给管理员 $activity = Activity::findOrFail($order->type_id); $this->sendActivityNotice($activity, $user); // 两人同行 $linkmen = json_decode($order->linkmen,true); if($activity&&$activity->id==554&&count($linkmen)>=2){ $result = $this->friendOrder($linkmen,$activity,$user->mobile); } //发送短信通知 // if($activity&&$activity->id==555||$activity->id ==554){ // $result = $this->sendSmsNotice($activity->id,$order->user_id); // } //发送订阅通知给用户 // $this->sendActivityNoticeToUser($activity, $user); }elseif ($order->type == 'single_service') {//单身服务 $result = $this->markSingleServiceOrder($order); if (empty($result)) throw new \Exception("单身服务订单回调失败", 1); MakeShareConsumeCash::dispatch($pay_order)->onQueue('love'); } PayOrder::where('trade_no', $trade_no)->update(['is_hooked'=>1,'pay_status'=>'PAID']); Order::where('trade_no', $trade_no)->update(['pay_status'=>'PAID']); // StoreOrderWorthShare::dispatch($order, $pay_order)->onQueue('love'); //订单分享人条件 $redis = Redis::connection('big_data'); $redis->lpush('love:earning:order:ids', $order->id); SendEarningMessage::dispatch($order->id)->onQueue('love')->delay(now()->addMinutes(1)); $replyxml = ""; echo $replyxml; }else{ return $this->failure('支付失败', $result); } }else{ return $this->failure('no order'); } } /** * 赠送认证资格 * @param [type] $user_id [description] */ public function sendApproveTime($user_id) { $user = User::find($user_id); if (!$user->is_approved) { $user->approve_time = 3; $user->save(); } return; } /** * 退认证费 * @return [type] [description] */ public function refundApprove($from_openid) { $user_id = Wechat::where('openid', $from_openid)->value('user_id'); if (empty($user_id)) { return ; } //是否交认证费 $approve_order = Order::where('user_id', $user_id)->where('type', 'approve')->where('pay_status', 'PAID')->first(); if (empty($approve_order)) { return ; } $approve_pay_order = PayOrder::where('user_id', $user_id)->where('trade_no', $approve_order->trade_no)->where('is_hooked', 1)->first(); //是否有被邀请人认证 //是否有已邀请认证 $invite_user_ids = User::where('from_openid', $from_openid)->pluck('id'); $count = Order::where('type', 'approve')->where('pay_status', 'PAID')->whereIn('user_id', $invite_user_ids)->count(); if (empty($count)) { return ; } //是否已退 $refund_order = RefundOrder::where('user_id', $user_id)->where('type','approve')->first(); //生成退款记录 if (empty($refund_order)) { $refund_order = RefundOrder::create([ 'user_id'=>$user_id, 'type'=>'approve', 'trade_no'=>$approve_order->trade_no, 'refund_trade_no'=>$this->getRefundTradeNo(), 'total_fee'=>$approve_pay_order->cash, 'refund_fee'=>$approve_pay_order->cash, ]); }else{ return ; } $total = $refund_order->total_fee * 100; $desc = '用户实名认证费退款'; //退款 $result = \WechatService::userTransfer($refund_order->refund_trade_no, $from_openid, $total, $desc); if ($result) { } return ; } /** * 支付回调 */ public function markOrderPayV2(Request $request, $trade_no) { if ($trade_no) { $pay_order = PayOrder::where('trade_no', $trade_no)->first(); if ($pay_order->is_hooked) { return $this->success('ok'); } $order = Order::where('trade_no', $trade_no)->first(); if ($pay_order->cash > 0 ) { //当前时间大于订单时间30天不能查询 $now_time = date('Y-m-d H:i:s'); $order_time = $pay_order->created_at->toDateTimeString(); $compare_result = $this->compareTime($now_time, $order_time); if ($compare_result) { $result = \WechatService::orderPaid($trade_no); }else{ $result = false; } }elseif ($pay_order->score > 0 && $pay_order->cash == 0 ) { $result = true; }else{ $result = false; } if ($result) { if ($order->type == 'rank') { $result = $this->markRankOrder($order->id); if (empty($result)) { return; } $this->addPaasAccountHistoriy($order->id, $trade_no, 'RANK', $order->user_id); } PayOrder::where('trade_no', $trade_no)->update(['is_hooked'=>1,'pay_status'=>'PAID']); Order::where('trade_no', $trade_no)->update(['pay_status'=>'PAID']); StoreOrderWorthShare::dispatch($order, $pay_order)->onQueue('love'); $redis = Redis::connection('big_data'); $redis->lpush('love:earning:order:ids', $order->id); SendEarningMessage::dispatch($order->id)->onQueue('love')->delay(now()->addMinutes(1)); return $this->success('mark ok'); }else{ return $this->failure('支付失败', $result); } }else{ return $this->failure('no order'); } } // 双人同行订单将生成衍生订单和用户 public function friendOrder($linkmen,$activity,$mobile) { foreach ($linkmen as $key => $value) { if($value['mobile']==$mobile) continue; $user = User::where('mobile',$value['mobile'])->first(); if(!$user){ $user = new User(); $user->name = $value['name']; $user->nickname = $value['name']; $user->mobile = $value['mobile']; $user->email = $value['mobile'].'@ufutx.com'; $user->save(); } ProfileCourtship::firstOrCreate(['user_id' => $user->id]); $member = new ActivityMember; $member->is_joined = 1; $member->user_id = $user->id; $member->activity_id = $activity->id; $member->name = $value['name']; $member->mobile = $value['mobile']; $member->avatar = User::DefaultAvatar; $member->linkmen = $linkmen; $member->desc = '两人同行,同行人:'.$mobile; $member->save(); } } public function sendSmsNotice($activity_id,$user_id){ $member = ActivityMember::where('activity_id',$activity_id)->where('user_id',$user_id)->first(); $member->linkmen = json_decode($member->linkmen); $mobiles = []; if(!empty($member->linkmen)){ foreach ($member->linkmen as $men) { $mobiles[] = $men['mobile']; } } $array = [ 'mobile' => $mobiles, 'message' => "您好!您已报名福恋平台9月16日的5+1线上深度了解,线下约会的活动,请添加客服微信18922809346(电话同号),提醒您届时参加!谢谢!", ]; SendSmsBatch::dispatch($array)->onQueue('love'); } /** * 添加平台收益 * @param [type] $order_id [description] */ public function addPaasAccountHistoriy($order_id, $trade_no, $type, $user_id) { if ($type == 'RANK') { //用户所属平台 $paas_user = PaasUser::where('user_id', $user_id)->where('type', 'MAIN')->first(); if (empty($paas_user)) { return; } $paas = Paas::where('id', $paas_user->paas_id)->value("name"); $amount = PayOrder::where('trade_no', $trade_no)->value('cash'); if (empty($amount)) { return; } //百分之五十 $remain_amount = number_format($amount/2, 2); $paas_service = new PaasService; $paas_service->addAccountHistory($paas, $type, $order_id, $remain_amount); }elseif ($type == 'ACTIVITY') { $activity_id = Order::where('id', $order_id)->value('type_id'); $paas_id = PaasActivity::where('activity_id', $activity_id)->value('paas_id'); if (empty($paas_id)) { return; } $paas = Paas::where('id', $paas_id)->value("name"); $amount = PayOrder::where('trade_no', $trade_no)->value('cash'); if (empty($amount)) { return; } $paas_service = new PaasService; $paas_service->addAccountHistory($paas, $type, $order_id, $amount); } return; } public function markRankOrder($order_id) { try { \DB::beginTransaction(); $order = Order::find($order_id); $pay_order = PayOrder::where('trade_no', $order->trade_no)->first(); $user = User::with('wechat')->find($order->user_id); //检测福币 if ($pay_order->score > 0) { $result = $user->addCoinLog('RANK', $order->type_id, $pay_order->score, $remark='小程序购买超级会员'); if (empty($result)) throw new \Exception("增加福币记录失败", 1); $result = $user->updateCoinInfo('sub', $pay_order->score); if (empty($result)) throw new \Exception("修改福币信息失败", 1); } $this->changeRank($order->user_id, $order->type_id); \DB::commit(); //微信通知 $sub_rank = SubRank::find($order->type_id); $array['openid'] = $user->wechat->openid; $array['rank_id'] = $sub_rank->rank_id; SendRankNotice::dispatch($array)->onQueue('love'); return true; } catch (\Exception $e) { \DB::rollBack(); $this->getError($e); return false; } } //活动福币支付回调 public function payment_change($order,$trade_no) { $user = User::where('id', $order->user_id)->first(); $wechat = wechat::where('user_id', $order->user_id)->first(); $avatar = ''; if (!empty($wechat)) { $avatar = $wechat->avatar2?$wechat->avatar2:$wechat->avatar; } $sex = $user->sex; if (empty($sex)) { $sex = $wechat->gender; } $member = new ActivityMember; $member->is_joined = 1; $member->user_id = $order->user_id; $member->activity_id = $order->type_id; $member->name = $member->name?$member->name:$user->name; $member->mobile = $member->mobile?$member->mobile:$user->mobile; $member->avatar = $member->avatar?$member->avatar:$avatar; $member->linkmen = $order->linkmen; $member->from_openid = $order->from_openid; $member->save(); //添加平台订单收益 $this->addPaasAccountHistoriy($order->id, $trade_no, 'ACTIVITY', $order->user_id); //通知给管理员 $activity = Activity::findOrFail($order->type_id); $this->sendActivityNotice($activity, $user); } /** * 修改会员 * @return [type] [description] */ public function changeRank($user_id, $sub_rank_id) { $sub_rank = SubRank::find($sub_rank_id); $rank_id = $sub_rank->rank_id; $month = $sub_rank->month; $user = User::find($user_id); $user->addSuperRank(0, $month, $type='mini_rank'); return ; } /** * 积分修改 * @param int $user_id 用户ID * @param decimal $score 更改积分 * @param string $type 类型 * @param string $message 备注 * @param inte $other_user_id 其他人ID * @return bool 是否成功 */ public function changeScore($user_id, $score, $type, $message='', $other_user_id=null) { //本地积分 $score_obj = Score::where('user_id', $user_id)->first(); if (empty($score_obj)) { $score_obj = Score::create([ 'user_id'=>$user_id, ]); } if ($type == 'gained') { //更新积分 $score_obj->increment('remain_amount', $score); }else{ if ($score_obj->remain_amount >= $score) { $score_obj->decrement('remain_amount', $score); // 优先使用不可提现的福分 // 不可提现的福分不够,从可提现的福分扣除 $extraScore = $score_obj->remain_amount - $score_obj->cash_score; $deductCash = $extraScore - $score; if($deductCash){ $score_obj->decrement('cash_amount', $deductCash); } }else{ $this->sms->sentMessage('15872844805', '用户id:'.$user_id.', 福分超额.'.$message); throw new \Exception('用户id:'.$user_id.', 福分超额.'.$message, 1); } $score_obj->increment('used_amount', $score); } //生成积分记录 ScoreHistory::create([ 'user_id'=>$user_id, 'other_user_id'=>$other_user_id, 'type'=>$type, 'amount'=>$score, 'value'=>$score_obj->remain_amount, 'message'=>$message, ]); //同步积分 // $array['message'] = $message; // $array['user_id'] = $user_id; // $array['other_user_id'] = $other_user_id; // $array['type'] = $type; // $array['score'] = $score; // SyncScore::dispatch($array)->onQueue('love'); return true; } /** * 给邀请人添加福分 */ public function addInviteScore($openid ,$price) { //第最近个人的openid $invite_user_id = Wechat::where('openid', $openid)->value('user_id'); if (empty($invite_user_id)) { return ; } $add_score = $price * 0.1; if ($add_score > 0) { $this->changeScore($invite_user_id, $add_score, 'gained', '推荐赢福分'); } return ; } // 家的味道 public function familyActivity(Request $request) { # code... $goods_id = $request->goods_id??7; $goods = Goods::where('id',$goods_id)->first(); if($request->price<=0) return $this->failure('支付价格有误。'); if(!$goods) return $this->failure('未查询到该商品信息'); if(!$goods->discount_price) return $this->failure('商品价格获取失败'); // 上架当天 $start = date('2021-08-07 00:00:00'); $end = date('2021-08-07 23:59:59'); if($startdiscount_price = 109; } $pay_price = $goods->discount_price*$request->num; if($pay_price!=$request->price) return $this->failure('支付价格与商品价格不一致。'); $trade_no = $this->getRefundTradeNo(); $family['goods_id'] = $goods_id; $family['num'] = $request->num; $family['name'] = $request->name; $family['mobile'] = $request->mobile; $family['address'] = $request->address; $family['from_openid'] = $request->from_openid; $family['from_user_id'] = $request->from_user_id; $family['trade_no'] = $trade_no; $family['open_id'] = $request->openid; $family['price'] = $request->price; $family['from_platform'] = $request->from_platform; FamilyOrder::create($family); $openid = $request->openid; $callback = config('app.url').'/api/app/callback/family/'.$trade_no; $attributes = array( 'trade_type' => 'JSAPI', // JSAPI,NATIVE,APP... 'body' => '"家的味道,有爱中秋"中秋礼盒', 'detail' => $goods->name, 'out_trade_no' => $trade_no, 'total_fee' => round($request->price*100), 'notify_url' => $callback, // 支付结果通知网址,如果不设置则会使用配置里的默认地址 'openid' => $openid, ); $result = \WechatService::officialPay($attributes); return $this->success('ok',$result); } //我的订单 public function familyOrderList(Request $request) { $openid = $request->openid; usleep(500000); $mobile = Viewer::where('openid',$openid)->value('mobile')??0; $result = FamilyOrder::where(function ($query) use($openid,$mobile) { $query->where('open_id', $openid) ->orWhere('mobile', $mobile); })->where('pay_status',1)->orderby('id','desc')->paginate(); foreach ($result as $value) { $goods = Goods::where('id',$value->goods_id)->first(); $value->goods_name = $goods->name; $value->icon = $goods->icon; $value->introduction = $goods->introduction; } return $this->success('ok',$result); } //商品详情 public function goods(Request $request) { $id = $request->id??7; $result = Goods::select('id','name','icon','price','introduction','discount_price')->where('id',$id)->where('status',1)->first(); if($result){ $result->price = floatval($result->price); $result->discount_price = floatval($result->discount_price); // 8.7活动当天 $start = date('2021-08-07 00:00:00'); $end = date('2021-08-07 23:59:59'); $result->preferential = 0; if($startpreferential = 1; $result->discount_price = 109; } $openid = $request->openid; $result->unsigned_order = FamilyOrder::where('open_id',$openid)->where('pay_status',1)->where('order_status','<>',2)->count(); } return $this->success('ok',$result); } //确认收货 public function confirmReceipt(Request $request) { $id = $request->id; $openid = $request->openid; $order = FamilyOrder::where('id',$id)->where('open_id',$openid)->first(); if(!$order) return $this->failure('未查询到该订单信息.'); if($order->order_status==2){ return $this->failure('该订单已签收。'); } $order->order_status = 2; $order->save(); return $this->success('操作成功'); } /** * 送礼物 */ public function sendGift(Request $request, $id, $gift_id) { $user_id = auth()->id(); $gift = Gift::find($gift_id); $num = $request->input('num', 1); $price = $gift->price * $num; //积分 $score = $this->getAccountScore($user_id); $total = $score->remain_amount - $price; if ($total >= 0) { $cash = 0; $score = $price; }else{ $cash = $price - $score->remain_amount; $score = $score->remain_amount; } //购买积分 $trade_no = $this->getTradeNO(); $pay_order = array( 'user_id' => $user_id, 'trade_no' => $trade_no, 'pay_status' => 'UNPAID', 'cash' => $cash, 'score' => $score, ); $order = array( 'user_id'=>$user_id, 'type_id'=>$gift_id, 'goods'=>'购买'.$gift->name, 'price'=>$price, 'num'=>1, 'type'=>'gift', 'trade_no'=>$trade_no, 'pay_status'=>'UNPAID', ); $wx_pay = []; if ($cash > 0) { $wx_pay = $this->constructWXPay($pay_order, $user_id); }else{ $order['pay_status'] = 'PAID'; $pay_order['pay_status'] = 'PAID'; } $order_pay = PayOrder::create($pay_order); $order = Order::create($order); $order_pay->wx_pay = $wx_pay; $this->addGiftHistory($user_id, $id, $gift_id, 0, $num, $trade_no); return $this->success('ok', $order_pay); } /** * 添加礼物记录 */ public function addGiftHistory($user_id, $other_user_id, $gift_id, $status, $num, $trade_no) { //礼物记录 GiftHistory::create([ 'user_id'=>$user_id, 'other_user_id'=>$other_user_id, 'gift_id'=>$gift_id, 'type'=>'GIVEN', 'num'=>$num, 'status'=>$status, 'trade_no'=>$trade_no, ]); GiftHistory::create([ 'user_id'=>$other_user_id, 'other_user_id'=>$user_id, 'gift_id'=>$gift_id, 'type'=>'RECEVIED', 'num'=>$num, 'status'=>$status, 'trade_no'=>$trade_no, ]); if ($status == 1) { //更新礼物库 $user_gift = UserGift::where('user_id', $other_user_id)->where('gift_id', $gift_id)->first(); if (empty($user_gift)) { $user_gift = UserGift::create([ 'user_id'=>$other_user_id, 'gift_id'=>$gift_id, 'num'=>0, ]); } $user_gift->num += $num; $user_gift->save(); } return ; } /** * 商品列表 */ public function goodses(Request $request) { $user_id = auth()->id(); $goodses = Goods::all(); //我的福分 $score = $this->getAccountScore($user_id); return $this->success('ok', compact('score', 'goodses')); } // /** * 兑换商品 */ public function exchangeGoods(Request $request, $id) { $user_id = auth()->id(); $user = auth()->user(); $goods = Goods::find($id); if (empty($goods)) { return $this->failure('no goods'); } $num = $request->input('num', 1); $total = $num * $goods->price; $score = $this->getAccountScore($user_id); $remain_amount = $score->remain_amount; if ($remain_amount < $total) { return $this->failure('福分不足'); } $trade_no = $this->getTradeNO(); $name = $request->input('name'); if (empty($name)) { return $this->failure('请输入姓名'); } $mobile = $request->input('mobile'); if (empty($mobile)) { return $this->failure('请输入电话'); } $address = $request->input('address'); if (empty($address)) { return $this->failure('请输入地址'); } $pay_order = array( 'user_id' => $user_id, 'trade_no' => $trade_no, 'pay_status' => 'PAID', 'score' => $total, ); $order = array( 'user_id'=>$user_id, 'type_id'=>0, 'goods'=>'兑换'.$goods->name, 'price'=>$goods->price, 'num'=>$num, 'type'=>'goods', 'trade_no'=>$trade_no, 'pay_status' => 'PAID', 'name'=>$name, 'address'=>$address, 'mobile'=>$mobile, ); $order_pay = PayOrder::create($pay_order); $order = Order::create($order); $this->changeScore($user_id, $total, 'used', $order['goods']); //通知 $message = '您已经使用'.$total.'福分兑换商品['.$goods->name.'],我们将尽快为您发货'; $this->sms->sentMessage($user->mobile, $message); return $this->success('ok', $order); } /** * 积分充值 */ public function rechargeScore(Request $request) { $user_id = auth()->id(); $price = $request->input('price'); if (empty($price)) { return $this->failure('请输入金额'); } if($price < 0.01 || $price > 100000) { return $this->failure('充值金额范围:0.01-100000'); } $trade_no = $this->getTradeNO(); $pay_order = array( 'user_id' => $user_id, 'trade_no' => $trade_no, 'pay_status' => 'UNPAID', 'cash' => $price, ); $order = array( 'user_id'=>$user_id, 'type_id'=>0, 'goods'=>'账户充值', 'price'=>$price, 'num'=>1, 'type'=>'score', 'trade_no'=>$trade_no, 'pay_status' => 'UNPAID', ); $wx_pay = $this->constructWXPay($pay_order, $user_id); $order_pay = PayOrder::create($pay_order); $order = Order::create($order); $order_pay->wx_pay = $wx_pay; return $this->success('ok', $order_pay); } /** * 绑定别人支付 */ public function useInviteOrder(Request $request, $id) { $is_register = 0; $invited = 0; $is_ok = true; $other_openid = $request->input('other_openid'); if (empty($other_openid)) { return $this->failure('no openid'); } $invite_order = InviteOrder::findOrFail($id); if ($invite_order->other_openid) { if ($invite_order->other_openid != $other_openid) { $invited = 1; $wechat = Wechat::where('openid', $other_openid)->whereNotNull('user_id')->first(); if ($wechat) { $user = User::find($wechat->user_id); if ($user) { $is_register = 1; } } $is_ok = false; return $this->success('邀请已被抢注', compact('is_ok', 'invited', 'is_register')); }else{ $is_register = 1; return $this->success('ok', compact('is_ok', 'invited', 'is_register')); } } if (!$invite_order->status) { return $this->failure('该订单未支付'); } $order = Order::with('user')->where('trade_no', $invite_order->trade_no)->first(); $rank = Rank::find($order->type_id); //已注册用户绑定 $wechat = Wechat::where('openid', $other_openid)->whereNotNull('user_id')->first(); //分享VIP多出金额 $amount = 0; //接收人名称 $user_name = ''; $user_mobile = ''; $user_rank_name = ''; $invite_score = $order->price; if ($wechat) { $user = User::find($wechat->user_id); if ($user) { $is_register = 1; $user_name = $user->name; $user_mobile = $user->mobile; if ($user->type != 'single') { return $this->failure('不是单身不需要充值会员'); } if (empty($user->rank_id)) { $user->rank_id = $rank->id; }else{ $user_rank = Rank::find($user->rank_id); $user_rank_name = $user_rank->name; if ($user_rank->price >= $rank->price) { $is_ok = false; return $this->success('false', compact('is_ok', 'invited', 'is_register')); } $user->rank_id = $rank->id; //分享VIP多出金额 $amount = $user_rank->price; $invite_score = $rank->price - $user_rank->price; } RankHistory::create([ 'user_id'=>$user->id, 'rank_id'=>$rank->id, ]); $user->save(); } } $invite_order->other_openid = $other_openid; $invite_order->save(); //生成分享记录 // $this->addInviteHistory($invite_order->other_openid, $invite_order->openid); //分享收益 $this->addInviteScore($invite_order->openid,$invite_score); //短信通知 $invite_wechat = Wechat::where('openid', $invite_order->openid)->first(); $invite_user = User::where('id', $invite_wechat->user_id)->select('id', 'name', 'mobile')->first(); if ($user_mobile) { $message = '尊敬的用户, 您成功的接受了用户【'.$user_name.'】的'.$rank->name.'会员邀请'; $this->sms->sentMessage($user_mobile, $message); } $pay_order = PayOrder::where('trade_no', $invite_order->trade_no)->where('pay_status', 'PAID')->first(); $refund_trade_no = $this->getRefundTradeNo(); //多出金额退款 if ($amount > 0) { $this->changeScore($invite_user->id, $amount, 'gained', '替人支付会员福分返回'); //通知用户 $message = '亲爱的用户您好,用户['.$user_name.']接受了您的福恋'.$rank->name.'会员邀请,由于用户['.$user_name.']本是'.$user_rank_name.'会员,多出的部分将返回您的福分中.'; $this->sms->sentMessage($invite_user->mobile, $message); } // $score = 0; // $cash = 0; // if ($amount > 0) { // //判断是微信支付还是福分支付 // if ($pay_order->score) {//福分支付 // if ($pay_order->score >= $amount) {//福分大于可退金额 // $score = $amount; // }else{ // $score = $pay_order->score; // $cash = $amount - $pay_order->score; // } // }else{ // $cash = $pay_order->cash - $amount; // } // } // $user_id = Wechat::where('openid', $invite_order->openid)->value('user_id'); // if ($score > 0) { // $this->changeScore($user_id, $score, 'gained', '替人支付会员积分返回'); // } // //退款订单号 // $refund_trade_no = $this->getRefundTradeNo(); // if ($cash > 0) { // $array = []; // $array['refund_desc'] = '替人会员返回'; // WechatService::orderRefund($invite_order->trade_no, $refund_trade_no, $pay_order->cash * 100, $cash *100, $array); // } // if ($score > 0 || $cash > 0) { // RefundOrder::create([ // 'user_id'=>$user_id, // 'trade_no'=>$invite_order->trade_no, // 'refund_trade_no'=>$refund_trade_no, // 'total_fee'=>$pay_order->cash, // 'refund_fee'=>$cash, // 'refund_score'=>$score // ]); // } return $this->success('ok', compact('is_ok', 'invited', 'is_register')); } /** * 绑定页面 */ public function inviteOrder(Request $request, $id) { $session = $this->getWechatSession($request->code); $openid = ''; if ($session) { if(!isset($session['session_key'])){ return $this->failure('failure', $session); } $openid = $session['openid']; } $invite_order = InviteOrder::find($id); if (empty($invite_order)) { return $this->failure('未检测到有vip卡'); } $order = Order::with('user')->where('trade_no', $invite_order->trade_no)->first(); if (empty($order)) { return $this->failure('邀请不存在'); } $rank = Rank::find($order->type_id); $order->rank = $rank; $wechat = Wechat::where('user_id', $order->user_id)->select('avatar', 'avatar2')->first(); if (empty($wechat)) { if ($order->user->sex == 1) { $avatar = 'http://images.ufutx.com/201811/12/0e8b72aae6fa640d9e73ed312edeebf3.png'; }else { $avatar = 'http://images.ufutx.com/201811/12/dddd79aa2c2fc6a6f35e641f6b8fb8f5.png'; } }else{ $avatar = $wechat->avatar2?$wechat->avatar2:$wechat->avatar; } $order->avatar = $avatar; return $this->success('ok', compact('order', 'openid')); } public function getWechatSession($code) { $session = null; $mp = \EasyWechat::miniProgram(); try{ if(config('app.debug') && $code == 'the code is a mock one'){ //simulate $session = [ 'openid' => 'oyBj70MRExrrzYH7K8F_VE75XeoE', 'session_key' => 'oyBj70MRExrrzYH7K8F_VE75XeoE', 'unionid' => 'oVMWoswKQA2ToVHyLzcc6t19N4zE', ]; }else{ $session = $mp->auth->session($code); } }catch(\Exeception $e){ $failure = $e->getMessage; } return $session; } /** * 购买约见 * @param Request $request [description] * @return [type] [description] */ public function buyAppointment(Request $request, $point_id) { $user = auth()->user(); if (empty($user)) { return $this->failure('no user'); } if ($user->type != 'single') { return $this->failure('暂只支持单身购买'); } $user_id = $user->id; $appointment = Appointment::findOrFail($point_id); $price = $appointment->price; $trade_no = $this->getTradeNO(); $pay_order = array( 'user_id' => $user_id, 'trade_no' => $trade_no, 'pay_status' => 'UNPAID', 'cash' => $price, ); $order = array( 'user_id'=>$user_id, 'type_id'=>$point_id, 'goods'=>$appointment->name, 'price'=>$price, 'num'=>1, 'type'=>'meet', 'trade_no'=>$trade_no, ); $wx_pay = $this->constructWXPay($pay_order, $user_id, '福恋约见'); //支付订单 $order_pay = PayOrder::create($pay_order); $order = Order::create($order); $order_pay->wx_pay = $wx_pay; return $this->success('ok', $order_pay); } /** * 购买认证 * @param Request $request [description] * @return [type] [description] */ public function officialBuyAppointment(Request $request, $point_id) { $user = auth()->user(); if (empty($user)) { return $this->failure('no user'); } if ($user->type != 'single') { return $this->failure('暂只支持单身购买'); } $user_id = $user->id; $appointment = Appointment::findOrFail($point_id); $price = $appointment->price; $trade_no = $this->getTradeNO(); $pay_order = array( 'user_id' => $user_id, 'trade_no' => $trade_no, 'pay_status' => 'UNPAID', 'cash' => $price, ); $order = array( 'user_id'=>$user_id, 'type_id'=>$point_id, 'goods'=>$appointment->name, 'price'=>$price, 'num'=>1, 'type'=>'meet', 'trade_no'=>$trade_no, ); if (strstr($_SERVER['HTTP_USER_AGENT'], 'MicroMessenger')) { $wx_pay = \WechatService::constructWXPay($pay_order, $user_id, '福恋约见'); }else{ $wx_pay = \WechatService::constructWXH5Pay($pay_order, $user_id, '福恋约见'); } // $wx_pay = \WechatService::constructWXH5Pay($pay_order, $user_id, '购买认证'); //支付订单 $order_pay = PayOrder::create($pay_order); $order = Order::create($order); $order_pay->wx_pay = $wx_pay; return $this->success('ok', $order_pay); } /** * 奉献 * @param Request $request [description] * @return [type] [description] */ public function donation(Request $request) { $user_id = auth()->id(); if (empty($user_id)) { return $this->failure('no user_id'); } $price = $request->input('price'); if (empty($price)) { return $this->failure('请输入奉献金额'); } $trade_no = $this->getTradeNO(); $pay_order = array( 'user_id' => $user_id, 'trade_no' => $trade_no, 'pay_status' => 'UNPAID', 'cash' => $price, ); $order = array( 'user_id'=>$user_id, 'type_id'=>0, 'goods'=>'奉献金', 'price'=>$price, 'num'=>1, 'type'=>'donation', 'trade_no'=>$trade_no, ); $wx_pay = $this->constructWXPay($pay_order, $user_id, '奉献金'); //支付订单 $order_pay = PayOrder::create($pay_order); $order = Order::create($order); $order_pay->wx_pay = $wx_pay; return $this->success('ok', $order_pay); } /** * 奉献 * @param Request $request [description] * @return [type] [description] */ public function officialAonation(Request $request) { $user_id = auth()->id(); if (empty($user_id)) { return $this->failure('no user_id'); } $price = $request->input('price'); if (empty($price)) { return $this->failure('请输入奉献金额'); } $trade_no = $this->getTradeNO(); $pay_order = array( 'user_id' => $user_id, 'trade_no' => $trade_no, 'pay_status' => 'UNPAID', 'cash' => $price, ); $order = array( 'user_id'=>$user_id, 'type_id'=>0, 'goods'=>'奉献金', 'price'=>$price, 'num'=>1, 'type'=>'donation', 'trade_no'=>$trade_no, ); // $wx_pay = $this->constructWXPay($pay_order, $user_id, '奉献金'); if (strstr($_SERVER['HTTP_USER_AGENT'], 'MicroMessenger')) { $wx_pay = \WechatService::constructWXPay($pay_order, $user_id, '奉献金'); }else{ $wx_pay = \WechatService::constructWXH5Pay($pay_order, $user_id, '奉献金'); } //支付订单 $order_pay = PayOrder::create($pay_order); $order = Order::create($order); $order_pay->wx_pay = $wx_pay; return $this->success('ok', $order_pay); } /** * 购买认证 * @param Request $request [description] * @return [type] [description] */ public function buyApprove(Request $request) { $user_id = auth()->id(); if (empty($user_id)) { return $this->failure('no user_id'); } $price = $request->input('price', 10); if (empty($price)) { return $this->failure('没有购买金额'); } $trade_no = $this->getTradeNO(); $pay_order = array( 'user_id' => $user_id, 'trade_no' => $trade_no, 'pay_status' => 'UNPAID', 'cash' => $price, ); $order = array( 'user_id'=>$user_id, 'type_id'=>0, 'goods'=>'实名认证', 'price'=>$price, 'num'=>1, 'type'=>'approve', 'trade_no'=>$trade_no, ); $wx_pay = $this->constructWXPay($pay_order, $user_id, '认证'); //支付订单 $order_pay = PayOrder::create($pay_order); $order = Order::create($order); $order_pay->wx_pay = $wx_pay; return $this->success('ok', $order_pay); } /** * 参加活动 * @param Request $request [description] * @param [type] $activity_id [description] * @return [type] [description] */ public function joinActivity(Request $request, $activity_id) { $activity = Activity::find($activity_id); if (empty($activity)) { return $this->failure('该活动不存在'); } // if (!empty($activity->is_deadline)) { // return $this->failure('该活动已截止报名'); // } $user = auth()->user(); $user_id = $user->id; if (empty($user_id)) { return $this->failure('no user_id'); } $member = ActivityMember::where('user_id', $user_id)->where('activity_id', $activity_id)->where('is_joined', 1)->first(); if ($member) { return $this->failure('已报名'); } if ($activity->fee == 0) { $wechat = wechat::where('user_id', $user_id)->first(); $avatar = ''; if (!empty($wechat)) { $avatar = $wechat->avatar2?$wechat->avatar2:$wechat->avatar; } $sex = $user->sex; if (empty($sex)) { $sex = Wechat::where('user_id', $user->id)->value('gender'); } if (empty($sex)) { return $this->failure('请完善性别信息!'); } $activity_member = ActivityMember::create([ 'user_id'=>$user_id, 'activity_id'=>$activity_id, 'name'=>$user->name, 'sex'=>$sex, 'mobile'=>$user->mobile, 'avatar'=>$avatar, 'is_joined'=>1, ]); $activity_member->wx_pay = []; //发送模板通知给管理员(公众号) $this->sendActivityNotice($activity, $user); //发送订阅通知给用户 // $this->sendActivityNoticeToUser($activity, $user); return $this->success('ok', $activity_member); }else{ $trade_no = $this->getTradeNO(); $pay_order = array( 'user_id' => $user_id, 'trade_no' => $trade_no, 'pay_status' => 'UNPAID', 'cash' => $activity->fee, ); $order = array( 'user_id'=>$user_id, 'type_id'=>$activity_id, 'goods'=>$activity->theme, 'price'=>$activity->fee, 'num'=>1, 'type'=>'activity', 'trade_no'=>$trade_no, 'from_openid'=>$request->input('from_openid'), 'share_type'=>$request->input('share_type', 'normal'), ); $wx_pay = $this->constructWXPay($pay_order, $user_id, $activity->theme); //支付订单 $order_pay = PayOrder::create($pay_order); $order = Order::create($order); $order_pay->wx_pay = $wx_pay; return $this->success('ok', $order_pay); } } /** * 用户参加活动V2 */ public function joinActivityV2(Request $request, Activity $activity) { $trade_no = $this->getTradeNO(); //用户信息 $user = auth()->user(); if (empty($user)) { return $this->failure('未登录'); } $user_id = $user->id; $member = $user->activityMember()->where('activity_id', $activity->id)->where('is_joined', 1)->first(); if ($member) { return $this->failure('已报名'); } $wechat = $user->wechat; $avatar = ''; if (!empty($wechat)) { $avatar = $wechat->avatar2?$wechat->avatar2:$wechat->avatar; } $sex = $user->sex; if (empty($sex)) { $sex = $wechat->gender?:0; } //生成订单 $order = array( 'type_id'=>$activity->id, 'goods'=>$activity->theme, 'price'=>$activity->fee, 'num'=>1, 'type'=>'activity', 'trade_no'=>$trade_no, 'name'=>$request->input('name'), 'mobile'=>$request->input('mobile'), 'wechat_id'=>$request->input('wechat_id'), 'remark'=>$request->input('remark'), 'pay_status'=>'UNPAID', 'from_openid'=>$request->input('from_openid'), ); if ($activity->fee == 0) {//免费活动 $user->activityMember()->create([ 'activity_id'=>$activity->id, 'name'=>$user->name, 'sex'=>$sex, 'mobile'=>$user->mobile, 'avatar'=>$avatar, 'is_joined'=>1, ]); $order['pay_status'] = 'PAID'; $order = $user->orders()->create($order); $order->wx_pay = []; //发送模板通知给管理员(公众号) $this->sendActivityNotice($activity, $user); //发送订阅通知给用户 // $this->sendActivityNoticeToUser($activity, $user); return $this->success('ok', $order); }else{//收费活动 $pay_order = array( 'user_id' => $user_id, 'trade_no' => $trade_no, 'pay_status' => 'UNPAID', 'cash' => $activity->fee, ); $wx_pay = $this->constructWXPay($pay_order, $user_id, $activity->theme); $order = $user->orders()->create($order); //支付订单 $order_pay = PayOrder::create($pay_order); $order_pay->wx_pay = $wx_pay; return $this->success('ok', $order_pay); } } /** * 用户参加活动V3 * 增加sku */ public function joinActivityV3(Request $request, Activity $activity, $sku_id=0) { try { $trade_no = $this->getTradeNO(); //用户信息 $user = auth()->user(); $rule_name = $request->path(); $h5 = strstr($rule_name,'official'); if($h5) $type='h5'; $user_id = $user->id; $member = $user->activityMember()->where('activity_id', $activity->id)->where('is_joined', 1)->first(); if ($member&&$activity->can_repeat_sign!=1) { return $this->failure('已报名'); } // if(!empty($activity->apply_deadline)){ // $apply_deadline = strtotime($activity->apply_deadline); // if($apply_deadlinefailure('当前活动,已截止报名'); // } // } $wechat = $user->wechat; $avatar = $user->avatar; if (!empty($wechat)) { $avatar = $wechat->avatar2?$wechat->avatar2:$wechat->avatar; } $sex = $user->sex; if (empty($sex)) { $sex = $wechat->gender?:0; } //sku $sub_sku = $this->getActivitySku($activity, $sku_id); if (empty(count($sub_sku))) { return $this->failure('暂无活动规格'); } $price = $sub_sku['price']; $goods = $activity->theme.'【'.$sub_sku['name'].'】'; $linkmen = $request->input('linkmen', []); if (empty(count($linkmen))) { return $this->failure("请输入至少填写一位联系人"); } //生成订单 $order = array( 'type_id'=>$activity->id, 'goods'=>$goods, 'price'=>$price?:0, 'num'=>1, 'type'=>'activity', 'trade_no'=>$trade_no, 'name'=>$request->input('name'), 'mobile'=>$request->input('mobile'), 'wechat_id'=>$request->input('wechat_id'), 'remark'=>$request->input('remark'), 'linkmen'=>json_encode($linkmen), 'pay_type' => 'wechat', 'pay_status'=>'UNPAID', 'from_openid'=>$request->input('from_openid',''), 'from_user_id'=>$request->input("from_user_id"), 'share_type'=> $request->input('share_type')?:'normal', ); if ($price == 0) {//免费活动 \DB::beginTransaction(); $user->activityMember()->create([ 'activity_id'=>$activity->id, 'name'=>$user->name, 'sex'=>$sex, 'mobile'=>$user->mobile, 'linkmen'=>json_encode($linkmen), 'avatar'=>$avatar, 'is_joined'=>1, 'from_openid'=>$request->input('from_openid',''), ]); $order['pay_type'] = 'free'; $order['pay_status'] = 'PAID'; $order = $user->orders()->create($order); $order->wx_pay = []; if($request->channel&&$request->channel ='app'){ $order->pay_config = null; $order->order_id = $order->id; } //发送模板通知给管理员(公众号) if(!isset($type)){ $this->sendActivityNotice($activity, $user); // //发送订阅通知给用户 // $this->sendActivityNoticeToUser($activity, $user); } \DB::commit(); return $this->success('ok', $order); }else{//收费活动 \DB::beginTransaction(); $pay_order = array( 'user_id' => $user_id, 'trade_no' => $trade_no, 'pay_status' => 'UNPAID', 'pay_type' => 'wechat', 'cash' => $price, ); $order['pay_type'] = 'wechat'; $pay_type = $request->pay_type; $cash = $price; if($pay_type=='coin'&&$activity->pay_type=='coin'&&$activity->can_cash_amount>0&&$activity->can_coin_amount){ //当前福币 $total_coin = $user->totalCoin(); if($total_coin){ if($total_coin>=$activity->can_coin_amount){ $cash = $price-$activity->can_cash_amount; if($cash<=0) return $this->failure('报名失败,请稍后再试~'); $remark = '花费福币'.$activity->can_coin_amount.'个,抵扣金额'.$activity->can_cash_amount.'元'; $score = $activity->can_coin_amount; $order['pay_type'] = 'free'; }else{ $cash = $price - ($total_coin/10); $remark = '花费福币'.($total_coin).'个,抵扣金额'.($total_coin/10).'元'; $score = $total_coin; $order['pay_type'] = 'wechat'; } $order['price']= $cash; $order['remark']= $remark; $pay_order['cash']= $cash; $pay_order['score']= $score; } } $order = $user->orders()->create($order); //支付订单 $order_pay = PayOrder::create($pay_order); $order_pay->pay_type = 'wechat'; if((isset($cash)&&$cash>0)||$price){ if(isset($type)){//H5支付 $callback = config('app.url').'/api/mark/order/pay/'.$trade_no; $openid = Viewer::where('user_id', $user_id)->value('openid'); $attributes = array( 'trade_type' => 'JSAPI', // JSAPI,NATIVE,APP... 'body' => $goods, 'detail' => $goods, 'out_trade_no' => $trade_no, 'total_fee' => $cash*100, 'notify_url' => $callback, // 支付结果通知网址,如果不设置则会使用配置里的默认地址 'openid' => $openid, ); if($request->channel&&$request->channel ='app'){ $ios_version = request()->header('app-version'); $and_version = request()->header('version-name'); $callback = config('app.url').'/api/app/callback/orders/'.$pay_order['trade_no'].'?ios_version='.$ios_version.'&and_version='.$and_version; $pay_config = \WechatService::constructWXAppPay($pay_order, auth()->id(),$goods, $callback,true); $order_pay->pay_config = $pay_config; $order_pay->order_id = $order->id; \DB::commit(); return $this->success('ok', $order_pay); }else{//小程序支付 $wx_pay = \WechatService::officialPay($attributes); } }else{ $wx_pay = $this->constructWXPay($pay_order, $user_id, $goods); } }else{ $order->pay_status = 'PAID'; $order->save(); $order_pay->pay_status = 'PAID'; $order_pay->save(); $this->payment_change($order,$trade_no); $wx_pay = null; } $order_pay->wx_pay = $wx_pay; \DB::commit(); return $this->success('ok', $order_pay); } } catch (\Exception $e) { \DB::rollBack(); $this->getError($e); return $this->failure('报名失败'); } } public function getActivitySku($activity, $sku_id) { $arr = []; if ($activity->sku) { $skus = $activity->sku->skus; if (!is_array($skus)) { $skus = json_decode($activity->sku->skus,true); } $skus = array_column($skus, null,'sku_id'); $arr = $skus[$sku_id]; } return $arr; } //订单详情 public function orderByNo(Request $request, $trade_no) { $order = Order::with('payorder')->where('trade_no', $trade_no)->first(); if(!$order) { $order = TouristOrder::where('trade_no', $trade_no)->first(); } $show_pay_type = '免费'; if($order['pay_type'] == 'wechat'){ $show_pay_type = '微信支付'; }else if($order['pay_type'] == 'alipay'){ $show_pay_type = '支付宝支付'; }else if($order['pay_type'] == 'ios'){ $show_pay_type = 'IOS支付'; }else if($order['pay_type'] == 'h5'){ $show_pay_type = 'H5支付'; } $order['show_pay_type'] = $show_pay_type; $order['show_type'] = $this->orderCon->orderTypeCodeSwitchChinese($order['type']); if($order->type=='course') $order->goods = $order->course->title??$order->goods; $order->used_coin = 0 ; //花费福币50个,抵扣金额5.00元 if($order->remark){ $start = strpos($order->remark,'币')/3+1; $end = strpos($order->remark,'个')-8; $len = $end- $start; if($start&&$end&&$len){ $order->used_coin = intval(mb_substr($order->remark, $start,$len,'utf-8')); } } return $this->success('ok', $order); } /** * 公众号模板消息通知管理员 */ public function sendActivityNotice($activity, $user) { $openids = ['oPC_2vudkf3stdiNgjA-e2n6t9_M', 'oPC_2vqYw7abAstDCtOO0iNK1kxI', 'oPC_2vg_Eur-Wa_Vwnx9JiyRVn9Q', 'oPC_2vjBtNlqBh0EItCoyRi-vUTg','oPC_2vjDpuCojlVoD9R_VxMHNmEw']; $param['title'] = $activity->theme; $param['user_name'] = $user->nickname; $param['start_time'] = $activity->start_time; $param['address'] = $activity->province.$activity->city.$activity->dist.$activity->address; $param['activity_id'] = $activity->id; $param['user_mobile'] = $user->mobile; foreach ($openids as $openid) { $param['openid'] = $openid; \WechatService::activitySuccessNotice($param); } return ; } /** * 活动退款 * @param Request $request [description] * @param [type] $activity_id [description] * @return [type] [description] */ public function activityOrderRefund(Request $request, $activity_id, $user_id) { //口令 $token = $request->input('token'); if ($token != 'fullink_refund') { return $this->failure('退款失败, 请输入口令'); } //判断是否有订单 $order = Order::where('type_id', $activity_id)->where('type', 'activity')->where('user_id', $user_id)->where('pay_status', 'PAID')->first(); if (empty($order)) { return $this->failure('没有该订单'); } $refund_trade_no = $this->getRefundTradeNo(); $total_fee = $order->price; $refund_fee = $request->input('refund_fee'); if (empty($refund_fee)) { return $this->failure('请输入退款金额'); } $remark = $request->input('remark'); if (empty($remark)) return $this->failure('请输入退款理由'); $array = ['refund_desc' => '活动退款']; $result = \WechatService::orderRefund($order->trade_no, $refund_trade_no, $total_fee, $refund_fee, $array); if (is_array($result) && $result['status']===true) { RefundOrder::create([ 'user_id'=>$user_id, 'type'=>'activity', 'trade_no'=>$order->trade_no, 'refund_trade_no'=>$refund_trade_no, 'total_fee'=>$total_fee, 'refund_fee'=>$refund_fee, 'is_hook'=>0, 'remark'=>$remark, ]); return $this->success('退款成功'); }else{ return $this->failure('退款失败'); } } /** * 订单退款(不取消对应权限) * @param Request $request [description] * @param [type] $activity_id [description] * @return [type] [description] */ public function orderRefund(Request $request, $order_id) { $user = auth()->user(); if (!($user->is_admin)) { return $this->failure('请开通管理员权限'); } // $code = $request->input('code'); // if ($code != 'ufutx_love') { // return $this->failure('code错误'); // } $type = $request->input('type'); if (empty($type)) { return $this->failure('请输入订单类型'); } //判断是否有订单 $order = Order::where('id', $order_id)->where('type', $type)->where('pay_status', 'PAID')->first(); if (empty($order)) { return $this->failure('没有该支付订单'); } $refund_trade_no = $this->getRefundTradeNo(); $pay_order = PayOrder::where('trade_no', $order->trade_no)->first(); $total_fee = $pay_order->cash; $refund_fee = $pay_order->cash; $desc = '活动退款'; if ($type == 'rank') { $desc = 'VIP充值退款'; }elseif ($type == 'approve') { $desc = '实名认证费退款'; //是否有已邀请认证 $openid = Wechat::where('user_id', $order->user_id)->value('openid'); $invite_user_ids = User::where('from_openid', $openid)->pluck('id'); $count = Order::where('type', 'approve')->where('pay_status', 'PAID')->whereIn('user_id', $invite_user_ids)->count(); if (empty($count)) { return $this->success('暂无邀请用户认证'); } }elseif ($type == 'meet') { $desc = '红娘服务退款'; }elseif ($type == 'single_service') { $desc = '单身服务退款'; } $array = ['refund_desc' => $desc]; $result = \WechatService::orderRefund($order->trade_no, $refund_trade_no, $total_fee, $refund_fee, $array); if (is_array($result) && $result['status'] === true) { RefundOrder::create([ 'user_id'=>$order->user_id, 'type'=>$type, 'trade_no'=>$order->trade_no, 'refund_trade_no'=>$refund_trade_no, 'total_fee'=>$total_fee, 'refund_fee'=>$refund_fee, 'is_hook'=>0, ]); //修改订单状态 $order->pay_status = "REFUND"; $order->save(); return $this->success('退款成功'); }else{ return $this->failure('退款失败'); } } /** * 升级会员 * @param Request $request [description] * @return [type] [description] */ public function officialMemberCharge(Request $request) { $user = auth()->user(); $sub_rank_id = $request->input('sub_rank_id'); if (empty($sub_rank_id)) { return $this->failure('请选择会员'); } $sub_rank = SubRank::find($sub_rank_id); $rank = Rank::find($sub_rank->rank_id); //判断会员等级 if ($user->rank_id > $sub_rank->rank_id) { return $this->failure('当前会员等级高于购买会员等级'); } $score = $this->getAccountScore($user->id); $result = $this->orderCon->officialMemberCharge($request, $rank->name, $sub_rank->month, $sub_rank->discount_price, $score, $trade_type = 'h5'); return $this->success('ok', $result); } /** * app 微信支付 */ public function officialAppMemberCharge(Request $request) { $user = auth()->user(); $trade_type = $request->input('trade_type', 'wechat_app'); $sub_rank_id = $request->input('sub_rank_id'); if (empty($sub_rank_id)) { return $this->failure('请选择会员'); } $sub_rank = SubRank::find($sub_rank_id); $rank = Rank::find($sub_rank->rank_id); //判断会员等级 if ($user->rank_id > $sub_rank->rank_id) { return $this->failure('当前会员等级高于购买会员等级'); } //测试金额 $score = $this->getAccountScore($user->id); $result = $this->orderCon->officialMemberCharge($request, $rank->name, $sub_rank->month, $sub_rank->discount_price, $score, $trade_type); return $this->success('ok', $result); } /** * 购买认证 * @param Request $request [description] * @return [type] [description] */ public function officialBuyApprove(Request $request) { $user_id = auth()->id(); $price = $request->input('price', 10); if (empty($price)) { return $this->failure('没有购买金额'); } $trade_no = $this->getTradeNO(); $pay_order = array( 'user_id' => $user_id, 'trade_no' => $trade_no, 'pay_status' => 'UNPAID', 'cash' => $price, ); $order = array( 'user_id'=>$user_id, 'type_id'=>0, 'goods'=>'实名认证', 'price'=>$price, 'num'=>1, 'type'=>'approve', 'trade_no'=>$trade_no, ); if (strstr($_SERVER['HTTP_USER_AGENT'], 'MicroMessenger')) { $wx_pay = \WechatService::constructWXPay($pay_order, $user_id, '购买认证'); }else{ $wx_pay = \WechatService::constructWXH5Pay($pay_order, $user_id, '购买认证'); } // $wx_pay = \WechatService::constructWXH5Pay($pay_order, $user_id, '购买认证'); //支付订单 $order_pay = PayOrder::create($pay_order); $order = Order::create($order); $order_pay->wx_pay = $wx_pay; return $this->success('ok', $order_pay); } public function singleServices(Request $request, SingleService $single_service) { $services = $single_service->where('is_show',1)->where('is_show_mini', 1)->orderBy('price', 'asc')->get(); foreach ($services as $service) { $service->desc = json_decode($service->desc); } return $this->success('ok', $services); } /**服务套餐 需要登录 */ public function singleServicesV2(Request $request, SingleService $single_service) { $user = auth()->user(); $type = 'is_show_mini'; $rule_name = $request->path(); $h5 = strstr($rule_name,'official'); if($h5) $type='is_show_web'; $services = $single_service->with('rank')->where($type,1)->orderBy('id', 'asc')->get(); //获取520的购买记录 $repeatPayStatus = null; if($user){ $repeatPayStatus = Order::where(['type_id'=>12,'pay_status'=>'PAID','user_id'=>$user->id])->first(); } $result = array(); foreach ($services as $service) { if ($service->discount_desc_type == 'json'){ $service->desc = json_decode($service->desc); $service->feature = json_decode($service->feature); $service->discount_desc = json_decode($service->discount_desc); }else{ $service->desc = json_decode($service->desc); $service->feature = json_decode($service->feature); $service->discount_desc = explode('****',$service->discount_desc); // $service->discount_desc = json_decode($service->discount_desc); } if($service->id == 12 && $repeatPayStatus){ continue; } $result[] = $service; } return $this->success('ok', $result); } //**服务套餐展示无需登录 */ public function singleServicesShow(Request $request, SingleService $single_service){ $user = auth()->user(); if(empty($user)){ $user = $this->authCheck(); } if(empty($user)){ $SingleService = new SingleService(); $services = $SingleService->with('rank') ->where('is_show_mini',1) ->orderBy('id', 'asc') ->get(); $result = array(); foreach ($services as $service) { if ($service->discount_desc_type == 'json'){ $service->desc = json_decode($service->desc); $service->feature = json_decode($service->feature); $service->discount_desc = json_decode($service->discount_desc); $result[] = $service; }else{ $service->desc = json_decode($service->desc); $service->feature = json_decode($service->feature); $service->discount_desc = explode('****',$service->discount_desc); // $service->discount_desc = json_decode($service->discount_desc); $result[] = $service; } } return $this->success('ok', $result); }else{ $services = $single_service->with('rank')->where('is_show_mini',1)->orderBy('id', 'asc')->get(); //获取520的购买记录 $repeatPayStatus = Order::where(['type_id'=>12,'pay_status'=>'PAID','user_id'=>$user->id])->first(); $result = array(); foreach ($services as $service) { if ($service->discount_desc_type == 'json') { $service->desc = json_decode($service->desc); $service->feature = json_decode($service->feature); $service->discount_desc = json_decode($service->discount_desc); }else{ $service->desc = json_decode($service->desc); $service->feature = json_decode($service->feature); $service->discount_desc = explode('****',$service->discount_desc); } if($service->id == 12 && $repeatPayStatus){ continue; } $result[] = $service; } return $this->success('ok', $result); } } public function buySingleServices(Request $request, SingleService $single_service) { try { //生成订单 $user = auth()->user(); $price = $single_service->discount_price; $trade_no = $this->getTradeNO(); $cash = $price; $score = 0; if($single_service->id == 12){ //获取520的购买记录 $repeatPayStatus = Order::where(['type_id'=>12,'pay_status'=>'PAID','user_id'=>$user->id])->first(); if($repeatPayStatus){ return $this->failure('当前套餐只能购买一次,请勿重复购买。'); } $state = 1; if(time() > 1621526400){ return $this->failure('活动已过期,请刷新页面后重试'); } }else{ $state = 0; } $pay_type = $request->pay_type; $remark = ''; if($pay_type=='coin'&&$single_service->pay_type=='coin'&&$single_service->can_cash_amount>0&&$single_service->can_coin_amount){ //当前福币 $total_coin = $user->totalCoin(); if($total_coin){//如果福币充足 if($total_coin>=$single_service->can_coin_amount){ $cash = $cash-$single_service->can_cash_amount; $remark = '花费福币'.$single_service->can_coin_amount.'个,抵扣金额'.$single_service->can_cash_amount.'元'; $score = $single_service->can_coin_amount; }else{// $cash = $cash- ($total_coin/10); $remark = '花费福币'.($total_coin).'个,抵扣金额'.($total_coin/10).'元'; $score = $total_coin; } } } $pay_order = array( 'user_id' => $user->id, 'trade_no' => $trade_no, 'pay_status' => 'UNPAID', 'cash' => $cash, 'score' => $score, ); $order = array( 'user_id'=>$user->id, 'type_id'=>$single_service->id, 'goods'=>$single_service->title, 'price'=>$price, 'pay_status'=>'UNPAID', 'num'=>1, 'type'=>'single_service', 'trade_no'=>$trade_no, 'remark'=>$remark, 'from_openid'=>$request->input('from_openid'), 'from_user_id'=>$request->input('from_user_id'), 'chat_user_id'=>$request->input('chat_user_id'), 'share_type'=>$request->input('share_type', 'normal'), 'other_user_id'=>$request->input('other_user_id'), ); \DB::beginTransaction(); //支付订单 $order_pay = PayOrder::create($pay_order); $order = Order::create($order); if ($cash>0) { $wx_pay = \WechatService::constructWXPay($pay_order, $user->id, $single_service->title); }else{ //修改订单状态 $order_pay->pay_status = 'PAID'; $order_pay->is_hooked = 1; $order->pay_status = 'PAID'; $order->save(); $order_pay->save(); //订单回调 $result = $this->markSingleServiceOrder($order); if (empty($result)) throw new \Exception("套餐订单失败", 1); $wx_pay = []; } $order_pay->wx_pay = $wx_pay; \DB::commit(); $order_pay['activity_msg'] = $state; return $this->success('ok', $order_pay); } catch (\Exception $e) { \DB::rollBack(); $this->getError($e); return $this->failure('套餐服务购买失败,请稍后再试'); } } public function buySingleServicesV2(Request $request) { try { $id = $request->id; $single_service = SingleService::where('id',$id)->first(); //生成订单 $user = auth()->user(); $price = $single_service->discount_price; $trade_no = $this->getTradeNO(); $cash = $price; $score = 0; if($single_service->id == 13){ //获取520的购买记录 $repeatPayStatus = Order::where(['type_id'=>13,'pay_status'=>'PAID','user_id'=>$user->id,'goods'=>'企业臻享会员卡'])->first(); if($repeatPayStatus){ return $this->failure('当前套餐只能购买一次,请勿重复购买。'); } $state = 1; }else{ $state = 0; } $pay_order = array( 'user_id' => $user->id, 'trade_no' => $trade_no, 'pay_status' => 'UNPAID', 'cash' => $cash, 'pay_type'=>'wechat', 'score' => $score, ); $order = array( 'user_id'=>$user->id, 'type_id'=>$single_service->id, 'goods'=>$single_service->title, 'price'=>$price, 'pay_status'=>'UNPAID', 'num'=>1, 'pay_type'=>'wechat', 'type'=>'single_service', 'trade_no'=>$trade_no, 'from_openid'=>$request->input('from_openid'), 'share_type'=>$request->input('share_type', 'normal'), 'other_user_id'=>$request->input('other_user_id'), ); \DB::beginTransaction(); //支付订单 $order_pay = PayOrder::create($pay_order); $order = Order::create($order); if ($cash>0) { $callback = config('app.url').'/api/app/callback/orders/'.$trade_no; $wx_pay = \WechatService::constructWXPay($pay_order, $user->id, $single_service->title,$callback); }else{ //修改订单状态 $order_pay->pay_status = 'PAID'; $order_pay->is_hooked = 1; $order->pay_status = 'PAID'; $order->save(); $order_pay->save(); //订单回调 $result = $this->markSingleServiceOrder($order); if (empty($result)) throw new \Exception("套餐订单失败", 1); $wx_pay = []; } $order_pay->wx_pay = $wx_pay; \DB::commit(); $order_pay['activity_msg'] = $state; return $this->success('ok', $order_pay); } catch (\Exception $e) { \DB::rollBack(); $this->getError($e); return $this->failure('套餐服务购买失败,请稍后再试'); } } public function getActivityState(){ $user = auth()->user(); $repeatPayStatus = Order::where(['type_id'=>12,'pay_status'=>'PAID','user_id'=>$user->id])->first(); if($repeatPayStatus){ $repeatPayStatus = 1; }else if(time()>1621526400){ $repeatPayStatus = 2; }else{ $repeatPayStatus = 0; } $topicSuper = $user->getSuperCount($user->id,'520_topic_give'); if($topicSuper){ $topicSuper = 1; }else if(time()>1622476800){ $topicSuper = 2; }else{ $topicSuper = 0; } return $this->success('ok', ['topicSuper'=>$topicSuper,'repeatPayStatus'=>$repeatPayStatus]); } //是否购买企业会员 public function getStatus(Request $request) { $user = auth()->user(); $result = Order::where('user_id',$user->id)->where('type','single_service')->where('goods','企业臻享会员卡')->where('type_id',13)->where('pay_status','PAID')->count()?1:0; $data['status'] =$result; return $this->success('ok', $data); } /** * 回调购买单身服务订单 */ public function markSingleServiceOrder($order) { try { \DB::beginTransaction(); $user = User::find($order->user_id); $pay_order = PayOrder::where('trade_no', $order->trade_no)->first(); if (empty($pay_order)) throw new \Exception("支付订单不存在", 1); //查询服务 $service = SingleService::where('id', $order->type_id)->first(); if (empty($service)) throw new \Exception("服务id:".$order->type_id."不存在", 1); //检测福币 if ($pay_order->score > 0) { $result = $user->addCoinLog('SERVICE', $order->type_id, $pay_order->score, $remark='小程序购买单身服务'); if (empty($result)) throw new \Exception("增加福币记录失败", 1); $result = $user->updateCoinInfo('sub', $pay_order->score); if (empty($result)) throw new \Exception("修改福币信息失败", 1); } // //生成服务记录 // $this->addServiceHistory($user->id, $service->type, $service->type_id); //添加会员期限 $user->addSuperRank(0, $service->rank_month, 'mini_service'); //短信通知艳斌 if ($service->type == 'active' || $service->type == 'passive') { $user_name = User::where('id', $order->user_id)->value('name'); $message = '用户'.$user_name.'购买了'.$service->title.'服务'; $this->sms->sentMessage('13377553550', $message); //短信通知购买服务用户 $notice = '您已成功购买【'.$service->title.'】服务套餐,福恋工作人员将尽快联系您为您服务,请耐心等待。如有问题,请联系:18922809346'; $this->sms->sentMessage($user->mobile,$notice); } if ($user->from_openid) { $array['from_openid'] = $order->user_id; $array['user_id'] = $order->user_id; $array['type'] = 'love'; ReferreAward::dispatch($array)->onQueue('love'); } \DB::commit(); //订阅消息通知用户 // $this->orderSuccessNoticeToUser($order, $user); return true; } catch (\Exception $e) { \DB::rollBack(); $this->getError($e); return false; } } /** * 添加购买服务记录 */ public function addServiceHistory($user_id, $type, $type_id) { $appointment = Appointment::where('type', $type)->where('id', $type_id)->first(); if (empty($appointment)) { return; } AppointmentHistory::create([ 'user_id'=>$user_id, 'point_id'=>$appointment->id, 'price'=>$appointment->price, 'type'=>$type, 'num'=>$appointment->num, ]); return; } /** * 单身服务详情 */ public function singleService(Request $request, SingleService $single_service) { $rank = $single_service->rank; $sub_rank = SubRank::where('rank_id', $single_service->rank_id)->where('month', $single_service->rank_month)->first(); if ($single_service->discount_desc_type == 'json') { $single_service->rank->explain = json_decode($rank->explain); $single_service->rank->feature = json_decode($rank->feature); $single_service->discount_desc = json_decode($single_service->discount_desc); }else{ $single_service->rank->explain = json_decode($rank->explain); $single_service->rank->feature = json_decode($rank->feature); $single_service->discount_desc = explode('****',$single_service->discount_desc); // $single_service->discount_desc = json_decode($single_service->discount_desc); } $single_service->sub_rank = $sub_rank; return $this->success('ok', $single_service); } /** * 订单支付成功订阅订单通知用户 */ public function orderSuccessNoticeToUser($order, $user) { $openid = $user->wechat?$user->wechat->openid:null; if (empty($openid)) { return; } $param = [ "name"=>$order->goods, 'price'=>$order->price, 'updated_at'=>date("Y-m-d H:i:s"), 'openid'=>$openid, ]; \WechatService::orderSuccessSubNotice($param); return; } public function exportOrders() { try { \DB::beginTransaction(); $start_time = "2021-09-01"; $end_time = "2021-11-01"; $orders = Order::with('user', 'fromOpenidUser', 'fromUserIdUser','payorder')->where('pay_status', "PAID")->whereBetween('created_at', [$start_time, $end_time])->get(); $array = []; // foreach ($orders as $order) { // $count = CoinLog::where('type', 'SHARE_ORDER')->where('type_id', $order->id)->count(); // if ($count) continue; // $price = $order->payorder?$order->payorder->cash:$order->price; // //分享价值规则 // if ($order->type == 'single_service'){ // $channel = "service"; // } else { // $channel = $order->type; // } // $channel_obj = WorthChannel::where('channel', $channel)->first(); // //每单总分享价值金额 // $total_value = number_format($channel_obj->amount * $price, 2, '.', ''); // $arr = []; // $arr['order_id'] = $order->id; // $arr['user_id'] = $order->user_id; // $arr['nickname'] = $order->user->nickname; // $arr['price'] = $price; // $arr['goods'] = $order->goods; // $arr['from_openid'] = $order->from_openid; // $arr['from_user_id'] = $order->from_user_id; // $from_openid_user_id = $order->fromOpenidUser?$order->fromOpenidUser->user_id:0; // $arr['is_from_same'] = $from_openid_user_id == $order->from_user_id?"TRUE":"FALSE"; // //截止分享金额 // $arr['direct_value'] = number_format($total_value * $channel_obj->direct_ratio,0, '.', ''); // //分享人用户 // $from_user = $order->fromUserIdUser; // $from_openid_user = $order->fromOpenidUser; // if ($from_user) { // $from_nickname = $from_user->nickname; // //增加余额 // //增加记录 // if ($arr['direct_value'] > 1) { // $from_user->updateCoinInfo($type="add", $arr['direct_value']); // $from_user->addCoinLog('SHARE_ORDER', $order->id, $arr['direct_value'], $remark='分享用户产生订单'); // } // } elseif ($from_openid_user && $from_openid_user->user) { // $from_nickname = $from_openid_user->nickname; // //增加余额 // //增加记录 // if ($arr['direct_value'] > 1) { // $from_openid_user->user->updateCoinInfo($type="add", $arr['direct_value']); // $from_openid_user->user->addCoinLog('SHARE_ORDER', $order->id, $arr['direct_value'], $remark='分享用户产生订单'); // } // } else{ // $from_nickname = null; // } // $arr['from_nickname'] = $from_nickname; // //间接分享用户id // $indirect_user_ids = WorthShare::where('target_user_id', $order->user_id)->where('channel', $channel)->where('sub_channel', 'indirect')->where('product_id', $order->type_id)->pluck('user_id')->toArray(); // $indirect_user_id = implode(',', $indirect_user_ids); // $arr['indirect_user_id'] = $indirect_user_id; // $indirect_mobile = User::whereIn('id', $indirect_user_ids)->pluck('mobile')->toArray(); // $arr['indirect_mobile'] = implode(',', $indirect_mobile); // $arr['indirect_value'] = number_format($total_value * $channel_obj->indirect_ratio, 0, '.', ''); // $indirect_users = User::whereIn('id', $indirect_user_ids)->get(); // foreach ($indirect_users as $indirect_user) { // $value = number_format($arr['indirect_value']/ count($indirect_users),0, '.', ''); // if ($value > 1) { // $indirect_user->updateCoinInfo($type="add", $value); // $indirect_user->addCoinLog('SHARE_ORDER', $order->id, $value, $remark='间接促成用户产生订单'); // } // } // $register_user_id = WorthShare::where('target_user_id', $order->user_id)->where('channel', 'register')->where('sub_channel', 'direct')->value('user_id'); // $arr['register_user_id'] = $register_user_id; // $register_mobile = User::where('id', $register_user_id)->value('mobile'); // $arr['register_mobile'] = $register_mobile; // $arr['register_value'] = number_format($total_value * $channel_obj->bind_ratio, 0, '.', ''); // $register_user = User::find($register_user_id); // if ($register_user && $arr['register_value'] >1) { // $register_user->updateCoinInfo($type="add", $arr['register_value']); // $register_user->addCoinLog('SHARE_ORDER', $order->id, $arr['register_value'], $remark='推荐用户产生订单'); // } // $array[] = $arr; // } \DB::commit(); return \Excel::download(new \App\Exports\OrderWorthExport($array), 'worth.xlsx'); } catch(\Exception $e) { \DB::rollback(); return $this->failure($e->getMessage()); } } // 小程序端购买活动 public function buyBusinessActivity(Request $request) { try { $buy_type = $request->buy_type ?? 'normal';//normal:单独购买 group:拼团购买 $group_id = $request->group_id; $time = date('Y-m-d H:i:s'); $user = $this->authCheck(); $userId = 0; if ($user) { $userId = $user->id; } $merchant_user = MerchantUsers::where('user_id', $userId)->first(); if(!$merchant_user){ $merchant_user_id = $this->matchMerchantUser($userId); $merchant_user = MerchantUsers::where('id', $merchant_user_id)->first(); } if($buy_type && $buy_type == 'group'){ $group = CollageGroup::where('type','community')->where('type_id',$request->id)->first(); if(!$group) return $this->failure('拼团信息不存在'); $history_id = $request->history_id; $history = CollageGroupHistories::where('id',$history_id)->first(); if($history){ \Log::info('购买用户id:'.$merchant_user->id); if($history->deadline < $time) return $this->failure('你慢了一步,拼团已过有效期'); if($history->status == 1) return $this->failure('你慢了一步,该团已被他人完成'); $m_order_ids = CollageGroupHistories::where('group_id',$history->group_id)->where('m_user_id',$merchant_user->id)->where('status',0)->where('deadline','>',$time)->pluck('m_order_id')->toArray(); $exists = TouristOrder::whereIn('id',$m_order_ids)->whereIn('pay_status',[1,4])->first(); if($exists) return $this->failure('该活动你有尚未完成的拼团,请耐心等待'); $exists = CollageGroupHistories::with('tOrder')->whereHas('tOrder',function($sql){ $sql->whereIn('pay_status',[1,4]); })->where('group_id',$group->id)->where('m_user_id',$merchant_user->id)->where('status',1)->first(); if($exists) return $this->failure('你已成功拼团参与过该活动,无需重复参与'); } } $wechat = Wechat::where('user_id', $userId)->first(); $openid = $wechat->openid; $result = CommunityActivity::where('id', $request->id)/*->where('status', 1)->where('is_mp_show', 1)*/->first(); if (!$result) return $this->failure('你参与的活动不存在或已下架。'); if($result->class == 'one'){ $exists = TouristOrder::where('type','community')->where('type_id',$request->id)->whereIn('pay_status',[1,4])->where('account_id',$merchant_user->id)->first(); if($exists) return $this->failure('你已成功报名过该活动,无需重复参与'); } $sku_id = $request->sku_id; //if(!$sku_id&&$result->pay_type =='wechat') return $this->failure('规格参数不存在,请稍后再试。'); if ($sku_id && $buy_type == 'normal') { $skus = json_decode($result->sku, true); $skus = array_column($skus, null, 'sku_id'); $sku = $skus[$sku_id]; if (isset($sku['num']) && $sku['num'] == 0) { $member_num = count($request->linkmen); $price = number_format($sku['price'] * $member_num, 2,'.',''); }else { $price = $sku['price']; } $goods = $sku['name']; $desc = $result->title . '-' . $sku['name'] . ''; if ($result->class == 'one' && $result->apply_deadline) { if ($result->apply_deadline <= $time) return $this->failure('该活动已截止报名,看看其他活动吧'); } }elseif($sku_id && $buy_type == 'group'){ $group = CollageGroup::where('id',$group_id)->first(); $skus = json_decode($group->sku, true); $skus = array_column($skus, null, 'sku_id'); $sku = $skus[$sku_id]; // $price = $sku['discount_price'];//拼团折扣价 if (isset($sku['num']) && $sku['num'] == 0) { $member_num = count($request->linkmen); $price = number_format($sku['discount_price'] * $member_num, 2,'.',''); }else { $price = $sku['discount_price']; } $goods = $sku['name']; $desc = $result->title . '-' . $sku['name'] . ''; } else { $price = $result->price; $goods = null; $desc = $result->title; } if(isset($sku)){ $total_limit_num = $sku['total_limit_num'] ?? 0; $sku_buy_num = (new TouristOrder)->getSkuBuyNum($request->id,$result->merchant_id,$sku_id); $num = 1; if (is_array($request->linkmen)) { $num = count($request->linkmen); } if($total_limit_num && $total_limit_num < ($sku_buy_num + $num)){ return $this->failure('报名人数已超限制'); } } $anchor = Anchor::where('id', $result->anchor_id)->first(); $trade_no = $this->getTradeNo(); $TouristOrder = new \App\Models\Server\TouristOrder(); $TouristOrder->open_id = $openid; $TouristOrder->price = floatval($price); $TouristOrder->pay_type = $result->pay_type; $TouristOrder->type = 'community'; $TouristOrder->type_id = $request->id; $TouristOrder->trade_no = $trade_no; $TouristOrder->goods = $goods; $TouristOrder->desc = $desc; $TouristOrder->group_id = isset($group) ? $group->id : null; $TouristOrder->from_openid = $request->from_openid; $TouristOrder->share_channel_id = $request->share_channel_id; $TouristOrder->merchant_id = $result->merchant_id; $TouristOrder->account_id = $merchant_user->id ?: 0; $TouristOrder->name = $request->name ?? ($wechat->nickname ?: ($request->linkmen[0]['name'] ?? '')); $TouristOrder->mobile = $request->mobile ?? ($request->linkmen[0]['mobile'] ?? ''); $TouristOrder->area_code = $request->area_code; $TouristOrder->channel = 3; $TouristOrder->linkmen = isset($request->linkmen) ? json_encode($request->linkmen) : ''; $TouristOrder->insurance = isset($request->insurance) ? $request->insurance : 0; if (empty($TouristOrder->name) || empty($TouristOrder->mobile)) return $this->failure("未获取到联系人/手机号"); if (isset($request->insurance) && $request->insurance == 1) { $TouristOrder->insurance_info = json_encode($request->insurance_info); } $TouristOrder->withdrawal_radio = $anchor->withdrawal_radio ?? 100; $TouristOrder->sku_id = $sku_id; if ($price == 0) { $TouristOrder->pay_status = 1; $TouristOrder->save(); //$TouristOrder->pay_config = null; $TouristOrder->save(); $result->pay_status = 1; $TouristOrder->wx_pay = []; return $this->success('ok', $TouristOrder); } //如果from_openid没传 根据分享人id拿from_openid if(!$TouristOrder->from_openid && $request->from_user_id){ $TouristOrder->from_openid = Wechat::where('user_id',$request->from_user_id)->value('openid'); } $callback = config('app.url') . '/api/app/callback/Community/' . $trade_no; $score = 0; $pay_order = array( 'user_id' => $userId, 'trade_no' => $trade_no, 'pay_status' => 'UNPAID', 'cash' => floatval($price), 'pay_type' => 'wechat', 'score' => $score, ); $wx_pay = \WechatService::constructWXPay($pay_order, $userId, $result->title, $callback); $TouristOrder->save(); if($buy_type == 'group'){ if($request->history_id){ $history = CollageGroupHistories::find($request->history_id); $deadline = $history->deadline; $is_initiator = 0; }else{ //分享不带history_id 就是团长 $deadline = date('Y-m-d H:i:s',strtotime('+'.$group->expire_in.'hours')); $is_initiator = 1; } $collageGroupHistories = CollageGroupHistories::create([ 'm_user_id'=>$TouristOrder->account_id, 'group_id'=>$TouristOrder->group_id, 'm_order_id'=>$TouristOrder->id, 'is_initiator'=>$is_initiator, 'status'=>0, 'deadline'=>$deadline, ]); $collageGroupHistories->group_master_id = $collageGroupHistories->id; $collageGroupHistories->save(); } $TouristOrder->wx_pay = $wx_pay; //同步订单相关的用户 \App\Jobs\SyncSaasUserByOrder::dispatch($TouristOrder)->onQueue('love'); return $this->success('ok', $TouristOrder); } catch (\Exception $e) { $this->getError($e); return $this->failure("服务器休息,请稍后再试"); } } /** * 获取我的商户订单 * @param Request $request * @return \Illuminate\Contracts\View\Factory|\Illuminate\Http\JsonResponse|\Illuminate\View\View */ public function businesssActivityOrders(Request $request) { $class = $request->class ?: 'one'; $user = $this->authCheck(); $userId = 0; $merchant_user_id = 0; if($user){ $userId = $user->id; $merchant_user_id = $this->matchMerchantUser($userId); } $merchant_user = MerchantUsers::where('id',$merchant_user_id)->first(); $pay_status = $request->input('pay_status', 0); switch ($pay_status) { case 0: $pay_status = [$pay_status];//未支付 break; case 1: $pay_status = [$pay_status, 4];//已支付 break; } if($class == 'one') { if($merchant_user) { $business_order = DB::table('tourist_orders') ->join('community_activities','tourist_orders.type_id','community_activities.id') ->where('community_activities.class','one')->where('channel',3) // ->where('tourist_orders.type','community')->where('account_id',$merchant_user->id)->whereIn('pay_status',[1,4]) ->where('tourist_orders.type','community')->where('account_id',$merchant_user->id)->whereIn('pay_status',$pay_status) ->select('tourist_orders.type','type_id',DB::raw("'business_order' as order_type"),'tourist_orders.price','tourist_orders.pay_type','pay_status','trade_no','goods','tourist_orders.created_at','group_id'); $order = DB::table('orders')->where('user_id', $user->id)->where('type', 'activity')->where('pay_status', 'PAID') ->select('type','type_id',DB::raw("'fulllin_order' as order_type"),'price','pay_type','pay_status','trade_no','goods','created_at','meid as group_id'); $query = $business_order->union($order); $sql = $query->toSql(); $result = DB::table(DB::raw("($sql) as a"))->mergeBindings($query) ->orderBy('created_at','desc')->paginate(); } else { $result = DB::table('orders')->where('user_id', $user->id)->where('type', 'activity')->where('pay_status', 'PAID') ->select('type','type_id',DB::raw("'fulllin_order' as order_type"),'price','pay_type','pay_status','trade_no','goods','created_at','meid as group_id') ->orderBy('created_at','desc')->paginate(); } } else { if($merchant_user) { $business_order = DB::table('tourist_orders') ->join('community_activities','tourist_orders.type_id','community_activities.id') ->where('community_activities.class','many')->where('channel',3) // ->where('tourist_orders.type','community')->where('account_id',$merchant_user->id)->whereIn('pay_status',[1,4]) ->where('tourist_orders.type','community')->where('account_id',$merchant_user->id)->whereIn('pay_status',$pay_status) ->select('tourist_orders.type','type_id',DB::raw("'business_order' as order_type"),'tourist_orders.price','tourist_orders.pay_type','pay_status','trade_no','desc as goods','tourist_orders.created_at','group_id'); //$result = $business_order->orderBy('created_at','desc')->paginate(); $order = DB::table('orders')->where('user_id', $user->id)->where('type', 'single_service')->where('pay_status', 'PAID') ->select('type','type_id',DB::raw("'fulllin_order' as order_type"),'price','pay_type','pay_status','trade_no','goods','created_at','meid as group_id'); $query = $business_order->union($order); $sql = $query->toSql(); $result = DB::table(DB::raw("($sql) as a"))->mergeBindings($query) ->orderBy('created_at','desc')->paginate(); } else { $result = DB::table('orders')->where('user_id', $user->id)->where('type', 'single_service')->where('pay_status', 'PAID') ->select('type','type_id',DB::raw("'fulllin_order' as order_type"),'price','pay_type','pay_status','trade_no','goods','created_at','meid as group_id') ->orderBy('created_at','desc')->paginate(); } } // $result = TouristOrder::where('open_id',$openid)->where('type','community')->whereIn('pay_status',[1,4])->orderBy('id','desc')->paginate(); foreach ($result as $key => $value) { if($value->order_type == 'business_order') { $activity = CommunityActivity::withTrashed()->where('id',$value->type_id)->first(); $value->title = $activity->title; $value->pic = $activity->pic; $value->Subtitle = $activity->Subtitle; $value->pay_type = $activity->pay_type; if($activity->class == 'one') $value->type = 'activity'; if($activity->class == 'many') $value->type = 'service'; $value->is_expire = strtotime('-1 day') > strtotime($value->created_at) ? 1 : 0;//订单是否过期 该字段判断是否可以继续支付 } else { if($value->type == 'activity'){ $activity = Activity::withTrashed()->where('id',$value->type_id)->first(); $value->title = $activity->theme; $value->pic = $activity->poster; $value->Subtitle = $activity->theme; $value->pay_type = $activity->pay_type; }elseif($value->type == 'single_service'){ $single_service = SingleService::withTrashed()->where('id',$value->type_id)->first(); $value->title = $single_service ? $single_service->title : $value->goods; $value->pic = $single_service ? $single_service->pic : ''; $value->Subtitle = $single_service ? $single_service->title : $value->goods; $value->pay_type = 'wechat'; } } //是否是拼团订单 $value->is_group_order = 0; if($value->group_id){ $value->is_group_order = 1; } # code... } // if ($userId == 130163 || $userId == 119488 || $userId == 134494){ $result = $result->toArray(); $date_time = date('Y-m-d H:i:s'); $result['can_pay_count'] = DB::table('tourist_orders') ->join('community_activities', 'tourist_orders.type_id', 'community_activities.id') ->where('community_activities.class', $class) ->where('channel', 3) ->where('tourist_orders.type', 'community') ->where('account_id', $merchant_user_id) ->where('pay_status', 0) ->whereRaw("DATE_ADD(ufutx_tourist_orders.created_at, INTERVAL 1 DAY) > '{$date_time}'") ->count(); // } return $this->success('ok',$result); } //订单详情 public function activityOrder(Request $request, $trade_no) { try { $order_type = $request->input('order_type','fulllin_order'); if($order_type == 'business_order') { $order = TouristOrder::where('trade_no', $trade_no)->first(); if(empty($order)) return $this->failure('未查询到该订单'); $order->pic = $order->activityService->pic; $order->title = $order->activityService->title; $order->sku = $order->goods; unset($order->activityService); } elseif ($order_type == 'fulllin_order') { $order = Order::where('trade_no', $trade_no)->first(); if(empty($order)) return $this->failure('未查询到该订单'); if($order->type == 'rank'){ $order->pic = $order->subRank ? $order->subRank->pic : ''; $order->title = $order->goods; $order->sku = $order->subRank ? $order->subRank->name : ''; unset($order->subRank); }elseif($order->type == 'single_service'){ $order->pic = $order->singleService ? $order->singleService->pic : ''; $order->title = $order->goods; $order->sku = $order->singleService ? $order->singleService->title : ''; unset($order->singleService); }elseif($order->type == 'activity'){ $order->pic = $order->activity ? $order->activity->poster : ''; $order->title = $order->goods; $order->sku = $order->activity ? $order->activity->theme : ''; unset($order->activity); } } else { $order = Order::where('trade_no', $trade_no)->first(); if(empty($order)) return $this->failure('未查询到该订单'); if($order->type == 'rank'){ $order->pic = $order->subRank ? $order->subRank->pic : ''; $order->title = $order->goods; $order->sku = $order->subRank ? $order->subRank->name : ''; unset($order->subRank); }elseif($order->type == 'single_service'){ $order->pic = $order->singleService ? $order->singleService->pic : ''; $order->title = $order->goods; $order->sku = $order->singleService ? $order->singleService->title : ''; unset($order->singleService); }elseif($order->type == 'activity'){ $order->pic = $order->activity ? $order->activity->poster : ''; $order->title = $order->goods; $order->sku = $order->activity ? $order->activity->theme : ''; unset($order->activity); } } //是否是拼团订单 $order->is_group_order = 0; if($order->group_id){ $order->is_group_order = 1; } $show_pay_type = '免费'; if($order['pay_type'] == 'wechat'){ $show_pay_type = '微信支付'; }else if($order['pay_type'] == 'alipay'){ $show_pay_type = '支付宝支付'; }else if($order['pay_type'] == 'ios'){ $show_pay_type = 'IOS支付'; }else if($order['pay_type'] == 'h5'){ $show_pay_type = 'H5支付'; } if(is_int($order['pay_status'])) { $order['pay_status'] = $order['pay_status'] == 0 ? 'UNPAID':'PAID'; } $order['show_pay_type'] = $show_pay_type; $activity = CommunityActivity::find($order->type_id); // $order['show_type'] = $this->orderCon->orderTypeCodeSwitchChinese($order['type']); $order['show_type'] = $activity->class == 'one' ? '活动报名' : '服务报名'; $order['is_expire'] = strtotime('-1 day') > strtotime($order->created_at) ? 1 : 0;//订单是否过期 该字段判断是否可以继续支付 return $this->success('ok', $order); } catch (\Exception $e) { Log::error($e->getMessage()); return $this->failure('数据不存在'); } } public function placeOrder($trade_no) { try { $user = auth()->user(); $order = TouristOrder::where('trade_no', $trade_no)->first(); if (empty($order)) throw new \Exception("未找到对应订单信息"); $openid = $user->wechat?$user->wechat->openid:null; if (empty($openid)) throw new \Exception("未找到下单用户信息"); $callback = env('app.url').'/api/app/callback/business/orders/'.$trade_no; $result = \WechatService::constructMiniPay($trade_no, $openid, $order->price, $order->desc, $order->desc, $callback); return $this->success('ok', $result); }catch (\Exception $e) { $this->getError($e); return $this->failure(); } } /** * 活动/服务订单 重新支付 * @param Request $request * @return \Illuminate\Contracts\View\Factory|\Illuminate\Foundation\Application|\Illuminate\Http\JsonResponse|\Illuminate\View\View */ public function activityRepayment(Request $request) { try { $trade_no = $request->input('trade_no'); if (!$trade_no) { return $this->failure('订单号不能为空'); } $order = TouristOrder::query()->where('trade_no', $trade_no)->first(); if (!$order) { return $this->failure('订单不存在'); } if ($order->pay_status != 0) { return $this->failure('该订单已支付'); } if (strtotime('-1 day') > strtotime($order->created_at)) { return $this->failure('订单已过期'); } if ($order->type != 'community') { return $this->failure('订单类型异常'); } $user = auth()->user(); // $merchant_user_id = $this->matchMerchantUser($user->id); $merchant_user = MerchantUsers::where('id', $order->account_id)->first(); $time = date('Y-m-d H:i:s'); if ($order->group_id){ $group = CollageGroup::where('type','community')->where('type_id',$order->type_id)->first(); if(!$group) return $this->failure('拼团信息不存在'); // $history_id = $request->history_id; // $history = CollageGroupHistories::where('id',$history_id)->first(); $history = CollageGroupHistories::where('group_id',$order->group_id) ->where('m_user_id',$order->account_id) ->where('m_order_id',$order->id) ->first(); if($history){ if($history->deadline < $time) return $this->failure('你慢了一步,拼团已过有效期'); if($history->status == 1) return $this->failure('你慢了一步,该团已被他人完成'); $m_order_ids = CollageGroupHistories::where('group_id',$history->group_id)->where('m_user_id',$merchant_user->id)->where('status',0)->where('deadline','>',$time)->pluck('m_order_id')->toArray(); $exists = \App\Models\Server\TouristOrder::whereIn('id',$m_order_ids)->whereIn('pay_status',[1,4])->first(); if($exists) return $this->failure('该活动你有尚未完成的拼团,请耐心等待'); $exists = CollageGroupHistories::with('tOrder')->whereHas('tOrder',function($sql){ $sql->whereIn('pay_status',[1,4]); })->where('group_id',$group->id)->where('m_user_id',$merchant_user->id)->where('status',1)->first(); if($exists) return $this->failure('你已成功拼团参与过该活动,无需重复参与'); } } $result = CommunityActivity::where('id', $order->type_id)->first(); if (!$result) return $this->failure('你参与的活动不存在或已下架。'); if ($result->class == 'one') { $exists = TouristOrder::where('type', 'community')->where('type_id', $order->type_id)->whereIn('pay_status', [1, 4])->where('account_id', $merchant_user->id)->first(); if ($exists) return $this->failure('你已成功报名过该活动,无需重复参与'); } $sku_id = $order->sku_id; $skus = json_decode($result->sku, true); $skus = array_column($skus, null, 'sku_id'); $sku = $skus[$sku_id]; if (!$order->group_id) { if ($result->class == 'one' && $result->apply_deadline) { if ($result->apply_deadline <= $time) return $this->failure('该活动已截止报名,看看其他活动吧'); } $total_limit_num = $sku['total_limit_num'] ?? 0; $sku_buy_num = (new TouristOrder)->getSkuBuyNum($order->type_id, $result->merchant_id, $sku_id); if ($total_limit_num && $total_limit_num < ($sku_buy_num + count(json_decode($order->linkmen, true)))) { return $this->failure('报名人数已超限制'); } } $callback = config('app.url') . '/api/app/callback/Community/' . $trade_no; $score = 0; $pay_order = array( 'user_id' => $user->id, 'trade_no' => $trade_no, 'pay_status' => 'UNPAID', 'cash' => floatval($order->price), 'pay_type' => 'wechat', 'score' => $score, ); $wx_pay = \WechatService::constructWXPay($pay_order, $user->id, $result->title, $callback); $order->wx_pay = $wx_pay; return $this->success('ok', $order); } catch (\Exception $e) { $this->getError($e); return $this->failure(); } } /** * 取消活动/服务订单 * @param Request $request * @return \Illuminate\Contracts\View\Factory|\Illuminate\Foundation\Application|\Illuminate\Http\JsonResponse|\Illuminate\View\View */ public function cancelActivityOrder(Request $request) { try { $trade_no = $request->input('trade_no'); if (!$trade_no) { return $this->failure('订单号不能为空'); } $user_id = auth()->id(); $merchant_user_id = $this->matchMerchantUser($user_id); $order = TouristOrder::query() ->where('account_id', $merchant_user_id) ->where('type', 'community') ->where('trade_no', $trade_no) ->where('pay_status', 0) ->first(); if (!$order) { return $this->failure('订单不存在'); } $order->delete(); return $this->success('ok'); } catch (\Exception $e) { $this->getError($e); return $this->failure(); } } }