checkSignature(); } // 2. 处理微信事件推送(POST请求) if ($_SERVER['REQUEST_METHOD'] === 'POST') { return $this->handleEvent($EmployeeOpenidModel); } return 'success'; } /** * 处理微信事件 */ private function handleEvent($EmployeeOpenidModel) { // 获取微信推送的原始数据 $xmlData = file_get_contents('php://input'); $xml = simplexml_load_string($xmlData, 'SimpleXMLElement', LIBXML_NOCDATA); if (!$xml) { return 'success'; } // 提取关键信息 $fromUsername = (string)$xml->FromUserName; // 用户的公众号OpenID $toUsername = (string)$xml->ToUserName; // 公众号原始ID $event = (string)$xml->Event; // 事件类型 $eventKey = (string)$xml->EventKey; // 事件KEY值(扫码关注时会有) // 记录日志,方便调试 Log::info('wechat_subscribe_info', '微信关注事件', [ 'FromUserName' => $fromUsername, 'ToUserName' => $toUsername, 'event' => $event, 'eventKey' => $eventKey ]); // 处理关注事件 if ($event == 'subscribe') { try { // 尝试获取用户UnionID $Official = new Official(); $official_user_info = $Official->getApp()->user->get($fromUsername); $unionid = isset($official_user_info['unionid']) ? $official_user_info['unionid'] : ''; if ($unionid) { // 1. 有UnionID,直接绑定公众号OpenID $user_open_data = $EmployeeOpenidModel->where(['unionid' => $unionid])->first(); if ($user_open_data) { $user_open_data->official_openid = $fromUsername; $user_open_data->save(); Log::info('wechat_subscribe_success', '绑定成功', ['unionid' => $unionid, 'openid' => $fromUsername]); } } else { Log::info('wechat_subscribe_error', '获取UnionID失败', [ 'data' => $fromUsername, 'request_data' => $official_user_info ]); } } catch (\Exception $e) { Log::error('wechat_subscribe_exception', '处理异常', [ 'error' => $e->getMessage() ]); } } // 重要:必须返回success return 'success'; } /** * 验证服务器地址有效性 */ private function checkSignature() { $signature = $_GET["signature"] ?? ''; $timestamp = $_GET["timestamp"] ?? ''; $nonce = $_GET["nonce"] ?? ''; $echostr = $_GET["echostr"] ?? ''; if (!$signature || !$timestamp || !$nonce) { return 'Invalid request'; } $token = config('wechat.openplat.token', 'your_token_here'); $tmpArr = [$token, $timestamp, $nonce]; sort($tmpArr, SORT_STRING); $tmpStr = sha1(implode($tmpArr)); if ($tmpStr == $signature) { return $echostr; // 验证成功,返回echostr } else { return 'Invalid signature'; } } }