getWeixinConfig(); $app = Factory::officialAccount($weixin_config); $app->server->push(function ($message) { platformLog('', $message, 'wechat_get_user_message_' . UID); $result = Notice::messageResponse($message); return $result; }); $response = $app->server->serve(); // 将响应输出 $response->send(); exit; } /** * 接收普通消息并处理 * @param array $message 普通微信用户向公众账号发消息时,微信服务器请求的服务器携带参数 xml已转array * @date 2020-07-23 */ protected function messageResponse($message = []) { switch ($message['MsgType']) { case 'event': if ($message['Event'] == 'subscribe') { //关注事件 return $this->replySubscribe($message); //$message['EventKey']--用户扫描带场景值二维码,未关注公众号并关注公众号 } else if ($message['Event'] == 'unsubscribe') { //取消关注事件 return $this->replyUnsubscribe($message); } else if ($message['Event'] == 'SCAN') { //用户扫描带场景值二维码,已关注公众号进入公众号 return ''; } else if ($message['Event'] == 'LOCATION') { //上报地理位置事件 return ''; } else if ($message['Event'] == 'CLICK') { //自定义菜单事件-点击菜单拉取消息时的事件推送 return $this->replyClick($message); } else if ($message['Event'] == 'VIEW') { //自定义菜单事件-点击菜单跳转链接时的事件推送 return ''; } return '收到事件消息'; break; case 'text': return $this->replyText($message); break; case 'image': return $this->replyDefaultMessage($message); break; case 'voice': return $this->replyDefaultMessage($message); // return '收到语音消息'; break; case 'video': return $this->replyDefaultMessage($message); // return '收到视频消息'; break; case 'shortvideo': return $this->replyDefaultMessage($message); // return '收到小视频消息'; break; case 'location': return $this->replyDefaultMessage($message); // return '收到地理位置消息'; break; case 'link': return $this->replyDefaultMessage($message); // return '收到链接消息'; break; case 'file': return $this->replyDefaultMessage($message); // return '收到文件消息'; default: return $this->replyDefaultMessage($message); // return '收到其它消息'; break; } } /** * 被动回复用户消息 - 默认消息 * @param array $message 普通微信用户向公众账号发消息时,微信服务器请求的服务器携带参数 xml已转array * @param string $message ['ToUserName'] 开发者微信号 * @param string $message ['FromUserName'] 发送方帐号(一个OpenID) * @param int $message ['CreateTime'] 消息创建时间 (整型) * @param string $message ['MsgType'] 消息类型,text * @param string $message ['Content'] 文本消息内容 * @param string $message ['MsgId'] 消息id,64位整型 * @date 2022-12-01 */ protected function replyDefaultMessage($message) { $openid = $message['FromUserName']; // 获取关键字回复内容 $wechat_reply_model = new WechatReply(); $wechat_reply_data = $wechat_reply_model->getOneData([ ['uid', '=', UID], ['trigger_type', '=', 3], ]); $reply = $this->getReplyDataByKeyword($wechat_reply_data, $openid); return $reply; } /** * 被动回复用户消息 - 文本消息 * @param array $message 普通微信用户向公众账号发消息时,微信服务器请求的服务器携带参数 xml已转array * @param string $message ['ToUserName'] 开发者微信号 * @param string $message ['FromUserName'] 发送方帐号(一个OpenID) * @param int $message ['CreateTime'] 消息创建时间 (整型) * @param string $message ['MsgType'] 消息类型,text * @param string $message ['Content'] 文本消息内容 * @param string $message ['MsgId'] 消息id,64位整型 * @date 2020-07-27 */ protected function replyText($message) { $openid = $message['FromUserName']; // 获取关键字回复内容 $wechat_reply_model = new WechatReply(); $wechat_reply_data = $wechat_reply_model->getWechatReply($message['Content']); // 没有找到关键词采用默认回复 if (empty($wechat_reply_data)) { $wechat_reply_data = $wechat_reply_model->getOneData([ ['uid', '=', UID], ['trigger_type', '=', 3], ]); } $reply = $this->getReplyDataByKeyword($wechat_reply_data, $openid); return $reply; } /** * 回复关注事件 * @param array $message 普通微信用户向公众账号发消息时,微信服务器请求的服务器携带参数 xml已转array * @param string $message ['ToUserName'] 开发者微信号 * @param string $message ['FromUserName'] 发送方帐号(一个OpenID) * @param int $message ['CreateTime'] 消息创建时间 (整型) * @param string $message ['MsgType'] 消息类型,event * @param string $message ['Event'] 事件类型 subscribe--订阅 * @param string $message ['EventKey'] 事件KEY值,qrscene_为前缀,后面为二维码的参数值 该值在用户扫描带场景值二维码时才会返回 * @param string $message ['Ticket'] 二维码的ticket,可用来换取二维码图片 该值在用户扫描带场景值二维码时才会返回 * @date 2020-07-27 */ public function replySubscribe($message) { $weixin_param = get_weixin_config(); $wechat_user_model = new WechatUser(['uid' => UID]); $user_class = new \tencent\wechat\weixin\User($weixin_param); $event_key = empty($message['EventKey']) ? '' : $message['EventKey']; $key = substr($event_key, 8); //去掉前面qrscene_前缀之后的二维码的场景值 $openid = $message['FromUserName']; //微信接口获取用户信息 $result = $user_class->getUserInfo($openid); platformLog($message, $result, 'wechat_get_user_info_by_openid_' . UID); //更新用户信息 $res = $wechat_user_model->updateUser($result); //获取关键字回复内容 $wechat_reply_model = new WechatReply(); $wechat_reply_data = $wechat_reply_model->getOneData([ ['trigger_type', '=', 2] ]); return $this->getReplyDataByKeyword($wechat_reply_data, $openid); } /** * 回复取消关注事件 * @param array $message 普通微信用户向公众账号发消息时,微信服务器请求的服务器携带参数 xml已转array * @param string $message ['ToUserName'] 开发者微信号 * @param string $message ['FromUserName'] 发送方帐号(一个OpenID) * @param int $message ['CreateTime'] 消息创建时间 (整型) * @param string $message ['MsgType'] 消息类型,event * @param string $message ['Event'] 事件类型 unsubscribe--取消订阅 * @date 2020-07-27 */ protected function replyUnsubscribe($message) { $openid = $message['FromUserName']; $wechat_user_model = new WechatUser(); //更新微信用户关注状态 $user_update_data = [ 'openid' => $openid, 'subscribe' => 0, 'subscribe_time' => '', ]; //更新用户信息 $wechat_user_model->updateUser($user_update_data); return ''; } /** * 回复关注事件 * @param array $message 普通微信用户向公众账号发消息时,微信服务器请求的服务器携带参数 xml已转array * @param string $message ['ToUserName'] 开发者微信号 * @param string $message ['FromUserName'] 发送方帐号(一个OpenID) * @param int $message ['CreateTime'] 消息创建时间 (整型) * @param string $message ['MsgType'] 消息类型,event * @param string $message ['Event'] 事件类型 CLICK--点击菜单拉取消息 * @param string $message ['EventKey'] 事件KEY值,与自定义菜单接口中KEY值对应 * @date 2020-07-29 */ protected function replyClick($message) { $openid = $message['FromUserName']; //获取关键字回复内容 $wechat_reply_model = new WechatReply(); $wechat_reply_data = $wechat_reply_model->getOneData([ ['id', '=', $message['EventKey']] ]); return $this->getReplyDataByKeyword($wechat_reply_data, $openid); } /** * 被动回复 通过回复内容组装微信需要的格式 * @param string $wechat_kewords 需要回复的消息 * @param string $openid 用户OPENID * @date 2020-07-27 */ protected function getReplyDataByKeyword($wechat_reply, $openid) { if (empty($wechat_reply)) { return ''; } switch ($wechat_reply['type']) { case 'text': return new Text($wechat_reply['content']['text']); break; case 'image': // 图片太大时5秒内执行不完 可以上传图片的时候传为永久素材获取media_id 此处仅使用 // $file = saveFileToLocal($wechat_reply['content']['image_url']); // $result = $app->media->uploadImage($file['local_file']); // platformLog($file['local_file'], $result, 'wechat_upload_image_uid_' . UID); // unlink($file['local_file']); // if (!empty($wechat_reply['content']['media_id'])) { // return new Image($result['media_id']); // } else { // return ''; // } return new Image($wechat_reply['content']['media_id']); break; case 'voice': // 语音太大时5秒内执行不完 可以上传语音的时候传为永久素材获取media_id 此处仅使用 // $file = saveFileToLocal($wechat_reply['content']['voice_url']); // $result = $app->media->uploadVoice($file['local_file']); // platformLog($file['local_file'], $result, 'wechat_upload_voice_uid_' . UID); // unlink($file['local_file']); // if (!empty($result['media_id'])) { // return new Voice($result['media_id']); // } else { // return ''; // } return new Voice($wechat_reply['content']['media_id']); break; case 'video': // 视频太大时5秒内执行不完 可以上传视频的时候传为永久素材获取media_id 此处仅使用 // $file = saveFileToLocal($wechat_reply['content']['video_url']); // $result = $app->media->uploadVideo($file['local_file']); // platformLog($file['local_file'], $result, 'wechat_upload_video_uid_' . UID); // unlink($file['local_file']); // if (!empty($result['media_id'])) { // return new Video($result['media_id'], [ // 'title' => $wechat_reply['content']['title'], // 'description' => $wechat_reply['content']['description'] // ]); // } else { // return ''; // } return new Video($wechat_reply['content']['media_id'], [ 'title' => $wechat_reply['content']['title'], 'description' => $wechat_reply['content']['description'] ]); break; case 'music': // 缩略图太大时5秒内执行不完 可以上传时候传为永久素材获取media_id 此处仅使用 // $file = saveFileToLocal($wechat_reply['content']['thumb_url']); // $result = $app->media->uploadThumb($file['local_file']); // platformLog($file['local_file'], $result, 'wechat_thumb_image_uid_' . UID); // unlink($file['local_file']); // if (!empty($result['thumb_media_id'])) { // $reply_array = [ // 'ToUserName' => $openid, // 'FromUserName' => $this->wechatConfig['weixin_id'], // 'CreateTime' => time(), // 'MsgType' => 'music', // 'Music' => [ // 'Title' => $wechat_reply['content']['title'], // 'Description' => $wechat_reply['content']['description'], // 'MusicUrl' => $wechat_reply['content']['music_url'], // 'HQMusicUrl' => $wechat_reply['content']['hq_music_url'], // 'ThumbMediaId' => $result['thumb_media_id'], //貌似不管用 搜了几篇博客 貌似也是说微信有BUG // ], // ]; // $res = dataToXml($reply_array); // return new Raw($res); // } else { // return ''; // } $reply_array = [ 'ToUserName' => $openid, 'FromUserName' => $this->weixinConfig['weixin_id'], 'CreateTime' => time(), 'MsgType' => 'music', 'Music' => [ 'Title' => $wechat_reply['content']['title'], 'Description' => $wechat_reply['content']['description'], 'MusicUrl' => $wechat_reply['content']['music_url'], 'HQMusicUrl' => $wechat_reply['content']['hq_music_url'], 'ThumbMediaId' => $wechat_reply['content']['media_id'], //貌似不管用 搜了几篇博客 貌似也是说微信有BUG ], ]; $res = dataToXml($reply_array); return new Raw($res); break; case 'news': $wechat_news_model = new WechatNews(); $wechat_news_id = $wechat_reply['content']['news_id']; $news_content = $wechat_news_model->getNews($wechat_news_id, $this->weixinConfig['type'], $openid); foreach ($news_content as $k => $v) { $items[] = new NewsItem($v); } return new News($items); break; case 'transfer': if (!empty($wechat_reply['content']['account'])) { return new Transfer($wechat_reply['content']['account']); } else { return new Transfer(); } break; default: return ''; break; } } }