优化ctms-api语法、修复已知BUG;

主要修复ctms-api、dacms对PHP新版本的支持问题
This commit is contained in:
2025-07-13 19:37:42 +08:00
parent 65bbd06981
commit 037f274ec5
413 changed files with 107271 additions and 72326 deletions
+565
View File
@@ -0,0 +1,565 @@
<?php
/**
* @Author: fm453
* @Date: 2019-04-27 22:19:28
* @Last Modified by: fm453
* @Last Modified time: 2019-04-30 10:11:22
*/
/**
* 利用workerman制作的推送接口控制器(针对嗨噜应用系统的HOFC嗨骑定向小程序)
*/
namespace frontend\controllers;
use Yii;
use yii\web\Controller;
use dataModel;
//必须添加这一句,以便引入dataModel外部类库
// 引用GateWay Client
require(__DIR__ . '/../../vendor/workerman/GatewayClient-3.0.0/Gateway.php');
// GatewayClient 3.0.0版本开始要使用命名空间
use GatewayClient\Gateway;
// 设置GatewayWorker服务的Register服务ip和端口
Gateway::$registerAddress = '127.0.0.1:4530';
class PushhofcController extends Controller
{
public $enableCsrfValidation = FALSE;//取消对POST数据的csrf令牌验证
/**
* 绑定客户端与指定项
*/
public function actionBind()
{
//常规绑定(绑定到UID,未传入用户详情)
global $_FM;
//数据取出方法
$dataGet = $_FM['get']; //GET进来的参数
$dataPost = $_FM['post']; //POST进来的参数
$data = array();
header('Access-Control-Allow-Origin:*'); //允许任何网站通过ajax发送请求
$group_pre = 'XCX-HOFC-USER';
//前台已经建立起长链接,取得了客户端ID号
$viaDomain = fmFunc_server_via_domain(); //来路域名
$viaIP = fmFunc_server_via_ip(); //来路IP
$timestamp = isset($_FM['timestamp']) ? $_FM['timestamp'] : time();
//通过前端GET传入的
$client_id = isset($dataGet['client_id']) ? $dataGet['client_id'] : '';
if (!$client_id) {
return;
}
//处理POST数据
$client_type = isset($dataPost['client_type']) ? $dataPost['client_type'] : 'undefined';
//根据当前用户身份生成可准确识别的用户ID
$uid = isset($dataPost['uid']) ? $dataPost['uid'] : 0;
if (!$uid) {
$data = array();
$data['type'] = 'toast';
$data['msg'] = '未指定用户';
$data = json_encode($data);
Gateway::sendToClient($client_id, $data);
return;
}
$uid = $group_pre . fmFunc_server_hash_id($uid);
// client_id与uid绑定
Gateway::bindUid($client_id, $uid);
//发送反馈消息
$message = '棒,客户端绑定用户(' . $uid . ')成功!';
$data = array();
$data['type'] = 'bind';
$data['msg'] = $message;
$data = json_encode($data);
Gateway::sendToClient($client_id, $data);
return;
}
public function actionBinduser()
{
//绑定用户及详情、APPID,同时向数据关联组发送用户信息
global $_FM;
//数据取出方法
$dataGet = $_FM['get']; //GET进来的参数
$dataPost = $_FM['post']; //POST进来的参数
$data = array();
header('Access-Control-Allow-Origin:*'); //允许任何网站通过ajax发送请求
$group_pre = 'XCX-HOFC';
//绑定到当前用户组,供服务侧同步绑定校验
$timestamp = isset($_FM['timestamp']) ? $_FM['timestamp'] : time();
//通过前端GET传入的
$client_id = isset($dataGet['client_id']) ? $dataGet['client_id'] : '';
if (!$client_id) {
return;
}
$viaDomain = fmFunc_server_via_domain(); //来路域名
$viaIP = fmFunc_server_via_ip();
//处理POST数据
$client_type = isset($dataPost['client_type']) ? $dataPost['client_type'] : 'undefined';
//根据当前用户身份生成可准确识别的用户ID
$uid = isset($dataPost['uid']) ? $dataPost['uid'] : 0;
if (!$uid) {
$data = array();
$data['type'] = 'toast';
$data['msg'] = '未指定用户';
$data = json_encode($data);
Gateway::sendToClient($client_id, $data);
return;
}
$uid = $group_pre . '-USER-' . fmFunc_server_hash_id($uid);
// client_id与uid绑定
Gateway::bindUid($client_id, $uid);
//发送反馈消息
$message = '棒,客户端绑定用户(' . $uid . ')成功!';
$data = array();
$data['type'] = 'bind';
$data['msg'] = $message;
$data = json_encode($data);
Gateway::sendToClient($client_id, $data);
$group_ids = array();
$group_id = '';
//绑定小程序ID
$appid = isset($dataPost['appid']) ? $dataPost['appid'] : 0;
if (!$appid) {
$data = array();
$data['type'] = 'toast';
$data['msg'] = '未指定小程序';
$data = json_encode($data);
Gateway::sendToClient($client_id, $data);
} else {
$group_id = 'wxapp_' . $appid;
$group_ids[$group_id] = $group_pre . fmFunc_server_hash_id($group_id);
// 加入某个群组(可调用多次加入多个群组)
Gateway::joinGroup($client_id, $group_ids[$group_id]); //奖用户加入指定会员组
//发送反馈消息
$message = '棒,客户端绑定小程序(' . $appid . ')成功!';
$data = array();
$data['type'] = 'bind';
$data['msg'] = $message;
$data = json_encode($data);
Gateway::sendToClient($client_id, $data);
}
//向数据展板推送用户信息
$user = isset($dataPost['user']) ? $dataPost['user'] : [];
$time = time();
//构造反馈消息
$data = array();
$data['type'] = 'content'; //消息反馈类型:alert,confirm,toast,content,reg
if (isset($dataPost['new']) && $dataPost['new'] == 1) {
$data['type'] = 'reg';
}
$data['msg'] = '由[' . $viaIP . ']进入了寻宝应用(' . date('H:i') . ')';
$data['status'] = 1; //消息状态
$data['avatar'] = isset($user['face']) ? $user['face'] : '';
$data['username'] = $user['nick_name']; //昵称
$data['title'] = '系统提示'; //消息标题
$data['mid'] = isset($user['user_id']) ? $user['user_id'] : -1; //消息来源会员, -1为公众号本身
$data['id'] = md5($time . '_' . $user['user_id']);
$data['ctype'] = 0; //消息内容类型(-1,系统消息;-2表情;-3快捷表态;-4 红包;0,默认,文本消息;1图片;3音频; 4视频;)
$data['createtime'] = $time;
$data = json_encode($data);
//推送数据
Gateway::sendToGroup($group_ids[$group_id], $data);
return;
}
public function actionBindgroup()
{
//绑定用户组
global $_FM;
//数据取出方法
$dataGet = $_FM['get']; //GET进来的参数
$dataPost = $_FM['post']; //POST进来的参数
$data = array();
header('Access-Control-Allow-Origin:*'); //允许任何网站通过ajax发送请求
$group_pre = 'XCX-HOFC';
//绑定到当前用户组,供服务侧同步绑定校验
$timestamp = isset($_FM['timestamp']) ? $_FM['timestamp'] : time();
//通过前端GET传入的
$client_id = isset($dataGet['client_id']) ? $dataGet['client_id'] : '';
if (!$client_id) {
return;
}
//处理POST数据
$client_type = isset($dataPost['client_type']) ? $dataPost['client_type'] : 'undefined';
$group_ids = array();
$group_id = isset($dataPost['groupid']) ? $dataPost['groupid'] : 0;
if ($group_id) {
$group_ids[0] = $group_pre . fmFunc_server_hash_id(0);;
// 加入某个群组(可调用多次加入多个群组)
Gateway::joinGroup($client_id, $group_ids[0]); //将用户加入0会员组
}
$group_ids[$group_id] = $group_pre . fmFunc_server_hash_id($group_id);
// 加入某个群组(可调用多次加入多个群组)
Gateway::joinGroup($client_id, $group_ids[$group_id]); //奖用户加入指定会员组
//发送反馈消息
$message = '棒,客户端绑定用户组成功!';
$data = array();
$data['type'] = 'bind';
$data['msg'] = $message;
$data['groupids'] = $group_ids;
$data = json_encode($data);
Gateway::sendToClient($client_id, $data);
return;
}
public function actionBindteam()
{
//绑定团队ID,方便同步接收
global $_FM;
//数据取出方法
$dataGet = $_FM['get']; //GET进来的参数
$dataPost = $_FM['post']; //POST进来的参数
$data = array();
header('Access-Control-Allow-Origin:*'); //允许任何网站通过ajax发送请求
$group_pre = 'XCX-HOFC';
$timestamp = isset($_FM['timestamp']) ? $_FM['timestamp'] : time();
//通过前端GET传入的
$client_id = isset($dataGet['client_id']) ? $dataGet['client_id'] : '';
if (!$client_id) {
return;
}
//处理POST数据
$client_type = isset($dataPost['client_type']) ? $dataPost['client_type'] : 'undefined';
$group_ids = array();
$teamid = isset($dataPost['teamid']) ? $dataPost['teamid'] : 0;
if (!$teamid) {
$data = array();
$data['type'] = 'toast';
$data['msg'] = '未指定队伍';
$data = json_encode($data);
Gateway::sendToClient($client_id, $data);
return;
}
$group_id = 'team_' . $teamid;
$group_ids[$group_id] = $group_pre . fmFunc_server_hash_id($group_id);
// 加入某个群组(可调用多次加入多个群组)
Gateway::joinGroup($client_id, $group_ids[$group_id]); //奖用户加入指定会员组
//发送反馈消息
$message = '棒,客户端绑定队伍(' . $teamid . ')成功!';
$data = array();
$data['type'] = 'bind';
$data['msg'] = $message;
$data = json_encode($data);
Gateway::sendToClient($client_id, $data);
return;
}
public function actionBindwxapp()
{
//绑定小程序ID
global $_FM;
//数据取出方法
$dataGet = $_FM['get']; //GET进来的参数
$dataPost = $_FM['post']; //POST进来的参数
$data = array();
header('Access-Control-Allow-Origin:*'); //允许任何网站通过ajax发送请求
$group_pre = 'XCX-HOFC';
$timestamp = isset($_FM['timestamp']) ? $_FM['timestamp'] : time();
//通过前端GET传入的
$client_id = isset($dataGet['client_id']) ? $dataGet['client_id'] : '';
if (!$client_id) {
return;
}
//处理POST数据
$client_type = isset($dataPost['client_type']) ? $dataPost['client_type'] : 'undefined';
$group_ids = array();
$appid = isset($dataPost['appid']) ? $dataPost['appid'] : 0;
if (!$appid) {
$data = array();
$data['type'] = 'toast';
$data['msg'] = '未指定小程序';
$data = json_encode($data);
Gateway::sendToClient($client_id, $data);
return;
}
$group_id = 'wxapp_' . $appid;
$group_ids[$group_id] = $group_pre . fmFunc_server_hash_id($group_id);
// 加入某个群组(可调用多次加入多个群组)
Gateway::joinGroup($client_id, $group_ids[$group_id]); //奖用户加入指定会员组
//发送反馈消息
$message = '棒,客户端绑定小程序(' . $appid . ')成功!';
$data = array();
$data['type'] = 'bind';
$data['msg'] = $message;
$data = json_encode($data);
Gateway::sendToClient($client_id, $data);
return;
}
/**
* 接收客户端数据
*/
public function actionIn()
{
$group_pre = 'XCX-HOFC';
header('Access-Control-Allow-Origin:*'); //允许指定网站通过ajax发送请求
// 建立socket连接到内部推送端口
$client = stream_socket_client('tcp://127.0.0.1:4530');
//如果用户已经登陆,uid和群组id存在
//TBD 构建uid、group_id的生成方式
$uid = isset($dataPost['uid']) ? $dataPost['uid'] : 0;
$group_id = isset($dataPost['group']) ? $dataPost['group'] : 0;
//$client_id 通过前端传入
$client_id = isset($dataGet['client_id']) ? $dataGet['client_id'] : 0;
// 推送的数据,包含uid字段,表示是给这个uid推送
$uid = isset(Yii::$app->user->identity->username) ? Yii::$app->user->identity->username : '0';
$data = array('uid' => $uid, 'msg' => urlencode('嗯,这个是测试用的'));
// 发送数据,注意该端口是Text协议的端口,Text协议需要在数据末尾加上换行符
fwrite($client, json_encode($data) . "\n");
// 读取推送结果
// echo '$client=='.$client;
//echo fread($client, 8192);
}
/**
* 向客户端推送消息
*/
public function actionOut()
{
global $_FM;
//数据取出方法
$dataGet = $_FM['get']; //GET进来的参数
$dataPost = $_FM['post']; //POST进来的参数
$params = Yii::$app->params;
header('Access-Control-Allow-Origin:*'); //允许指定网站通过ajax发送请求
require dirname(__FILE__) . '/_public/plat.php';
$group_pre = 'XCX-HOFC';
/*设置REDIS缓存*/
//初始化$cache = new \Redis();
$cache = new \Redis();
$cache->connect($params['redis']['IP'], $params['redis']['PORT']);
// 先检查是否存在,然后写入并设置有效时间
$key = 'FmWebSorcketCount';
$CACHE_PREFIX = 'DACMS';
$count = 0;
if ($cache->exists($CACHE_PREFIX . $key)) {
// 读取
$count = $cache->get($CACHE_PREFIX . $key);
//清除
$cache->delete($CACHE_PREFIX . $key);
}
$cache->set($CACHE_PREFIX . $key, $count + 1);
$expire = time() + 604800; //一周时间再过期
$cache->expire($CACHE_PREFIX . $key, $expire);
//前台已经建立起长链接,取得了客户端ID号;需要绑定到当前用户,并返回用户uid,供服务侧同步绑定校验
$viaDomain = fmFunc_server_via_domain(); //来路域名
$viaIP = fmFunc_server_via_ip(); //来路IP
$timestamp = isset($_FM['timestamp']) ? $_FM['timestamp'] : time();
//通过前端GET传入的
$client_id = isset($dataGet['client_id']) ? $dataGet['client_id'] : '7f000001b0f400000010';
//处理POST数据
$client_type = isset($dataPost['client_type']) ? $dataPost['client_type'] : '';
$msg_type = isset($dataPost['msg_type']) ? $dataPost['msg_type'] : '';
if (!$msg_type) {
$msg_type = isset($dataGet['msg_type']) ? $dataGet['msg_type'] : '';
}
$msg = isset($dataPost['msg']) ? $dataPost['msg'] : '';
if (!$msg) {
$msg = isset($dataGet['msg']) ? $dataGet['msg'] : '';
}
//构造反馈消息
$data = array();
$data['type'] = $msg_type;
$data['msg'] = $msg;
if (isset($dataGet['debug'])) {
//向全体推送数据
$data['msg'] = empty($data['msg']) ? '第' . $count . '次测试群发' : $data['msg'];
$count++;
$data = json_encode($data);
Gateway::sendToAll($data);
return;
}
$data = json_encode($data);
//根据情况发送消息
switch ($hasToken) {
case TRUE:
//根据当前用户身份生成可准确识别的用户ID
$uid = isset($dataPost['uid']) ? $dataPost['uid'] : '';
if ($uid) {
$uid = fmFunc_server_hash_id($uid);
Gateway::sendToUid($uid, $data);
}
//有证书时,可继续下一步的推送
if (!$hasCert) {
break; //无证书,不再继续
}
//已指派分组时
$group_id = isset($dataPost['group']) ? $dataPost['group'] : 0;
if ($groud_id) {
$group_id = $group_pre . fmFunc_server_hash_id($group_id);
Gateway::sendToGroup($group_id, $data);
break; //执行后结束此次推送
}
if ($client_type) {
$group_id = $type;
$group_id = $group_pre . fmFunc_server_hash_id($group_id);
Gateway::sendToGroup($group_id, $data);
}
break;
case FALSE;
//只发送给指定客户端
Gateway::sendToClient($client_id, $data);
break;
}
}
/**
* 接收客户端数据并向全部客户端群发
*/
public function actionSend2all()
{
header('Access-Control-Allow-Origin:*'); //允许指定网站通过ajax发送请求
global $_FM;
global $_HI;
//数据取出方法
$dataGet = $_FM['get']; //GET进来的参数
$dataPost = $_FM['post']; //POST进来的参数
$params = Yii::$app->params;
$group_pre = 'XCX-HOFC';
/*设置REDIS缓存*/
//初始化$cache = new \Redis();
$cache = new \Redis();
$cache->connect($params['redis']['IP'], $params['redis']['PORT']);
// 先检查是否存在,然后写入并设置有效时间
$key = 'FmWebSorcketCount';
$CACHE_PREFIX = 'DACMS';
$count = 0;
if ($cache->exists($CACHE_PREFIX . $key)) {
// 读取
$count = $cache->get($CACHE_PREFIX . $key);
//清除
$cache->delete($CACHE_PREFIX . $key);
}
$cache->set($CACHE_PREFIX . $key, $count + 1);
$expire = time() + 604800; //一周时间再过期
$cache->expire($CACHE_PREFIX . $key, $expire);
//前台已经建立起长链接,取得了客户端ID号;需要绑定到当前用户,并返回用户uid,供服务侧同步绑定校验
$viaDomain = fmFunc_server_via_domain(); //来路域名
$viaIP = fmFunc_server_via_ip(); //来路IP
$timestamp = isset($_FM['timestamp']) ? $_FM['timestamp'] : time();
//通过前端GET传入的
$client_id = isset($dataGet['client_id']) ? $dataGet['client_id'] : ' ';
if (!$client_id) {
return;
}
//处理POST数据
$msg_type = isset($dataPost['msg_type']) ? $dataPost['msg_type'] : '';
if (!$msg_type) {
$msg_type = isset($dataGet['msg_type']) ? $dataGet['msg_type'] : '';
}
$msg = isset($dataPost['msg']) ? $dataPost['msg'] : '';
if (!$msg) {
$msg = isset($dataGet['msg']) ? $dataGet['msg'] : '';
}
//构造反馈消息
$data = array();
$data['type'] = $msg_type; //消息反馈类型:alert,confirm,toast,content
$data['msg'] = $msg;
$data['status'] = 1; //消息状态
$data['avatar'] = isset($dataPost['avatar']) ? $dataPost['avatar'] : '';
$data['username'] = '管理员'; //昵称
$data['title'] = '系统提示'; //消息标题
$data['mid'] = isset($dataPost['mid']) ? $dataPost['mid'] : 1; //消息来源会员, -1为公众号本身
$time = time();
$data['id'] = isset($dataPost['id']) ? $dataPost['id'] : md5($time . '_' . $data['mid']);
$data['ctype'] = isset($dataPost['type']) ? $dataPost['type'] : 0; //消息内容类型(-1,系统消息;-2表情;-3快捷表态;-4 红包;0,默认,文本消息;1图片;3音频; 4视频;)
$data['createtime'] = $time;
if (isset($dataGet['debug'])) {
//向全体推送数据
$data['msg'] = empty($data['msg']) ? '第' . $count . '次测试群发' : $data['msg'];
$count++;
$data = json_encode($data);
Gateway::sendToAll($data);
return;
}
$data = json_encode($data);
//向全体推送数据
//设定群发群组
$appid = isset($dataPost['appid']) ? $dataPost['appid'] : 0;
$group_id = 'wxapp_' . $appid;
$group_ids[$group_id] = $group_pre . fmFunc_server_hash_id($group_id);
$count++;
Gateway::sendToGroup($group_ids[$group_id], $data);
//构造反馈消息
$data = array();
$data['type'] = 'toast';
$data['msg'] = '消息已发送';
$data = json_encode($data);
//发送给指定客户端
Gateway::sendToClient($client_id, $data);
return;
}
}