You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

389 lines
16 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<?php
namespace app\base\controller\wechat\platform;
use app\base\model\wechat\WechatNews;
use app\base\model\wechat\WechatReply;
use app\base\model\wechat\WechatUser;
use EasyWeChat\Factory;
use EasyWeChat\Kernel\Messages\Image;
use EasyWeChat\Kernel\Messages\News;
use EasyWeChat\Kernel\Messages\NewsItem;
use EasyWeChat\Kernel\Messages\Raw;
use EasyWeChat\Kernel\Messages\Text;
use EasyWeChat\Kernel\Messages\Transfer;
use EasyWeChat\Kernel\Messages\Video;
use EasyWeChat\Kernel\Messages\Voice;
use think\App;
class Notice extends Base
{
/**
* 公众平台和服务器对接
* @date 2020-07-23
*/
public function serveConfig()
{
$weixin_param = get_weixin_config();
$notice_class = new \tencent\wechat\weixin\Notice($weixin_param);
$weixin_config = $notice_class->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'] 消息id64位整型
* @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'] 消息id64位整型
* @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;
}
}
}