gzh_app_id=$data[1]; v('$this->gzh_app_id');v($this->gzh_app_id); // 如果redis没有公众号信息,则直接返回,防止被刷 $redis_offcial_account_key = env('redis_offcial_account_key'); if(!empty($redis_offcial_account_key)){ $redis_offcial_account_key = $redis_offcial_account_key.$this->gzh_app_id; $official_account = Redis::hGet($redis_offcial_account_key,'official_account_info'); $official_account = objectToArray(json_decode($official_account)); if(empty($official_account)){ v('construct_not_has_redis_official_account_return:'.$this->gzh_app_id); die(''); }else{ v('construct_has_redis_official_account:'.$this->gzh_app_id); } } v('construct_check_end:'.$this->gzh_app_id); parent::__construct($this->gzh_app_id); $this->Staff = new StaffsController($this->param); $this->Material = new MaterialsController($this->param); $this->UserInfo = new UserInfosController($this->param); } /** * 接收微信回调 http://zydy/wxdbc486f1b4f6a8c3/callback?signature=7aa9eb2a2fd0a0b4c4b4b7acd45f4b77ed990165×tamp=1506838034&nonce=244404927&openid=oAcqg1LRHNKN2jaEkJ5v56HOwPEQ&encrypt_type=aes&msg_signature=8599ff0fec541a4dfe5ccdd3e50a85d56514a5e6 */ public function index(Request $request) { v('gzh_msg_index_start'); if(!$this->checkSignature($request)){ v('return_fail:'); // exit; }else{ v('return_success:'); } v('start_setmessagehander:'.env('DEVELOP_MODE')); if(env('DEVELOP_MODE') == 'local'){ v('local_test'); $message = $this->get_fake_data(); $res = $this->deal_callback($message); }else{ v('start-server'); $this->app->server->setMessageHandler(function ($message) { v('start_deal_callback'); return $this->deal_callback($message); }); } v('last_echo'); $response = $this->app->server->serve(); // 将响应输出 return $response; } function deal_callback($message){ // 开关 $wechat_callback_switch = Redis::get('wechat_callback_switch'); if($wechat_callback_switch){ v('wechat_callback_switch_direct_return:'); return ''; } try{ v('gzh_start_setmessagehander_in'); // 微信全网发布公众号,在第三方框架里面已经做了回应检测了,这里需要直接返回不然有bug if($this->gzh_app_id == 'wx570bc396a51b8ff8'){ v('deal_callback_wxtest_direct_return:'.$this->gzh_app_id); return ''; } v($message); if(isset($this->official_account) && in_array($this->official_account['official_account_type'],array('third_platform_default_login','third_platform_pay'))){ v('deal_callback_myown_direct_return:'.$this->gzh_app_id); return ''; } $openid = isset($message->FromUserName)?$message->FromUserName:''; $this->param['openid'] = $openid; $distribution_channel_id = isset($this->official_account['distribution_channel_id'])?$this->official_account['distribution_channel_id']:''; // 模板消息发送成功,微信回调直接Return if($message->Event == 'TEMPLATESENDJOBFINISH'){ v('event_template_send_job_finish_return:'.$openid); return ''; } $wx_user = $this->WechatApi->get_force_wx_user($this->gzh_app_id,$openid); //增加客服消息实际可送达用户记录 try { ForceSubscribeService::updateGzhUserCustomActive(['openid' => $openid, 'appid' => $this->gzh_app_id, 'distribution_channel_id' => $distribution_channel_id, 'force_user' => $wx_user]); }catch (\Exception $e) { //\Log::error('custom active error:'.$e->getMessage().':'.$e->getFile().':'.$e->getLine()); } switch ($message->MsgType) { case 'event': // 如果关注,则判断是否保存user if($message->Event == 'subscribe'){ v('subscribe:'.$openid); // 如果是微信素材直接进来的关注,则要先判断有没有建立强关场景值映射关系,有的话,直接赋值下EventKey $material_force_subscribe_mapping = $this->WechatApi->get_material_force_subscribe_mapping($this->official_account['distribution_channel_id'],$openid); v('material_force_subscribe_mapping:'.json_encode($material_force_subscribe_mapping)); if(isset($material_force_subscribe_mapping['uid']) && !empty($material_force_subscribe_mapping['uid'])){ $message->EventKey = 'qrscene_'.$material_force_subscribe_mapping['uid']; v('material_force_subscribe_mapping_eventkey:'.$message->EventKey); } // {"ToUserName":"gh_0fdfe1e4f56c","FromUserName":"ovuI01FHKJuIR8wNkJ_7qj1o9_gY","CreateTime":"1507710568","MsgType":"event","Event":"subscribe","EventKey":"qrscene_999","Ticket":"gQF78DwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAyWUs2UlZsLXljUWsxNVB5NXhxMUsAAgRz1d1ZAwQAjScA"} // 强制关注 qrscene_osCoL1iAhr_htstSO6XIKvguBs34 $force_subscribe_sceneId = ''; if(!empty($message->EventKey) && strpos($message->EventKey,'qrscene_') === 0){ $force_subscribe_sceneId = str_replace('qrscene_','',$message->EventKey); v('subscribe_openid:'.$openid.' force_subscribe_sceneId:'.$force_subscribe_sceneId); } // 先判断存在性 if(!empty($wx_user)){ v('exist:'.$openid); v('subscribe:'.$openid); $this->WechatApi->subscribe_wx_user($this->gzh_app_id,$openid); } // 还没访问我们网站,直接关注公众号,TODO暂时原则是要访问了才记录用户信息 else{ v('not_exist:'.$openid); // 有场景值才更新,强制关注新的公众号的时候,肯定是空的 // 站外推广 if(strpos($force_subscribe_sceneId,'outer') > -1){ v('outer_subscribe:'.$openid.' sceneId:'.$force_subscribe_sceneId); } // 如果场景值是其他类型的,则用户不保存 else{ if(!empty($force_subscribe_sceneId)){ v('not_exist_user_save_force_subscribe:'.$openid.' $force_subscribe_sceneId:'.$force_subscribe_sceneId); $data = $this->UserInfo->get_oauth_user_info($openid,$force_subscribe_sceneId); // 保存用户信息 $this->WechatApi->save_force_wx_user($data); } } } ForceSubscribeDelayMsgService::queue($distribution_channel_id,$this->gzh_app_id,$openid); } elseif($message->Event == 'unsubscribe'){ v('unsubscribe:'.$openid); $this->WechatApi->unsubscribe_wx_user($this->gzh_app_id,$openid); ForceSubscribeDelayMsgService::dequeue($openid); } // 扫描事件 elseif($message->Event == 'SCAN'){ $force_subscribe_sceneId = $message->EventKey; v('event_scan:'.$openid.' force_subscribe_sceneId:'.$force_subscribe_sceneId); // {"ToUserName":"gh_0fdfe1e4f56c","FromUserName":"ovuI01FHKJuIR8wNkJ_7qj1o9_gY","CreateTime":"1507710445","MsgType":"event","Event":"SCAN","EventKey":"999","Ticket":"gQF78DwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAyWUs2UlZsLXljUWsxNVB5NXhxMUsAAgRz1d1ZAwQAjScA"} if(!empty($message->EventKey)){ // 强制关注,提前关注的老用户,存储下 if(empty($wx_user)){ v('scan_not_exist_user_save_force_subscribe'); $data = $this->UserInfo->get_oauth_user_info($openid,$force_subscribe_sceneId); // 保存用户信息 $this->WechatApi->save_force_wx_user($data); } // FIXME 针对扫错二维码的用户,强制更新uid,防止一直扫描,对h5的uid还是自己的不影响 else{ $origin_uid = isset($wx_user['uid'])?$wx_user['uid']:''; v('scan_exist_user_update_uid:'.$openid.' scenid:'.$force_subscribe_sceneId.' origin_uid:'.$origin_uid); $this->WechatApi->update_force_wx_user($openid,$force_subscribe_sceneId); } } } // 点击事件 elseif($message->Event == 'CLICK'){ v('event_click:'.$openid); } // 点击事件 elseif($message->Event == 'TEMPLATESENDJOBFINISH'){ v('event_template_send_job_finish:'.$openid); return ''; } // 点击view elseif($message->Event == 'VIEW' || $message->Event == 'view'){ v('event_view_direct_return:'.$openid); return ''; } // 群发消息,返回成功人数 elseif($message->Event == 'MASSSENDJOBFINISH'){ v('event_msg_job_finish:'.$openid); WechatMaterialSendMsgService::update_wechat_material_send_msg_info($message); return ''; } // 统一推送消息 $send_event_content = $this->WechatApi->get_event_content($message->Event,$message->EventKey,$this->gzh_app_id,$openid); v('$send_event_content');v($send_event_content); return $this->Staff->batch_send_wechat_content($openid,$send_event_content,'direct_return'); return ''; break; case 'text': try{ if ($message->Content === '0') $message->Content = '签到'; if ($message->Content === '00') $message->Content = '最近阅读'; if(!empty($message->Content)){ if($message->Content == 't'){ $send_event_content = array(); $send_event_content['text'] = $openid; return $this->Staff->batch_send_wechat_content($openid,$send_event_content,'direct_return'); }else{ // 兼容图片和文字 $send_event_content = $this->WechatApi->get_event_content($message->MsgType,$message->Content,$this->gzh_app_id,$openid); return $this->Staff->batch_send_wechat_content($openid,$send_event_content,'direct_return'); } } } catch(\Exception $e){ v('text_ept:'.$openid.' info:'.$e->getMessage()); } return ''; break; case 'image': $encode_distribution_channel_id = encodeDistributionChannelId($distribution_channel_id); $WECHAT_CUSTOM_HOST = env('WECHAT_CUSTOM_HOST'); $feedback_content = '未找到相关小说,'."\n".'您可以试试:'."\n"."\n".'查看阅读记录 >> '."\n"."\n".'去书城首页看看 >> '."\n"."\n".'点此联系客服'; $send_event_content = array(); $send_event_content['text'] = $feedback_content; return $this->Staff->batch_send_wechat_content($openid,$send_event_content,'direct_return'); return ''; break; case 'voice': return ''; break; case 'media': return ''; break; case 'location': return ''; break; case 'link': return ''; break; // ... 其它消息 default: return ''; break; } return ''; } catch(\Exception $e){ v('deal_call_ept:'.$this->gzh_app_id.' info:'.$e->getMessage()); } return ''; } private function checkSignature($request) { v('checksign_start');v($request->all()); $signature = $request->get('signature'); $timestamp = $request->get('timestamp'); $nonce = $request->get('nonce'); $echostr = $request->get('echostr'); // $msg = ''; // $errCode = $pc->decryptMsg($msg_sign, $timeStamp, $nonce, $from_xml, $msg); // $token = 'd4352c0225d5da500b176cf3464e9822'; $tmpArr = array($this->token, $timestamp, $nonce); sort($tmpArr, SORT_STRING); $tmpStr = implode( $tmpArr ); $tmpStr = sha1( $tmpStr ); v('tmpStr:'.$tmpStr.' signature:'.$signature); if( $tmpStr == $signature ){ return true; }else{ return false; } } function get_fake_data(){ $message = new \stdClass(); $test = 'daily_sign'; $openid = 'oTsZb0cLT7kg3RnxGkfabuRapxMA'; $openid = 'oAcqg1LRHNKN2jaEkJ5v56HOwPEQ'; // $openid = 'oTsZb0cLT7kg3RnxGkfabuRapxMA--9'; if($test == 'subscribe'){ // // // 1497423859 // // // // // $message->ToUserName = 'gh_0fdfe1e4f56c'; $message->FromUserName =$openid; $message->Event = 'subscribe'; $message->EventKey= 'qrscene_outer:1564_752019'; // $message->Event = 'click'; $message->MsgType = 'event'; }elseif($test == 'unsubscribe'){ // // // 1497423859 // // // // // $message->ToUserName = 'gh_0fdfe1e4f56c'; $message->FromUserName = $openid; $message->Event = 'unsubscribe'; $message->EventKey= 'unsubscribe'; // $message->Event = 'click'; $message->MsgType = 'event'; }elseif($test == 'recent_read'){ $message->ToUserName = 'gh_0fdfe1e4f56c'; $message->FromUserName = $openid; $message->EventKey= 'recent_read'; $message->Event = 'click'; $message->MsgType = 'event'; }elseif($test == 'daily_sign'){ $message->ToUserName = 'gh_0fdfe1e4f56c'; $message->FromUserName = $openid; $message->EventKey= 'daily_sign'; $message->Event = 'click'; $message->MsgType = 'event'; }elseif($test == 'contact_customer'){ $message->FromUserName = $openid; $message->Event = 'CLICK'; $message->MsgType = 'event'; $message->EventKey= 'contact_customer'; // $message->Content = '获取我的推广卡'; }elseif($test == 'text'){ $message->FromUserName = $openid; $message->Event = 'text'; $message->MsgType = 'text'; $message->EventKey= 'text'; $message->Content = '我123'; } // 扫描进来,判断来源 elseif($test == 'scan'){ // // // 1497423781 // // // // // // gh_b31f44e696d8 $message->FromUserName = $openid; $message->Event = 'SCAN'; $message->MsgType = 'event'; $message->EventKey= '6'; } return $message; } }