| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405 | <?phpnamespace App\Http\Controllers\Wechat\GzhMsg;use App\Http\Controllers\Wechat\Template\TemplatesController;use App\Http\Controllers\Wechat\Staff\StaffsController;use App\Http\Controllers\Wechat\Material\MaterialsController;use App\Http\Controllers\Wechat\User\UserInfosController;use App\Http\Requests;use App\Http\Controllers\WechatController;use App\Modules\OfficialAccount\Services\ForceSubscribeDelayMsgService;use EasyWeChat\Message\Text;use Illuminate\Http\Request;use Illuminate\Support\Facades\Redis;use EasyWeChat\Foundation\Application;use App\Modules\OfficialAccount\Services\ForceSubscribeService;use App\Modules\WechatMaterial\Services\WechatMaterialSendMsgService;/** * 普通公众号接收消息类 * @author zhoulingjie * */class GzhMsgsController extends WechatController{	public $param;	public $official_account;	public function __construct()	{		v('gzh_msgs_construct');		// 提取gzh_app_id,回调格式domain/$APPID$/callback		preg_match('/\/(.*)?\/callback/i',$_SERVER['REQUEST_URI'],$data);		isset($data[1]) && !empty($data[1]) && $this->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(!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".'<a href="'.env('PROTOCOL').'://site'.$encode_distribution_channel_id.'.'.$WECHAT_CUSTOM_HOST.'.com/recent">查看阅读记录 >> </a> '."\n"."\n".'<a href="'.env('PROTOCOL').'://site'.$encode_distribution_channel_id.'.'.$WECHAT_CUSTOM_HOST.'.com">去书城首页看看 >> </a> '."\n"."\n".'点此<a href="https://help.zhuishuyun.com/?distribution_channel_id='.$encode_distribution_channel_id.'&down=1">联系客服</a>';                    $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'){//     		<xml><ToUserName><![CDATA[gh_9432cc91c481]]></ToUserName>//     		<FromUserName><![CDATA[osCoL1gMD06xkuz-ZkYZlK7lbIaU]]></FromUserName>//     		<CreateTime>1497423859</CreateTime>//     		<MsgType><![CDATA[event]]></MsgType>//     		<Event><![CDATA[subscribe]]></Event>//     		<EventKey><![CDATA[qrscene_osCoL1iAhr_htstSO6XIKvguBs34]]></EventKey>//     		<Ticket><![CDATA[gQHB8TwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAyMnU1XzlHTUdjYm0xMDAwMDAwN08AAgSY30BZAwQAAAAA]]></Ticket>//     		</xml>    		$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'){//     		<xml><ToUserName><![CDATA[gh_9432cc91c481]]></ToUserName>//     		<FromUserName><![CDATA[osCoL1gMD06xkuz-ZkYZlK7lbIaU]]></FromUserName>//     		<CreateTime>1497423859</CreateTime>//     		<MsgType><![CDATA[event]]></MsgType>//     		<Event><![CDATA[subscribe]]></Event>//     		<EventKey><![CDATA[qrscene_osCoL1iAhr_htstSO6XIKvguBs34]]></EventKey>//     		<Ticket><![CDATA[gQHB8TwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAyMnU1XzlHTUdjYm0xMDAwMDAwN08AAgSY30BZAwQAAAAA]]></Ticket>//     		</xml>    		$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'){// <xml><ToUserName><![CDATA[gh_9432cc91c481]]></ToUserName>// <FromUserName><![CDATA[osCoL1gMD06xkuz-ZkYZlK7lbIaU]]></FromUserName>// <CreateTime>1497423781</CreateTime>// <MsgType><![CDATA[event]]></MsgType>// <Event><![CDATA[SCAN]]></Event>// <EventKey><![CDATA[osCoL1iAhr_htstSO6XIKvguBs34]]></EventKey>// <Ticket><![CDATA[gQHB8TwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAyMnU1XzlHTUdjYm0xMDAwMDAwN08AAgSY30BZAwQAAAAA]]></Ticket>// </xml>  //     		gh_b31f44e696d8    		 $message->FromUserName = $openid;    		 $message->Event = 'SCAN';    		 $message->MsgType = 'event';    		 $message->EventKey= '6';    	}    	    	return $message;    }   }
 |