ctms/dacms-api/controllers/PushhofcController.php
2025-04-10 23:19:13 +08:00

562 lines
18 KiB
PHP
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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;
}
}