|
|
<?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'] 消息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;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
}
|