You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
482 lines
14 KiB
482 lines
14 KiB
3 weeks ago
|
<?php
|
||
|
namespace app\api\controller\wanlshop;
|
||
|
|
||
|
use app\common\controller\Api;
|
||
|
use addons\wanlshop\library\WanlChat\WanlChat;
|
||
|
use think\Session;
|
||
|
use think\Db;
|
||
|
/**
|
||
|
* WanlShop即时通讯接口
|
||
|
*/
|
||
|
class Chat extends Api
|
||
|
{
|
||
|
protected $noNeedLogin = ['shake','service','hello','state'];
|
||
|
protected $noNeedRight = ['*'];
|
||
|
|
||
|
|
||
|
public function _initialize()
|
||
|
{
|
||
|
parent::_initialize();
|
||
|
//WanlChat 即时通讯调用
|
||
|
$this->wanlchat = new WanlChat();
|
||
|
// 调用配置
|
||
|
$this->chatConfig = get_addon_config('wanlshop');
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 查询店铺信息 1.0.8升级
|
||
|
*
|
||
|
* @ApiSummary (WanlShop 查询店铺信息)
|
||
|
* @ApiMethod (POST)
|
||
|
*
|
||
|
* @param string $id 店铺ID
|
||
|
*/
|
||
|
public function getShopChat()
|
||
|
{
|
||
|
//设置过滤方法
|
||
|
$this->request->filter(['strip_tags']);
|
||
|
if ($this->request->isPost()) {
|
||
|
$id = $this->request->post('id');
|
||
|
// 1.0.2升级 判断来源
|
||
|
$type = $this->request->post('type');
|
||
|
$id ? $id : ($this->error(__('非正常访问')));
|
||
|
$row = model('app\api\model\wanlshop\Shop')
|
||
|
->where(['id' => $id])
|
||
|
->field('id,user_id,shopname,avatar,state,level,city,like,isself,createtime')
|
||
|
->find();
|
||
|
if($row){
|
||
|
if($type == 'chat'){
|
||
|
if(!$this->wanlchat->isWsStart()){
|
||
|
$this->error('IM即时通讯异常:请启动IM即时通讯服务');
|
||
|
}else{
|
||
|
// 查询是否发送离线消息
|
||
|
$shop_config = model('app\api\model\wanlshop\ShopConfig')
|
||
|
->where(['shop_id' => $row['id']])
|
||
|
->find();
|
||
|
// 查询是否存在聊天记录,如果不存在则发送欢迎消息
|
||
|
if($shop_config['welcome']){
|
||
|
$count = model('app\api\model\wanlshop\Chat')->where("((form_uid={$row['user_id']} and to_id={$this->auth->id}) or (form_uid={$this->auth->id} and to_id={$row['user_id']})) and type='chat'")->count();
|
||
|
if($count == 0){
|
||
|
$this->wanlchat->send($this->auth->id, [
|
||
|
'id' => $count + 1,
|
||
|
'to_id' => $this->auth->id,
|
||
|
'type' => 'chat',
|
||
|
'form' => [
|
||
|
'id' => $row['user_id'],
|
||
|
'shop_id' => $row['id'],
|
||
|
'name' => $row['shopname'],
|
||
|
'avatar' => $row['avatar']
|
||
|
],
|
||
|
'message' => [
|
||
|
'type' => 'text',
|
||
|
'content' => [
|
||
|
'text' => $shop_config['welcome']
|
||
|
]
|
||
|
],
|
||
|
'createtime' => time()
|
||
|
]);
|
||
|
}
|
||
|
}
|
||
|
// 查询商家是否在线
|
||
|
$row['isOnline'] = $this->wanlchat->isOnline($row['user_id']);
|
||
|
}
|
||
|
}
|
||
|
$this->success('返回成功', $row);
|
||
|
}
|
||
|
if($type == 'chat'){
|
||
|
$this->error(__('对方不是商家,禁止操作'));
|
||
|
}
|
||
|
}
|
||
|
$this->error(__('非正常访问'));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 绑定UID
|
||
|
*
|
||
|
* @ApiSummary (WanlChat 绑定UID)
|
||
|
* @ApiMethod (POST)
|
||
|
*
|
||
|
* @param string $client_id
|
||
|
*/
|
||
|
public function shake()
|
||
|
{
|
||
|
//设置过滤方法
|
||
|
$this->request->filter(['strip_tags']);
|
||
|
if($this->request->isPost()){
|
||
|
$client_id = $this->request->post('client_id');
|
||
|
$client_id?'':($this->error(__('Invalid parameters')));
|
||
|
// 绑定在线
|
||
|
if ($this->auth->isLogin()) {
|
||
|
$user_id = $this->auth->id;
|
||
|
// 查询有没有绑定其他如果有的话全部解绑,退出登录页执行此操作
|
||
|
foreach ($this->wanlchat->getUidToClientId($user_id) as $client_id_old) {
|
||
|
$this->wanlchat->unbind($client_id_old, $user_id);
|
||
|
}
|
||
|
// 重新绑定一个新的
|
||
|
$this->wanlchat->bind($client_id, $user_id);
|
||
|
// 查询是否有离线消息
|
||
|
$list = model('app\api\model\wanlshop\Chat')
|
||
|
->where(['to_id' => $user_id, 'online' => 0, 'type' => 'chat'])
|
||
|
->whereTime('createtime', 'week')
|
||
|
->field('id,form_uid,to_id,form,message,type,online,createtime')
|
||
|
->select();
|
||
|
foreach($list as $message){
|
||
|
$this->wanlchat->send($user_id, $message);
|
||
|
model('app\api\model\wanlshop\Chat')->save(['online' => 1], ['id' => $message['id']]);
|
||
|
}
|
||
|
$this->success(__('即时通讯初始化成功'), $client_id);
|
||
|
}else{
|
||
|
// 绑定离线,可能用户在线客服等其他消息通知
|
||
|
|
||
|
$this->success(__('即时通讯离线初始化成功'), $client_id);
|
||
|
}
|
||
|
}
|
||
|
$this->error(__('非正常请求'));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 聊天列表
|
||
|
*
|
||
|
* @ApiSummary (WanlChat 读取聊天列表)
|
||
|
* @ApiMethod (GET)
|
||
|
*/
|
||
|
public function lists()
|
||
|
{
|
||
|
$user_id = $this->auth->id;
|
||
|
$list = [];
|
||
|
$sub = Db::name('WanlshopChat')
|
||
|
->where(['type' => 'chat'])
|
||
|
->order('createtime', 'desc')
|
||
|
->field('to_id as uid, message, isread, type, createtime')
|
||
|
->where('form_uid ='.$user_id)
|
||
|
->union('SELECT form_uid as uid, message, isread, type, createtime FROM '.config('database.prefix').'wanlshop_chat WHERE to_id = '.$user_id)
|
||
|
->buildSql();
|
||
|
$query = Db::table($sub)
|
||
|
->alias('temp')
|
||
|
->group('temp.uid')
|
||
|
->select();
|
||
|
foreach($query as $row)
|
||
|
{
|
||
|
if($row['type'] == 'chat'){ //临时
|
||
|
$shop = model('app\api\model\wanlshop\Shop')
|
||
|
->where(['user_id' => $row['uid']])
|
||
|
->find();
|
||
|
// 1.1.9升级 过滤非商家用户
|
||
|
if($shop){
|
||
|
// 统计未读
|
||
|
$count = model('app\api\model\wanlshop\Chat')
|
||
|
->where(['form_uid' => $shop['user_id'], 'to_id' => $user_id, 'isread' => 0])
|
||
|
->count();
|
||
|
$content = json_decode($row['message'], true);
|
||
|
// 转换为文字消息 1.0.2升级
|
||
|
if($content['type'] == 'img'){
|
||
|
$msgtext = '[图片消息]';
|
||
|
}else if($content['type'] == 'voice'){
|
||
|
$msgtext = '[语音消息]';
|
||
|
}else if($content['type'] == 'goods'){
|
||
|
$msgtext = '[商品消息]';
|
||
|
}else if($content['type'] == 'order'){
|
||
|
$msgtext = '[订单消息]';
|
||
|
}else if($content['type'] == 'text'){
|
||
|
$msgtext = $content['content']['text'];
|
||
|
}else{
|
||
|
$msgtext = '[未知消息类型]';
|
||
|
}
|
||
|
// 输出
|
||
|
$list[] = [
|
||
|
'id' => $shop['id'],
|
||
|
'user_id' => $shop['user_id'],
|
||
|
'name' => $shop['shopname'],
|
||
|
'avatar' => $shop['avatar'],
|
||
|
'content' => $msgtext,
|
||
|
'count' => $count,
|
||
|
'createtime' => $row['createtime']
|
||
|
];
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
$this->success(__('OK'),$list);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 发送消息
|
||
|
*
|
||
|
* @ApiSummary (WanlChat 发送即使消息)
|
||
|
* @ApiMethod (POST)
|
||
|
*
|
||
|
* @param string $message 消息内容JSON
|
||
|
*/
|
||
|
public function send()
|
||
|
{
|
||
|
//设置过滤方法
|
||
|
$this->request->filter(['strip_tags']);
|
||
|
if($this->request->isPost()){
|
||
|
// 判断服务是否启动
|
||
|
if(!$this->wanlchat->isWsStart()){
|
||
|
$this->error('请启动IM即时通讯服务');
|
||
|
}
|
||
|
$message = $this->request->post();
|
||
|
$message['type'] = 'chat'; //用户唯一发送口,加chat防止伪装客服或其他类型消息
|
||
|
$message?'':($this->error(__('Invalid parameters')));
|
||
|
if($message['form']['id'] != $this->auth->id){
|
||
|
$this->error(__('非法访问'));
|
||
|
}
|
||
|
// 判断是否为自己
|
||
|
if($message['form']['id'] == $message['to_id']){
|
||
|
$this->error(__('不允许自己和自己聊天'));
|
||
|
}
|
||
|
// 查询是否在线
|
||
|
$online = $this->wanlchat->isOnline($message['to_id']);
|
||
|
// 保存聊天记录到服务器
|
||
|
$data = model('app\api\model\wanlshop\Chat');
|
||
|
$data->form_uid = $message['form']['id'];
|
||
|
$data->to_id = $message['to_id'];
|
||
|
$data->form = json_encode($message['form']);
|
||
|
$data->message = json_encode($message['message']);
|
||
|
$data->type = $message['type'];
|
||
|
$data->online = $online;
|
||
|
$data->save();
|
||
|
$message['id'] = $data->id;
|
||
|
// 在线发送
|
||
|
$online == 1 ? ($this->wanlchat->send($message['to_id'], $message)) : '';
|
||
|
$this->success(__('发送成功'), []);
|
||
|
}
|
||
|
$this->error(__('非法请求'));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 查询IM服务器状态
|
||
|
*
|
||
|
* @ApiSummary (WanlChat 查询用户历史消息)
|
||
|
* @ApiMethod (GET)
|
||
|
*/
|
||
|
public function state()
|
||
|
{
|
||
|
if(!$this->wanlchat->isWsStart()){
|
||
|
$this->error('通讯服务未正常启用直播、登录服务暂停');
|
||
|
}else{
|
||
|
$this->success(__('IM服务器已启动'));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 查询用户聊天记录
|
||
|
*
|
||
|
* @ApiSummary (WanlChat 查询用户历史消息)
|
||
|
* @ApiMethod (POST)
|
||
|
*
|
||
|
* @param string $to_id 接受ID
|
||
|
*/
|
||
|
public function history()
|
||
|
{
|
||
|
//设置过滤方法
|
||
|
$this->request->filter(['strip_tags']);
|
||
|
if($this->request->isPost()){
|
||
|
$id = $this->request->post('to_id');
|
||
|
$id?'':($this->error(__('Invalid parameters')));
|
||
|
$uid = $this->auth->id;
|
||
|
// 查询历史记录
|
||
|
$result = model('app\api\model\wanlshop\Chat')
|
||
|
->where("((form_uid={$uid} and to_id={$id}) or (form_uid={$id} and to_id={$uid})) and type='chat'")
|
||
|
->whereTime('createtime', 'month')
|
||
|
->order('createtime Desc')
|
||
|
->paginate();
|
||
|
$this->success(__('发送成功'), $result);
|
||
|
}
|
||
|
$this->error(__('非法请求'));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 全部已读
|
||
|
*
|
||
|
* @ApiSummary (WanlChat 已读店铺消息)
|
||
|
* @ApiMethod (POST)
|
||
|
*/
|
||
|
public function read()
|
||
|
{
|
||
|
if($this->request->isPost()){
|
||
|
$uid = $this->auth->id;
|
||
|
$data = model('app\api\model\wanlshop\Chat')
|
||
|
->where(['to_id' => $uid, 'isread' => 0, 'type' => 'chat'])
|
||
|
->update(['isread' => 1]);
|
||
|
$this->success(__('更新成功'), []);
|
||
|
}
|
||
|
$this->error(__('非法请求'));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 已读店铺消息
|
||
|
*
|
||
|
* @ApiSummary (WanlChat 已读店铺消息)
|
||
|
* @ApiMethod (POST)
|
||
|
*
|
||
|
* @param string $shop_id 店铺ID
|
||
|
*/
|
||
|
public function clear()
|
||
|
{
|
||
|
//设置过滤方法
|
||
|
$this->request->filter(['strip_tags']);
|
||
|
if($this->request->isPost()){
|
||
|
$id = $this->request->post('id');
|
||
|
$id?'':($this->error(__('Invalid parameters')));
|
||
|
$uid = $this->auth->id;
|
||
|
// 设置成已读
|
||
|
$data = model('app\api\model\wanlshop\Chat')
|
||
|
->where(['form_uid' => $id, 'to_id' => $uid, 'isread' => 0])
|
||
|
->update(['isread' => 1]);
|
||
|
$this->success(__('更新成功'), $data);
|
||
|
}
|
||
|
$this->error(__('非法请求'));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 删除指定聊天记录
|
||
|
*
|
||
|
* @ApiSummary (WanlChat 删除指定聊天记录)
|
||
|
* @ApiMethod (POST)
|
||
|
*
|
||
|
* @param string $shop_id 店铺ID
|
||
|
*/
|
||
|
public function del()
|
||
|
{
|
||
|
//设置过滤方法
|
||
|
$this->request->filter(['strip_tags']);
|
||
|
if($this->request->isPost()){
|
||
|
$id = $this->request->post('id');
|
||
|
$id ? '' : ($this->error(__('Invalid parameters')));
|
||
|
$uid = $this->auth->id;
|
||
|
// 设置成已读
|
||
|
$data = model('app\api\model\wanlshop\Chat')
|
||
|
->where("((form_uid={$uid} and to_id={$id}) or (form_uid={$id} and to_id={$uid})) and type='chat'")
|
||
|
->delete();
|
||
|
$this->success(__('更新成功'), $data);
|
||
|
}
|
||
|
$this->error(__('非法请求'));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 加载欢迎消息 1.0.2升级
|
||
|
*
|
||
|
* @ApiSummary (WanlChat 加载欢迎消息)
|
||
|
* @ApiMethod (POST)
|
||
|
*/
|
||
|
public function hello()
|
||
|
{
|
||
|
//设置过滤方法
|
||
|
$this->request->filter(['strip_tags']);
|
||
|
if($this->request->isPost()){
|
||
|
$post = $this->request->post();
|
||
|
if($post['type'] == 'service'){
|
||
|
$data['id'] = $post['id'] + 1;
|
||
|
$data['type'] = 'service';
|
||
|
$data['form']['id'] = 0;
|
||
|
$data['message']['type'] = 'text'; //默认消息
|
||
|
$data['message']['content']['text'] = $this->chatConfig['config']['auth_reply'];
|
||
|
$data['createtime'] = time();
|
||
|
$this->wanlchat->send($post['form_id'], $data);
|
||
|
}else if($post['type'] == 'shop'){
|
||
|
|
||
|
}
|
||
|
$this->success(__('请求成功'));
|
||
|
}
|
||
|
$this->error(__('非法请求'));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 智能小秘
|
||
|
*
|
||
|
* @ApiSummary (WanlChat 智能小秘)
|
||
|
* @ApiMethod (POST)
|
||
|
*/
|
||
|
public function service()
|
||
|
{
|
||
|
//设置过滤方法
|
||
|
$this->request->filter(['strip_tags']);
|
||
|
if($this->request->isPost()){
|
||
|
$post = $this->request->post();
|
||
|
$form_id = $post['form']['id'];
|
||
|
if($post['message']['type'] == 'text'){
|
||
|
$content = $post['message']['content']['text'];
|
||
|
}
|
||
|
$data['id'] = $post['id'] + 1;
|
||
|
$data['type'] = 'service';
|
||
|
$data['form']['id'] = 0;
|
||
|
$data['message']['type'] = 'text'; //默认消息
|
||
|
$data['createtime'] = time();
|
||
|
if($post['to_id'] == 0){
|
||
|
if($post['message']['type'] == 'text'){
|
||
|
if($content == '人工客服' || $content == '客服' || $content == '人工'){
|
||
|
// 查询 哪个后台在线
|
||
|
$online = [];
|
||
|
$admin = model('app\api\model\wanlshop\Admin')
|
||
|
->field('id,nickname,avatar')
|
||
|
->select();
|
||
|
foreach($admin as $user){
|
||
|
if($this->wanlchat->isOnline(bcadd(8080000,$user['id'])) == 1){
|
||
|
$online[] = $user;
|
||
|
}
|
||
|
}
|
||
|
if(count($online) == 0){
|
||
|
$data['message']['content']['text'] = $this->chatConfig['config']['not_online'];
|
||
|
}else{
|
||
|
$key = mt_rand(0,count($online)-1);
|
||
|
$data['form']['id'] = bcadd(8080000, $online[$key]['id']); // 随机发送一个在线管理员
|
||
|
$data['form']['name'] = $online[$key]['nickname'];
|
||
|
$data['form']['avatar'] = $online[$key]['avatar'];
|
||
|
$data['message']['content']['text'] = $this->chatConfig['config']['service_initial'];
|
||
|
}
|
||
|
$this->wanlchat->send($form_id, $data);
|
||
|
}else{
|
||
|
$list = model('app\api\model\wanlshop\Article')
|
||
|
->where('keywords',$content)
|
||
|
->field('id,title,content')
|
||
|
->find();
|
||
|
if($list){
|
||
|
$data['message']['type'] = 'article';
|
||
|
$data['message']['content'] = $list;
|
||
|
}else{
|
||
|
$arr = explode(' ',$content);
|
||
|
$like = [];
|
||
|
foreach($arr as $value){
|
||
|
$like[] = '%'.$value.'%';
|
||
|
}
|
||
|
$article = model('app\api\model\wanlshop\Article')
|
||
|
->where('title|content','like',$like,'OR')
|
||
|
->field('id,title,keywords')
|
||
|
->select();
|
||
|
$data['message']['type'] = 'list';
|
||
|
$data['message']['content'] = $article;
|
||
|
}
|
||
|
$this->wanlchat->send($form_id, $data);
|
||
|
}
|
||
|
}else{
|
||
|
if($post['message']['type'] == 'img'){
|
||
|
$type = '图片消息';
|
||
|
}
|
||
|
if($post['message']['type'] == 'voice'){
|
||
|
$type = '语音消息';
|
||
|
}
|
||
|
$data['message']['content']['text'] = '[可怜][委屈][委屈],智能小秘暂无法识别“'.$type.'”,您可以与人工客服沟通时可以使用~~';
|
||
|
$this->wanlchat->send($form_id, $data);
|
||
|
}
|
||
|
}else{
|
||
|
$online = 1;
|
||
|
// 保存聊天记录到服务器
|
||
|
$data = model('app\api\model\wanlshop\Chat');
|
||
|
$data->form_uid = $post['form']['id'];
|
||
|
$data->to_id = $post['to_id'];
|
||
|
$data->form = json_encode($post['form']);
|
||
|
$data->message = json_encode($post['message']);
|
||
|
$data->type = $post['type'];
|
||
|
$data->online = $online;
|
||
|
$data->save();
|
||
|
$post['id'] = $data->id;
|
||
|
// 在线发送
|
||
|
$this->wanlchat->send($post['to_id'], $post);
|
||
|
}
|
||
|
$this->success(__('请求成功'));
|
||
|
}
|
||
|
$this->error(__('非法请求'));
|
||
|
}
|
||
|
}
|