checkToken($token, $signature, $timestamp, $nonce)) { echo $_GET["echostr"]; exit; } } // // 消息体加密 $msgSignature = $_GET['msg_signature']; // 推送消息内容获取 $postXml = file_get_contents('php://input'); $rs = $eventObj->decryptMsg($msgSignature, $timestamp, $nonce, $postXml, $msg); if ($rs !== 0) { echo 'success'; trace('消息内容解析失败:' . $postXml, "error"); exit; } $xml = new DOMDocument(); $xml->loadXML($msg); $msgType = $xml->getElementsByTagName('MsgType')->item(0)->nodeValue; $rs = null; switch ($msgType) { case "event": $event = $xml->getElementsByTagName('Event')->item(0)->nodeValue; $event = strtolower($event); $method = $event . 'Event'; // 接受事件推送 if (method_exists($this, $method)) { $rs = $this->$method($xml); } break; default: // 接受消息推送 $rs = $this->$msgType($xml); break; } if ($rs === null) { echo 'success'; exit; } else { echo $rs; exit; } } /** * 订阅(关注公众号或扫码关注公众号) */ private function subscribeEvent($xml) { $fromUserName = $xml->getElementsByTagName('FromUserName')->item(0)->nodeValue; $toUserName = $xml->getElementsByTagName('ToUserName')->item(0)->nodeValue; // 获取key值 // $key = $xml->getElementsByTagName('EventKey')->item(0)->nodeValue; // 更新用户信息 $this->setUserInfo($fromUserName); // if ($key == '') { // 如果是用户关注公众号 $textData = [ 'ToUserName' => $fromUserName, 'FromUserName' => $toUserName, 'MsgType' => 'text', 'Content' => 'Hello![握手] 欢迎加入志远装饰大家庭! ①找客户→数十种裂变工具[强] ②聊客户→各维度沟通方案[强] ③签客户→定制化签单工具[强] ④跟客户→云CRM精准跟客[强] 通过小程序,我们为您提供一套完整的装企营销获客管理体系。[爱心][爱心][爱心]' ]; $msg = new ResponseMsg(); return $msg->responseText($textData); // } else { // 如果是识别二维码 // // 用户绑定公司 // list($keyName, $method, $val) = explode('_', $key); // if (method_exists($this, $method)) { // return $this->$method($val, $toUserName, $fromUserName); // } // } } /** * 取消订阅 */ private function unsubscribeEvent($xml) { $openid = $xml->getElementsByTagName('FromUserName')->item(0)->nodeValue; // 更新用户是否关注公众号 Employee::where([['official_openid', '=', $openid]])->update(['official_openid'=>'']); } /** * 用户已关注时的事件推送(扫二维码) */ private function scanEvent($xml) { $fromUserName = $xml->getElementsByTagName('FromUserName')->item(0)->nodeValue; $toUserName = $xml->getElementsByTagName('ToUserName')->item(0)->nodeValue; // 消息发送对象 $key = $xml->getElementsByTagName('EventKey')->item(0)->nodeValue; // 是否是通过扫员工二维码绑定 list($method, $val) = explode('_', $key); if (method_exists($this, $method)) { return $this->$method($val, $toUserName, $fromUserName); } } /** * 上报地理位置事件 */ private function locationEvent($xml) { $fromUserName = $xml->getElementsByTagName('FromUserName')->item(0)->nodeValue; $lat = $xml->getElementsByTagName('Latitude')->item(0)->nodeValue; $lng = $xml->getElementsByTagName('Longitude')->item(0)->nodeValue; // 更新用户是否关注公众号 } /** * 点击菜单拉取消息时的事件推送 */ private function clickEvent($xml) { $fromUserName = $xml->getElementsByTagName('FromUserName')->item(0)->nodeValue; $toUserName = $xml->getElementsByTagName('ToUserName')->item(0)->nodeValue; // 消息发送对象 $method = $xml->getElementsByTagName('EventKey')->item(0)->nodeValue; return $this->$method($toUserName, $fromUserName); } /** * 点击菜单跳转链接时的事件推送 */ private function viewEvent($xml) { } /** * 模板消息发送事件 */ private function templatesendjobfinish($xml){ $fromUserName = $xml->getElementsByTagName('FromUserName')->item(0)->nodeValue; $status = $xml->getElementsByTagName('Statuss')->item(0)->nodeValue; trace('fromUserName:'.$fromUserName,'debug'); trace('status:'.$status,'debug'); } /** * 文本消息 */ private function text($xml) { } /** * 语音消息 */ private function voice($xml) { } /** * 视频消息 */ private function video($xml) { } /** * 小视频消息 */ private function shortvideo($xml) { } /** * 地理位置消息 */ private function location($xml) { } /** * 获取用户信息 */ private function setUserInfo($openid) { // 通过openid获取微信信息和unionid if (!$accessToken = Cache::get('zqxg_offi_access_token')) { $accessToken = getAccessToken(config('app.official_appid'), config('app.official_secret')); Cache::set('zqxg_offi_access_token', $accessToken, 7100); } $getUserInfoUrl = 'https://api.weixin.qq.com/cgi-bin/user/info?access_token=' . $accessToken . '&openid=' . $openid . '&lang=zh_CN'; $data = curl($getUserInfoUrl); $data = json_decode($data, true); if (isset($data['errcode']) || empty($data['openid'])) { trace('消息内容解析失败:' . json_encode($data), "error"); return null; } // 更新official_openid Employee::where([['unionid', '=', $data['unionid']]])->update(['official_openid'=>$openid]); } }