123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425 |
- <?php
- namespace addons\wechat\library;
- use addons\signin\model\Signin;
- use addons\third\model\Third;
- use app\common\model\User;
- use EasyWeChat\Kernel\Messages\News;
- use EasyWeChat\Kernel\Messages\NewsItem;
- use fast\Date;
- use fast\Http;
- use fast\Random;
- use think\Session;
- use think\Config;
- /**
- * 微信服务类
- */
- class Wechat
- {
- public static function appConfig()
- {
- return array(
- 'signin' => 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 "请先在会员中心绑定微信登录,<a href='" . addon_url('third/index/connect', [':platform' => 'wechat'], true, true) . "'>点击这里绑定</a>";
- }
- $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;
- }
- }
|