array( 'name' => '签到送积分', 'config' => array() ), 'blog' => array( 'name' => '关联博客', 'config' => array( array( 'type' => 'text', 'caption' => '日志ID', 'field' => 'post_id', 'rule' => '', 'extend' => 'class="form-control selectpage" data-source="blog/post/index" data-field="title"', 'options' => '', ), array( 'type' => 'radio', 'caption' => '开启搜索日志', 'field' => 'searchpost', 'rule' => '', 'extend' => '', 'options' => [ '1' => '是', '0' => '否', ], ), array( 'type' => 'text', 'caption' => '正则搜索匹配索引', 'field' => 'searchregexindex', 'rule' => '', 'defaultvalue' => '1', 'extend' => '', 'options' => [], ) ) ), 'cms' => array( 'name' => '关联CMS', 'config' => array( array( 'type' => 'text', 'caption' => '文章ID', 'field' => 'archives_id', 'rule' => '', 'extend' => 'class="form-control selectpage" data-source="cms/archives/index" data-field="title"', 'options' => '' ), array( 'type' => 'text', 'caption' => '单页ID', 'field' => 'page_id', 'rule' => '', 'extend' => 'class="form-control selectpage" data-source="cms/page/index" data-field="title"', 'options' => '' ), array( 'type' => 'text', 'caption' => '专题ID', 'field' => 'special_id', 'rule' => '', 'extend' => 'class="form-control selectpage" data-source="cms/special/index" data-field="title"', 'options' => '' ), array( 'type' => 'radio', 'caption' => '开启搜索文章', 'field' => 'searcharchives', 'rule' => '', 'extend' => '', 'options' => [ '1' => '是', '0' => '否', ], ), array( 'type' => 'radio', 'caption' => '开启搜索单页', 'field' => 'searchpage', 'rule' => '', 'extend' => '', 'options' => [ '1' => '是', '0' => '否', ], ), array( 'type' => 'radio', 'caption' => '开启搜索专题', 'field' => 'searchspecial', 'rule' => '', 'extend' => '', 'options' => [ '1' => '是', '0' => '否', ], ), array( 'type' => 'text', 'caption' => '正则搜索匹配索引', 'field' => 'searchregexindex', 'rule' => '', 'defaultvalue' => '1', 'extend' => '', 'options' => [], ) ) ), 'ask' => array( 'name' => '关联问答', 'config' => array( array( 'type' => 'text', 'caption' => '问题ID', 'field' => 'question_id', 'extend' => 'class="form-control selectpage" data-source="ask/question/index" data-field="title"', 'options' => '' ), array( 'type' => 'text', 'caption' => '文章ID', 'field' => 'article_id', 'extend' => 'class="form-control selectpage" data-source="ask/article/index" data-field="title"', 'options' => '' ), array( 'type' => 'radio', 'caption' => '开启搜索问题', 'field' => 'searchquestion', 'rule' => '', 'extend' => '', 'options' => [ '1' => '是', '0' => '否', ], ), array( 'type' => 'radio', 'caption' => '开启搜索文章', 'field' => 'searcharticle', 'rule' => '', 'extend' => '', 'options' => [ '1' => '是', '0' => '否', ], ), array( 'type' => 'text', 'caption' => '正则搜索匹配索引', 'field' => 'searchregexindex', 'rule' => '', 'defaultvalue' => '1', 'extend' => '', 'options' => [], ) ) ), 'vote' => array( 'name' => '关联投票', 'config' => array( array( 'type' => 'text', 'caption' => '投票主题ID', 'field' => 'subject_id', 'extend' => 'class="form-control selectpage" data-source="vote/subject/index" data-field="title"', 'rule' => '', 'options' => '' ), array( 'type' => 'text', 'caption' => '参赛人员ID', 'field' => 'player_id', 'rule' => '', 'extend' => 'class="form-control selectpage" data-source="vote/player/index" data-field="nickname"', 'options' => '' ), array( 'type' => 'radio', 'caption' => '开启搜索主题', 'field' => 'searchsubject', 'rule' => '', 'extend' => '', 'options' => [ '1' => '是', '0' => '否', ], ), array( 'type' => 'radio', 'caption' => '开启搜索参赛人员', 'field' => 'searchplayer', 'rule' => '', 'extend' => '', 'options' => [ '1' => '是', '0' => '否', ], ), array( 'type' => 'text', 'caption' => '正则搜索匹配索引', 'field' => 'searchregexindex', 'rule' => '', 'defaultvalue' => '1', 'extend' => '', 'options' => [], ) ) ), ); } /** * 应用交互 * @return array|bool|mixed|string */ public function response($obj, $openid, $message, $content, $context, $matches = null) { $response = false; if (isset($content['app'])) { $entry = null; $keyword = isset($content['searchregexindex']) && $content['searchregexindex'] > -1 && $matches && isset($matches[$content['searchregexindex']]) ? $matches[$content['searchregexindex']] : $message; switch ($content['app']) { case 'signin': $signinInfo = get_addon_info('signin'); if (!$signinInfo || !$signinInfo['state']) { return "请先在后台管理安装并启用《会员签到》插件"; } $thirdInfo = get_addon_info('third'); if (!$thirdInfo || !$thirdInfo['state']) { return "请先在后台管理安装并启用《第三方登录》插件"; } $user = self::getUserByOpenid($openid); if (!$user) { return "请先在会员中心绑定微信登录, 'wechat'], true, true) . "'>点击这里绑定"; } $config = get_addon_config('signin'); $signdata = $config['signinscore']; $lastdata = Signin::where('user_id', $user->id)->order('id', 'desc')->find(); $successions = $lastdata && $lastdata['createtime'] > Date::unixtime('day', -1) ? $lastdata['successions'] : 0; $signin = Signin::where('user_id', $user->id)->whereTime('createtime', 'today')->find(); if ($signin) { return '今天已签到,请明天再来!'; } else { $successions++; Signin::create(['user_id' => $user->id, 'successions' => $successions, 'createtime' => time()]); $score = isset($signdata['s' . $successions]) ? $signdata['s' . $successions] : $signdata['sn']; $user->setInc('score', $score); User::score($score, $user->id, "连续签到{$successions}天"); return '签到成功!连续签到' . $successions . '天!获得' . $score . '积分,'; } break; case 'blog': $blogInfo = get_addon_info('blog'); if (!$blogInfo || !$blogInfo['state']) { return "请先在后台管理安装并启用《简单博客》插件"; } $entry = \addons\blog\model\Post::get($content['post_id']); if ($entry) { $entry['image'] = $entry['thumb']; } if (!$entry && $content['searchpost']) { $entry = \addons\blog\model\Post::where("title|description", 'like', "%{$keyword}%")->where('status', 'normal')->find(); } if (!$entry) { return "未搜索到任何匹配信息$keyword" . json_encode($matches); } break; case 'cms': $cmsInfo = get_addon_info('cms'); if (!$cmsInfo || !$cmsInfo['state']) { return "请先在后台管理安装并启用《CMS内容管理系统》插件"; } if (isset($content['archives_id']) && $content['archives_id']) { $entry = \addons\cms\model\Archives::get($content['archives_id']); } elseif (isset($content['page_id']) && $content['page_id']) { $entry = \addons\cms\model\Page::get($content['page_id']); } elseif (isset($content['special_id']) && $content['special_id']) { $entry = \addons\cms\model\Special::get($content['special_id']); } if (!$entry && $content['searcharchives']) { $entry = \addons\cms\model\Archives::where("title|description", 'like', "%{$keyword}%")->where('status', 'normal')->find(); } if (!$entry && $content['searchpage']) { $entry = \addons\cms\model\Page::where("title|description", 'like', "%{$keyword}%")->where('status', 'normal')->find(); } if (!$entry && $content['searchspecial']) { $entry = \addons\cms\model\Special::where("title|description", 'like', "%{$keyword}%")->where('status', 'normal')->find(); } if (!$entry) { return "未搜索到任何匹配信息"; } break; case 'ask': $blogInfo = get_addon_info('ask'); if (!$blogInfo || !$blogInfo['state']) { return "请先在后台管理安装并启用《知识付费问答》插件"; } if (isset($content['question_id']) && $content['question_id']) { $entry = \addons\ask\model\Question::get($content['question_id']); } elseif (isset($content['article_id']) && $content['article_id']) { $entry = \addons\ask\model\Article::get($content['article_id']); } if (!$entry && $content['searchquestion']) { $entry = \addons\ask\model\Question::where("title", 'like', "%{$keyword}%")->where('status', 'normal')->find(); } if (!$entry && $content['searcharticle']) { $entry = \addons\ask\model\Article::where("title|description", 'like', "%{$keyword}%")->where('status', 'normal')->find(); } if (!$entry) { return "未搜索到任何匹配信息"; } break; case 'vote': $blogInfo = get_addon_info('vote'); if (!$blogInfo || !$blogInfo['state']) { return "请先在后台管理安装并启用《在线投票系统》插件"; } if (isset($content['subject_id']) && $content['subject_id']) { $entry = \addons\vote\model\Subject::all($content['subject_id']); } elseif (isset($content['player_id']) && $content['player_id']) { $entry = \addons\vote\model\Player::all($content['player_id']); } if (!$entry && $content['searchsubject']) { $entry = \addons\vote\model\Subject::where("title|description", 'like', "%{$keyword}%")->where('status', 'normal')->find(); } if (!$entry && $content['searchplayer']) { $entry = \addons\vote\model\Player::where("nickname", 'like', "%{$keyword}%")->where('status', 'normal')->find(); } if (!$entry) { return "未搜索到任何匹配信息"; } break; default: break; } if (isset($entry) && $entry) { $items = [ new NewsItem([ 'title' => isset($entry['title']) ? $entry['title'] : (isset($entry['nickname']) ? $entry['nickname'] : ''), 'description' => isset($entry['description']) ? $entry['description'] : '', 'url' => $entry['fullurl'], 'image' => cdnurl($entry['image'], true), ]), ]; $news = new News($items); $response[] = $news; } } else { $response = isset($content['content']) ? $content['content'] : $response; } return $response; } /** * 获取Token */ public static function getAccessToken() { $token = Session::get('wechat_access_token'); if (!$token) { $config = get_addon_config('wechat'); $params = [ 'grant_type' => 'client_credential', 'appid' => $config['app_id'], 'secret' => $config['secret'], ]; $url = "https://api.weixin.qq.com/cgi-bin/token"; $result = Http::sendRequest($url, $params, 'GET'); if ($result['ret']) { $msg = (array)json_decode($result['msg'], true); if (isset($msg['access_token'])) { $token = $msg['access_token']; Session::set('wechat_access_token', $token, $msg['expires_in'] - 1); } } } return $token; } /** * 根据Openid获取用户信息 * @param string $openid 微信OpenID * @return User|null */ public static function getUserByOpenid($openid) { $third = Third::where('platform', 'wechat')->where('openid', $openid)->find(); if ($third && $third->user_id) { return User::get($third->user_id); } return null; } }