208 lines
6.2 KiB
PHP
208 lines
6.2 KiB
PHP
<?php namespace Gdoo\Wechat\Controllers;
|
|
|
|
use Cache;
|
|
use DB;
|
|
use Log;
|
|
|
|
use Gdoo\Wechat\Models\WechatUser;
|
|
use Gdoo\Wechat\Services\WechatService;
|
|
|
|
use Gdoo\Index\Controllers\Controller;
|
|
|
|
use Gdoo\System\Models\Setting;
|
|
|
|
use EasyWeChat\Factory;
|
|
use EasyWeChat\Kernel\Messages\News;
|
|
use EasyWeChat\Kernel\Messages\NewsItem;
|
|
use EasyWeChat\Kernel\Messages\Text;
|
|
|
|
class EchoController extends Controller
|
|
{
|
|
private $wechat = null;
|
|
private $openid = null;
|
|
|
|
public function __construct() {
|
|
parent::__construct();
|
|
}
|
|
|
|
public function index()
|
|
{
|
|
if (empty($_GET['echostr']) && empty($_GET["signature"]) && empty($_GET["nonce"])) {
|
|
exit('Access denied');
|
|
}
|
|
|
|
$app = WechatService::getApp();
|
|
$app->server->push(function ($msg) {
|
|
|
|
$config = WechatService::getConfig();
|
|
$this->openid = $msg['FromUserName'];
|
|
|
|
if ($config['status'] == 0) {
|
|
return '服务关闭中,请稍后再试。';
|
|
}
|
|
|
|
switch ($msg['MsgType']) {
|
|
case 'text':
|
|
return $msg['Content'];
|
|
break;
|
|
case 'image':
|
|
return $msg['Content'];
|
|
break;
|
|
case 'voice':
|
|
return $msg['Content'];
|
|
break;
|
|
case 'video':
|
|
return '收到视频消息';
|
|
break;
|
|
case 'location':
|
|
return '收到坐标消息';
|
|
break;
|
|
case 'link':
|
|
return '收到链接消息';
|
|
break;
|
|
case 'file':
|
|
return '收到文件消息';
|
|
break;
|
|
case 'event':
|
|
switch (strtolower($msg['Event'])) {
|
|
// 关注
|
|
case 'subscribe':
|
|
//$this->subscribe($msg);
|
|
break;
|
|
// 取消关注
|
|
case 'unsubscribe':
|
|
//$this->subscribe($msg, 'unsubscribe');
|
|
break;
|
|
// 用户扫码已关注时的事件推送
|
|
case 'scan':
|
|
//$this->scan($msg);
|
|
break;
|
|
// 上报地理位置事件 event_location
|
|
case 'location':
|
|
//$this->special('event_location', $msg);
|
|
break;
|
|
// 自定义菜单事件
|
|
case 'click':
|
|
//$this->keyword($msg['EventKey'], $msg);
|
|
break;
|
|
// 点击菜单跳转链接时的事件推送
|
|
case 'view':
|
|
//$this->special('view', $msg);
|
|
break;
|
|
default:
|
|
break;
|
|
break;
|
|
}
|
|
// 其它消息
|
|
default:
|
|
// return '收到其它消息';
|
|
break;
|
|
}
|
|
});
|
|
|
|
return $app->server->serve();
|
|
}
|
|
|
|
/**
|
|
* 文件消息处理
|
|
*/
|
|
protected function api()
|
|
{
|
|
return $this->keys("wechat_keys#keys#{$this->receive['content']}", false, $this->forceCustom);
|
|
}
|
|
|
|
/**
|
|
* 文件消息处理
|
|
*/
|
|
protected function text()
|
|
{
|
|
return $this->keys("wechat_keys#keys#{$this->receive['content']}", false, $this->forceCustom);
|
|
}
|
|
|
|
/**
|
|
* 粉丝关注\取消关注
|
|
*/
|
|
public function subscribe($msg, $type = 'subscribe')
|
|
{
|
|
$friendInfo = $this->api->get_user_info($this->openid);
|
|
$friendInfo = (array)$friendInfo[1];
|
|
$model = WechatUser::firstOrNew(['openid' => $this->openid]);
|
|
// 公众号没有权限获取用户基本信息 可按需求扩展
|
|
if (empty($friendInfo)) {
|
|
if ($type == 'subscribe') {
|
|
} elseif ($type == 'unsubscribe') {
|
|
}
|
|
} else {
|
|
if ($type == 'subscribe') {
|
|
$model->avatar = $friendInfo['headimgurl'];
|
|
$model->openid = $friendInfo['openid'];
|
|
$model->gender = $friendInfo['sex'];
|
|
$model->name = $friendInfo['nickname'];
|
|
$model->address = $friendInfo['country']."\n".$friendInfo['province']."\n".$friendInfo['city'];
|
|
$model->subscribe = 1;
|
|
$model->created_at = time();
|
|
$model->status = 1;
|
|
|
|
// 有场景参数
|
|
if (isset($msg['Ticket'])) {
|
|
$recommend = WechatUser::where('ticket', $msg['Ticket'])->first();
|
|
$model->parent_id = $recommend['id'];
|
|
}
|
|
// 关注成功后发送消息
|
|
|
|
} elseif ($type == 'unsubscribe') {
|
|
$model->subscribe = 0;
|
|
$model->unsubscribe_time = time();
|
|
$model->status = 0;
|
|
}
|
|
|
|
$model->save();
|
|
}
|
|
|
|
if (isset($msg['Ticket'])) {
|
|
$this->replyNews($msg);
|
|
} else {
|
|
$rule = Db::table('wx_mp_rule')
|
|
->where('mpid', $this->mid)
|
|
->where('event', 'subscribe')
|
|
->first();
|
|
|
|
if ($rule) {
|
|
$reply = DB::table('wx_mp_reply')->where('reply_id', $rule['reply_id'])->first();
|
|
$this->we->reply($reply['content']);
|
|
}
|
|
}
|
|
}
|
|
|
|
public function replyArticle($msg) {
|
|
$this->we->reply([
|
|
'type' => 'news',
|
|
'articles' => [[
|
|
'title' => '关注',
|
|
'description' => '关注',
|
|
'picurl' => '',
|
|
'url' => '',
|
|
]]
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* 扫描二维码事件
|
|
*/
|
|
public function scan($msg)
|
|
{
|
|
// 有场景参数
|
|
if (isset($msg['Ticket'])) {
|
|
$this->replyArticle($msg);
|
|
}
|
|
}
|
|
|
|
public function json($data, $status = false)
|
|
{
|
|
$json = [
|
|
'data' => $data,
|
|
'status' => $status,
|
|
];
|
|
return $json;
|
|
}
|
|
} |