fastadmin/extend/fast/service/Wechat.php

214 lines
7.8 KiB
PHP

<?php
namespace fast\service;
use app\common\model\Page;
use app\common\model\User;
use app\common\model\UserSignin;
use app\common\model\UserThird;
use app\common\model\WechatConfig;
use EasyWeChat\Message\News;
use EasyWeChat\Message\Transfer;
use fast\Date;
use think\Config;
/**
* Wechat服务类
*/
class Wechat
{
public function __construct()
{
}
public static function appConfig()
{
return array(
'signin' => array(
'name' => '签到送积分',
'config' => array(
)
),
'article' => array(
'name' => '关联文章',
'config' => array(
array(
'type' => 'text',
'caption' => '文章ID',
'field' => 'id',
'options' => ''
)
)
),
'page' => array(
'name' => '关联单页',
'config' => array(
array(
'type' => 'text',
'caption' => '单页ID',
'field' => 'id',
'options' => ''
)
)
),
'service' => array(
'name' => '在线客服',
'config' => array(
)
),
);
}
// 微信输入交互内容指令
public function command($obj, $openid, $content, $context)
{
$response = FALSE;
if (isset($content['app']))
{
switch ($content['app'])
{
case 'signin':
case 'article':
case 'page':
break;
case 'service':
$service = (array) json_decode(WechatConfig::value('service'), true);
list($begintime, $endtime) = explode('-', $service['onlinetime']);
$session = $obj->app->staff_session;
$staff = $obj->app->staff;
$kf_account = $session->get($openid)->kf_account;
$time = time();
if (!$kf_account && ($time < strtotime(date("Y-m-d {$begintime}")) || $time > strtotime(date("Y-m-d {$endtime}"))))
{
return $service['offlinemsg'];
}
if (!$kf_account)
{
$kf_list = $staff->onlines()->kf_online_list;
if ($kf_list)
{
$kfarr = [];
foreach ($kf_list as $k => $v)
{
$kfarr[$v['kf_account']] = $v['accepted_case'];
}
$kfkeys = array_keys($kfarr, min($kfarr));
$kf_account = reset($kfkeys);
$session->create($kf_account, $openid);
$response = $service['waitformsg'];
}
else
{
$response = $service['nosessionmsg'];
}
}
else
{
$server = $obj->app->server;
$server->setMessageHandler(function($message) {
return new Transfer();
});
$response = $server->serve();
$response->send();
exit;
}
break;
default:
break;
}
}
else
{
$response = isset($content['content']) ? $content['content'] : $response;
}
return $response;
}
// 微信点击菜单event指令
public function response($obj, $openid, $content, $context)
{
$upload = Config::get('upload');
$response = FALSE;
if (isset($content['app']))
{
switch ($content['app'])
{
case 'signin':
$thirdinfo = UserThird::get(['platform' => 'wechat', 'openid' => $openid]);
if (!$thirdinfo)
{
$response = '您还没有<a href="' . url('index/user/third', 'action=redirect&platform=wechat', true, true) . '">绑定用户</a>还不能签到!';
}
else
{
$user_id = $thirdinfo->user_id;
$usersign = new UserSignin;
$signdata = $usersign->where('user_id', '=', $user_id)->where('createtime', '>=', Date::unixtime())->find();
if ($signdata)
{
$response = '今天已签到,请明天再来!';
}
else
{
$signdata = (array) json_decode(WechatConfig::value('signin'), TRUE);
$lastdata = $usersign->where('user_id', $user_id)->order('id', 'desc')->limit(1)->find();
$successions = $lastdata && $lastdata['createtime'] > Date::unixtime('day', -1) ? $lastdata['successions'] + 1 : 1;
$usersign->save(['user_id' => $thirdinfo['user_id'], 'successions' => $successions, 'createtime' => time()]);
$score = isset($signdata['s' . $successions]) ? $signdata['s' . $successions] : $signdata['sn'];
User::where(['id' => $user_id])->setInc('score', $score);
$response = '签到成功!连续签到' . $successions . '天!获得' . $score . '积分';
}
}
break;
case 'article':
$id = explode(',', $content['id']);
$pagelist = Page::all($id);
$response = [];
foreach ($pagelist as $k => $pageinfo)
{
if ($pageinfo)
{
$news = new News();
$news->title = $pageinfo['title'];
$news->url = $pageinfo['url'] ? $pageinfo['url'] : url('index/page/show', ['id' => $pageinfo['id']], true, true);
$news->image = $upload['cdnurl'] . $pageinfo['image'];
$news->description = $pageinfo['description'];
$response[] = $news;
}
}
case 'page':
$id = isset($content['id']) ? $content['id'] : 0;
$pageinfo = Page::get($id);
if ($pageinfo)
{
$news = new News();
$news->title = $pageinfo['title'];
$news->url = $pageinfo['url'] ? $pageinfo['url'] : url('index/page/show', ['id' => $pageinfo['id']], true, true);
$news->image = $upload['cdnurl'] . $pageinfo['image'];
$news->description = $pageinfo['description'];
return $news;
}
break;
case 'service':
$response = $this->command($obj, $openid, $content, $context);
break;
default:
break;
}
}
else
{
$response = isset($content['content']) ? $content['content'] : $response;
}
return $response;
}
}