getMessageEvent(); if($messageEvent){ $messageEvent ->with(function($message, \Closure $next) use (&$messageEvent, &$request, &$weapp){ // 处理事件 if($message->MsgType === 'event'){ if($message->Event == 'debug_demo'){ return 'minisns debug_demo 测试成功'; }else if($message->Event == 'trade_manage_order_settlement'){ $transaction_id = $message->transaction_id; $the_order = WxOrder::where('order_serial_number', $transaction_id)->first(); if($the_order){ if($the_order->order_state == 5 && !_empty_($the_order->order_serial_number) && $the_order->order_serial_platform === 0 && $the_order->order_serial_platform_type == 'mini'){ // 在等待确认收货 $infomange = $weapp->getDeliverInfoManage(); $wechat_order = $infomange->getDeliverOrder($transaction_id); if($wechat_order){ if(in_array(_array_key($wechat_order, 'order_state', 0), [3,4])){ DB::beginTransaction(); try { WxOrder::where('id', $the_order->id)->update([ 'order_state' => 1 ]); OrderUtils::order_obtains($the_order, 0); DB::commit(); return ''; } catch (\Exception $e) { DB::rollBack(); _logger_(__file__, __line__, $e->getMessage()); } } } } }else{ $shop_order = WxShopOrder::where('serial_number', $transaction_id)->first(); if($shop_order){ if($shop_order->status == 8){ if($shop_order->pay_status == 2 && !_empty_($shop_order->serial_number) && $shop_order->serial_platform === 0 && $shop_order->serial_platform_type == 'mini'){ $infomange = $weapp->getDeliverInfoManage(); $wechat_order = $infomange->getDeliverOrder($transaction_id); if($wechat_order){ if(in_array(_array_key($wechat_order, 'order_state', 0), [3,4])){ if(ShopUtils::coupon_to_finish($shop_order, 0, '')){ // GatewayUtils::success(GatewayUtils::uid2client_id($scanner), 17); GatewayUtils::success(GatewayUtils::uid2client_id($shop_order->user_id), 17); return ''; } } } } }else if($shop_order->status == 10){ if($shop_order->pay_status == 2 && !_empty_($shop_order->serial_number) && $shop_order->serial_platform === 0 && $shop_order->serial_platform_type == 'mini'){ $deliver_manage = $weapp->getDeliverInfoManage(); $wechat_order = $deliver_manage->getDeliverOrder($shop_order->serial_number); if($wechat_order){ if(in_array(_array_key($wechat_order, 'order_state', 0), [3,4])){ DB::beginTransaction(); try { // todo: $ship_at = date('Y-m-d H:i:s', time()); WxShopOrder::withTrashed()->where('id', $shop_order->id)->update([ 'has_virtual' => 1, 'ship_at' => $ship_at, 'status' => 2, ]); ShopUtils::paied_content_process($shop_order->id); DB::commit(); return ''; } catch (\Exception $e) { DB::rollBack(); _logger_(__file__, __line__, $e->getMessage()); } } } } } } } }else{ return ''; } return ''; } return $next($message); }) ->with(function($message, \Closure $next) use (&$messageEvent, &$request){ $mp_open_id = $message->FromUserName; // 处理消息 if($message->MsgType == 'text'){ $chat_content = $message->Content; return ''; } return $next($message); }) ->with(function($message, \Closure $next) use (&$messageEvent){ // 处理客服消息 return $next($message); }); return $messageEvent->response($request); } } } public function mp_event_handler(Request $request){ $weapp = new WeApp('mp'); if($weapp){ $mpServicer = $weapp->getMpServicer(); if($mpServicer){ $mpServicer ->with(function($message, \Closure $next) use (&$mpServicer, &$request){ // 处理事件 if($message->MsgType === 'event'){ if($message->Event == 'debug_demo'){ return 'minisns debug_demo 测试成功'; }else if( $message->Event == 'unsubscribe'){ // 取消关注 $mp_open_id = $message->FromUserName; _logger_(__file__, __line__, $mp_open_id . '已取消关注公众号' . $message->ToUserName); return ''; }else if( $message->Event == 'subscribe' || $message->Event == 'SCAN'){ $mp_open_id = $message->FromUserName; $eventKey = $message->EventKey; if(StrUtils::startsWith($eventKey, 'qrscene_user:bind:') || StrUtils::startsWith($eventKey, 'user:bind:')){ if(StrUtils::startsWith($eventKey, 'user:bind:')){ $user_id = (int)(str_replace('user:bind:', '', $eventKey)); }else{ $user_id = (int)(str_replace('qrscene_user:bind:', '', $eventKey)); } if($user_id > 0){ $alread_user = WxUser::withTrashed()->where('weixin_mp_openid', $mp_open_id)->first(); if($alread_user && $alread_user->id > 0){ if(_empty_($alread_user->weixin_unionid)){ DB::beginTransaction(); try { // todo: WxUser::withTrashed()->where('id', $alread_user->id)->update([ 'weixin_mp_openid' => null ]); WxUser::withTrashed()->where('id', $user_id)->update([ 'weixin_mp_openid' => $mp_open_id ]); DB::commit(); } catch (\Exception $e) { DB::rollBack(); _logger_(__file__, __line__, $e->getMessage()); } } }else{ WxUser::withTrashed()->where('id', $user_id)->update([ 'weixin_mp_openid' => $mp_open_id ]); } } }else if(StrUtils::startsWith($eventKey, 'user:scene:') || StrUtils::startsWith($eventKey, 'qrscene_user:scene:')){ if(StrUtils::startsWith($eventKey, 'qrscene_user:scene:')){ $scene_arr = explode(':', str_replace('qrscene_user:scene:', '', $eventKey)); }else{ $scene_arr = explode(':', str_replace('user:scene:', '', $eventKey)); } $user_id = $scene_arr[0] ?? 0; $to_scene = $scene_arr[1] ?? 0; $to_scene_id = $scene_arr[2] ?? 0; $tenant_id = $scene_arr[3] ?? 0; if($user_id > 0){ $alread_user = WxUser::withTrashed()->where('weixin_mp_openid', $mp_open_id)->first(); if($alread_user && $alread_user->id > 0){ if(_empty_($alread_user->weixin_unionid)){ DB::beginTransaction(); try { // todo: WxUser::withTrashed()->where('id', $alread_user->id)->update([ 'weixin_mp_openid' => null ]); WxUser::withTrashed()->where('id', $user_id)->update([ 'weixin_mp_openid' => $mp_open_id ]); DB::commit(); } catch (\Exception $e) { DB::rollBack(); _logger_(__file__, __line__, $e->getMessage()); } } }else{ WxUser::withTrashed()->where('id', $user_id)->update([ 'weixin_mp_openid' => $mp_open_id ]); } if($to_scene == 31){ return [ "MsgType" => "text", "Content" => '购买会员点这里' ]; }else if($to_scene == 84){ return [ "MsgType" => "text", "Content" => '笔记推广点这里' ]; }else if($to_scene == 163){ return [ "MsgType" => "text", "Content" => '解除账号限制点这里' ]; }else if($to_scene == 80001){ return [ "MsgType" => "text", "Content" => '付费获取Ta的联系方式点这里' ]; }else{ return [ "MsgType" => "text", "Content" => '无效的参数' ]; } } }else{ $res = $mpServicer->getUserInfo($mp_open_id); if($res['code'] == 200 && _array_key($res, 'unionid', '')){ // 如果不存在这个用户 $data = [ 'openId'=>$mp_open_id, 'avatarUrl'=>'', 'city'=>'', 'country'=>'', 'province'=>'', 'language'=>'','nickName' => Settings::get('default_user_name', '微信用户'), 'gender'=>0, 'unionId'=>$res['unionid'] ]; $wxUserModel = new WxUser(); $user_id = $wxUserModel->registerUser($data, 'mp'); } } $mp_message_id = WxMpMessageReply::where('word', 'event_subscribe')->value('mp_message_id'); if($mp_message_id && $mp_message_id > 0){ $mp_message = WxMpMessage::find($mp_message_id); if($mp_message){ return $mp_message->normal(); } } return ''; }else if( $message->Event == 'TEMPLATESENDJOBFINISH'){ return ''; }else if( $message->Event == 'PUBLISHJOBFINISH'){ if($message->publish_id){ $updates = [ 'publish_status' => $message->publish_status, 'article_id' => $message->article_id, 'article_url' => $message->article_url ]; if(!_empty_($updates['article_id'])){ $updates['media_id'] = null; } WxMpFreePublish::where('publish_id', $message->publish_id)->update($updates); } }else{ return ''; } return ''; } return $next($message); }) ->with(function($message, \Closure $next) use (&$mpServicer, &$request){ $mp_open_id = $message->FromUserName; // 处理消息 if($message->MsgType == 'text'){ $chat_content = $message->Content; if($chat_content == '退订'){ update_user_meta(WxUser::withTrashed()->where('weixin_mp_openid', $mp_open_id)->value('id'), 'is_mp_free_publish_notice', 2, 'n'); return [ "MsgType" => "text", "Content" => '退订成功,不再收到公众号的推文提醒,输入“订阅推文”,可重新订阅' ]; }else if($chat_content == '订阅推文'){ update_user_meta(WxUser::withTrashed()->where('weixin_mp_openid', $mp_open_id)->value('id'), 'is_mp_free_publish_notice', 1, 'n'); return [ "MsgType" => "text", "Content" => '订阅成功' ]; }else if($chat_content == '课表'){ return [ "MsgType" => "text", "Content" => $this->get_student_2day_course_text(WxUser::withTrashed()->where('weixin_mp_openid', $mp_open_id)->value('id')) ]; } $query = "SELECT * FROM wx_mp_message_reply WHERE (type = 1 AND word = ?) OR (type = 3 AND word LIKE CONCAT('%', ?, '%')) OR (type = 2 AND ? LIKE CONCAT('%', word, '%'))"; $matches = DB::select($query, [$chat_content, $chat_content,$chat_content]); foreach ($matches as $record) { $mp_message = WxMpMessage::find($record->mp_message_id); if($mp_message){ return $mp_message->normal(); } } return ''; } return $next($message); }) ->with(function($message, \Closure $next) use (&$mpServicer){ // 处理客服消息 return ''; return $next($message); }); return $mpServicer->response($request); } } } private function get_student_2day_course_text($uid){ if(_empty_($uid)){ return ''; } $today_course = StudentUtils::get_student_day_course($uid, 0); $tomorrow_course = StudentUtils::get_student_day_course($uid, 1); $today_date = Carbon::now()->toDateString(); $tomorrow_date = Carbon::now()->addDay()->toDateString(); $url_link = Cache::remember(md5('urllink:pages/tabbar_clone/schedule/schedule'), 3600 * 24, function (){ $new_app = new WeApp(); $wxlink = $new_app->getWxLink(); try { $url_link = $wxlink->genWxUrllink('pages/tabbar_clone/schedule/schedule', 'back=1'); }catch (\Exception $e){ $url_link = $e->getMessage(); } return $url_link; }); $today_course_tip = ''; if($today_course){ foreach ($today_course as $course){ $today_course_tip .= "⭐️".$course->name."\n 老师: ".$course->teacher."\n 地址: ".$course->address."\n 节次: ".$course->getSectionRange()."\n"; } }else{ $today_course_tip = "无\n"; } $tomorrow_course_tip = ''; if($tomorrow_course){ foreach ($tomorrow_course as $course){ $tomorrow_course_tip .= "⭐️".$course->name."\n 老师: ".$course->teacher."\n 地址: ".$course->address."\n 节次: ".$course->getSectionRange()."\n"; } }else{ $tomorrow_course_tip = "无\n"; } return $today_date."课表\n".$today_course_tip."—————————\n".$tomorrow_date."课表\n".$tomorrow_course_tip."—————————\n点击可查看「本周课表」"; } }