api接口提交
This commit is contained in:
@@ -8,93 +8,98 @@ Route::group('v1', function () {
|
||||
Route::group('api', function () {
|
||||
// Account控制器路由
|
||||
Route::group('account', function () {
|
||||
Route::get('list', 'app\\api\\controller\\AccountController@getList'); // 获取账号列表 √
|
||||
Route::post('create', 'app\\api\\controller\\AccountController@createAccount'); // 创建账号 √
|
||||
Route::post('createNewAccount', 'app\\api\\controller\\AccountController@createNewAccount'); // 创建新账号(包含创建部门) √
|
||||
Route::post('department/create', 'app\\api\\controller\\AccountController@createDepartment'); // 创建部门 √
|
||||
Route::get('department/list', 'app\\api\\controller\\AccountController@getDepartmentList'); // 获取部门列表 √
|
||||
Route::post('department/update', 'app\\api\\controller\\AccountController@updateDepartment'); // 更新部门 √
|
||||
Route::post('department/delete', 'app\\api\\controller\\AccountController@deleteDepartment'); // 删除部门 √
|
||||
Route::post('department/setPrivileges', 'app\\api\\controller\\AccountController@setPrivileges'); // 设置部门权限 √
|
||||
Route::get('list', 'app\api\controller\AccountController@getList'); // 获取账号列表 √
|
||||
Route::post('create', 'app\api\controller\AccountController@createAccount'); // 创建账号 √
|
||||
Route::post('createNewAccount', 'app\api\controller\AccountController@createNewAccount'); // 创建新账号(包含创建部门) √
|
||||
Route::post('department/create', 'app\api\controller\AccountController@createDepartment'); // 创建部门 √
|
||||
Route::get('department/list', 'app\api\controller\AccountController@getDepartmentList'); // 获取部门列表 √
|
||||
Route::post('department/update', 'app\api\controller\AccountController@updateDepartment'); // 更新部门 √
|
||||
Route::post('department/delete', 'app\api\controller\AccountController@deleteDepartment'); // 删除部门 √
|
||||
Route::post('department/setPrivileges', 'app\api\controller\AccountController@setPrivileges'); // 设置部门权限 √
|
||||
});
|
||||
|
||||
// Device控制器路由
|
||||
Route::group('device', function () {
|
||||
Route::get('list', 'app\\api\\controller\\DeviceController@getList'); // 获取设备列表 √
|
||||
Route::post('add', 'app\\api\\controller\\DeviceController@addDevice'); // 生成设备二维码(POST方式) √
|
||||
Route::post('updateDeviceGroup', 'app\\api\\controller\\DeviceController@updateDeviceGroup'); // 更新设备分组 √
|
||||
Route::post('updateaccount', 'app\\api\\controller\\DeviceController@updateaccount'); // 更新设备账号 √
|
||||
Route::post('createGroup', 'app\\api\\controller\\DeviceController@createGroup'); // 创建设备分组 √
|
||||
Route::get('groupList', 'app\\api\\controller\\DeviceController@getGroupList'); // 获取设备分组列表 √
|
||||
Route::post('updateDeviceToGroup', 'app\\api\\controller\\DeviceController@updateDeviceToGroup'); // 更新设备的分组 √
|
||||
Route::get('list', 'app\api\controller\DeviceController@getList'); // 获取设备列表 √
|
||||
Route::post('add', 'app\api\controller\DeviceController@addDevice'); // 生成设备二维码(POST方式) √
|
||||
Route::post('updateDeviceGroup', 'app\api\controller\DeviceController@updateDeviceGroup'); // 更新设备分组 √
|
||||
Route::post('updateaccount', 'app\api\controller\DeviceController@updateaccount'); // 更新设备账号 √
|
||||
Route::post('createGroup', 'app\api\controller\DeviceController@createGroup'); // 创建设备分组 √
|
||||
Route::get('groupList', 'app\api\controller\DeviceController@getGroupList'); // 获取设备分组列表 √
|
||||
Route::post('updateDeviceToGroup', 'app\api\controller\DeviceController@updateDeviceToGroup'); // 更新设备的分组 √
|
||||
});
|
||||
|
||||
// FriendTask控制器路由
|
||||
Route::group('friend-task', function () {
|
||||
Route::get('list', 'app\\api\\controller\\FriendTaskController@getList'); // 获取添加好友记录列表 √
|
||||
Route::post('add', 'app\\api\\controller\\FriendTaskController@addFriendTask'); // 添加好友任务 √
|
||||
Route::get('list', 'app\api\controller\FriendTaskController@getList'); // 获取添加好友记录列表 √
|
||||
Route::post('add', 'app\api\controller\FriendTaskController@addFriendTask'); // 添加好友任务 √
|
||||
});
|
||||
|
||||
// Moments控制器路由
|
||||
Route::group('moments', function () {
|
||||
Route::post('add-job', 'app\\api\\controller\\MomentsController@addJob'); // 发布朋友圈
|
||||
Route::get('list', 'app\\api\\controller\\MomentsController@getList'); // 获取朋友圈任务列表 √
|
||||
Route::post('add-job', 'app\api\controller\MomentsController@addJob'); // 发布朋友圈
|
||||
Route::get('list', 'app\api\controller\MomentsController@getList'); // 获取朋友圈任务列表 √
|
||||
});
|
||||
|
||||
// Stats控制器路由
|
||||
Route::group('stats', function () {
|
||||
Route::get('basic-data', 'app\\api\\controller\\StatsController@basicData'); // 账号基本信息
|
||||
Route::get('fans-statistics', 'app\\api\\controller\\StatsController@FansStatistics'); // 好友统计
|
||||
Route::get('basic-data', 'app\api\controller\StatsController@basicData'); // 账号基本信息
|
||||
Route::get('fans-statistics', 'app\api\controller\StatsController@FansStatistics'); // 好友统计
|
||||
});
|
||||
|
||||
// User控制器路由
|
||||
Route::group('user', function () {
|
||||
Route::post('login', 'app\\api\\controller\\UserController@login'); // 登录 √
|
||||
Route::post('token', 'app\\api\\controller\\UserController@getNewToken'); // 获取新的token √
|
||||
Route::get('info', 'app\\api\\controller\\UserController@getAccountInfo'); // 获取商户基本信息 √
|
||||
Route::post('modify-pwd', 'app\\api\\controller\\UserController@modifyPwd'); // 修改密码
|
||||
Route::get('logout', 'app\\api\\controller\\UserController@logout'); // 登出 √
|
||||
Route::get('verify-code', 'app\\api\\controller\\UserController@getVerifyCode'); // 获取验证码 √
|
||||
Route::post('login', 'app\api\controller\UserController@login'); // 登录 √
|
||||
Route::post('token', 'app\api\controller\UserController@getNewToken'); // 获取新的token √
|
||||
Route::get('info', 'app\api\controller\UserController@getAccountInfo'); // 获取商户基本信息 √
|
||||
Route::post('modify-pwd', 'app\api\controller\UserController@modifyPwd'); // 修改密码
|
||||
Route::get('logout', 'app\api\controller\UserController@logout'); // 登出 √
|
||||
Route::get('verify-code', 'app\api\controller\UserController@getVerifyCode'); // 获取验证码 √
|
||||
});
|
||||
|
||||
// WebSocket控制器路由
|
||||
Route::group('websocket', function () {
|
||||
Route::post('send-personal', 'app\\api\\controller\\WebSocketController@sendPersonal'); // 个人消息发送 √
|
||||
Route::post('send-community', 'app\\api\\controller\\WebSocketController@sendCommunity'); // 发送群消息 √
|
||||
Route::get('get-moments', 'app\\api\\controller\\WebSocketController@getMoments'); // 获取指定账号朋友圈信息 √
|
||||
Route::get('get-moment-source', 'app\\api\\controller\\WebSocketController@getMomentSourceRealUrl'); // 获取指定账号朋友圈图片地址
|
||||
Route::post('send-personal', 'app\api\controller\WebSocketController@sendPersonal'); // 个人消息发送 √
|
||||
Route::post('send-community', 'app\api\controller\WebSocketController@sendCommunity'); // 发送群消息 √
|
||||
Route::get('get-moments', 'app\api\controller\WebSocketController@getMoments'); // 获取指定账号朋友圈信息 √
|
||||
Route::get('get-moment-source', 'app\api\controller\WebSocketController@getMomentSourceRealUrl'); // 获取指定账号朋友圈图片地址
|
||||
});
|
||||
|
||||
// WechatChatroom控制器路由
|
||||
Route::group('chatroom', function () {
|
||||
Route::get('list', 'app\\api\\controller\\WechatChatroomController@getList'); // 获取微信群聊列表 √
|
||||
Route::get('members', 'app\\api\\controller\\WechatChatroomController@listChatroomMember'); // 获取群成员列表 √
|
||||
// Route::get('sync', 'app\\api\\controller\\WechatChatroomController@syncChatrooms'); // 同步微信群聊数据 √
|
||||
Route::get('list', 'app\api\controller\WechatChatroomController@getList'); // 获取微信群聊列表 √
|
||||
Route::get('members', 'app\api\controller\WechatChatroomController@listChatroomMember'); // 获取群成员列表 √
|
||||
// Route::get('sync', 'app\api\controller\WechatChatroomController@syncChatrooms'); // 同步微信群聊数据 √
|
||||
});
|
||||
|
||||
// Wechat控制器路由
|
||||
Route::group('wechat', function () {
|
||||
Route::get('list', 'app\\api\\controller\\WechatController@getList'); // 获取微信账号列表 √
|
||||
Route::get('list', 'app\api\controller\WechatController@getList'); // 获取微信账号列表 √
|
||||
});
|
||||
|
||||
// WechatFriend控制器路由
|
||||
Route::group('friend', function () {
|
||||
Route::get('list', 'app\\api\\controller\\WechatFriendController@getList'); // 获取微信好友列表数据 √
|
||||
Route::get('list', 'app\api\controller\WechatFriendController@getList'); // 获取微信好友列表数据 √
|
||||
});
|
||||
|
||||
// Message控制器路由
|
||||
Route::group('message', function () {
|
||||
Route::get('getFriendsList', 'app\\api\\controller\\MessageController@getFriendsList'); // 获取微信好友列表 √
|
||||
Route::get('getChatroomList', 'app\\api\\controller\\MessageController@getChatroomList'); // 同步群聊消息 √
|
||||
Route::get('getFriendsList', 'app\api\controller\MessageController@getFriendsList'); // 获取微信好友列表 √
|
||||
Route::get('getChatroomList', 'app\api\controller\MessageController@getChatroomList'); // 同步群聊消息 √
|
||||
});
|
||||
|
||||
// AllotRule控制器路由
|
||||
Route::group('allot-rule', function () {
|
||||
Route::get('list', 'app\\api\\controller\\AllotRuleController@getAllRules'); // 获取所有分配规则 √
|
||||
Route::post('create', 'app\\api\\controller\\AllotRuleController@createRule');// 创建分配规则 √
|
||||
Route::post('edit', 'app\\api\\controller\\AllotRuleController@updateRule');// 编辑分配规则 √
|
||||
Route::delete('del', 'app\\api\\controller\\AllotRuleController@deleteRule');// 删除分配规则 √
|
||||
Route::get('autoCreate', 'app\\api\\controller\\AllotRuleController@autoCreateAllotRules');// 自动创建分配规则 √
|
||||
Route::get('list', 'app\api\controller\AllotRuleController@getAllRules'); // 获取所有分配规则 √
|
||||
Route::post('create', 'app\api\controller\AllotRuleController@createRule');// 创建分配规则 √
|
||||
Route::post('edit', 'app\api\controller\AllotRuleController@updateRule');// 编辑分配规则 √
|
||||
Route::delete('del', 'app\api\controller\AllotRuleController@deleteRule');// 删除分配规则 √
|
||||
Route::get('autoCreate', 'app\api\controller\AllotRuleController@autoCreateAllotRules');// 自动创建分配规则 √
|
||||
});
|
||||
|
||||
Route::group('scenarios', function () {
|
||||
Route::any('', 'app\cunkebao\controller\plan\PostExternalApiV1Controller@index');
|
||||
});
|
||||
|
||||
});
|
||||
});
|
||||
@@ -11,6 +11,86 @@ use think\Db;
|
||||
*/
|
||||
class GetAddFriendPlanDetailV1Controller extends Controller
|
||||
{
|
||||
/**
|
||||
* 生成签名
|
||||
*
|
||||
* @param array $params 参数数组
|
||||
* @param string $apiKey API密钥
|
||||
* @return string
|
||||
*/
|
||||
private function generateSignature($params, $apiKey)
|
||||
{
|
||||
// 1. 移除sign和apiKey
|
||||
unset($params['sign'], $params['apiKey']);
|
||||
|
||||
// 2. 移除空值
|
||||
$params = array_filter($params, function($value) {
|
||||
return !is_null($value) && $value !== '';
|
||||
});
|
||||
|
||||
// 3. 参数按键名升序排序
|
||||
ksort($params);
|
||||
|
||||
// 4. 直接拼接参数值
|
||||
$stringToSign = implode('', array_values($params));
|
||||
|
||||
// 5. 第一次MD5加密
|
||||
$firstMd5 = md5($stringToSign);
|
||||
|
||||
// 6. 拼接apiKey并第二次MD5加密
|
||||
return md5($firstMd5 . $apiKey);
|
||||
}
|
||||
|
||||
/**
|
||||
* 生成测试URL
|
||||
*
|
||||
* @param string $apiKey API密钥
|
||||
* @return array
|
||||
*/
|
||||
public function testUrl($apiKey)
|
||||
{
|
||||
try {
|
||||
if (empty($apiKey)) {
|
||||
return [];
|
||||
}
|
||||
|
||||
// 构建测试参数
|
||||
$testParams = [
|
||||
'name' => '测试客户',
|
||||
'phone' => '18888888888',
|
||||
'apiKey' => $apiKey,
|
||||
'timestamp' => time()
|
||||
];
|
||||
|
||||
// 生成签名
|
||||
$sign = $this->generateSignature($testParams, $apiKey);
|
||||
$testParams['sign'] = $sign;
|
||||
|
||||
// 构建签名过程说明
|
||||
$signParams = $testParams;
|
||||
unset($signParams['sign'], $signParams['apiKey']);
|
||||
ksort($signParams);
|
||||
$signStr = implode('', array_values($signParams));
|
||||
|
||||
// 构建完整URL参数,不对中文进行编码
|
||||
$urlParams = [];
|
||||
foreach ($testParams as $key => $value) {
|
||||
$urlParams[] = $key . '=' . $value;
|
||||
}
|
||||
$fullUrl = implode('&', $urlParams);
|
||||
|
||||
return [
|
||||
'apiKey' => $apiKey,
|
||||
'originalString' => $signStr,
|
||||
'sign' => $sign,
|
||||
'fullUrl' => $fullUrl
|
||||
];
|
||||
|
||||
} catch (\Exception $e) {
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取计划详情
|
||||
*
|
||||
@@ -37,11 +117,14 @@ class GetAddFriendPlanDetailV1Controller extends Controller
|
||||
// 解析JSON字段
|
||||
$sceneConf = json_decode($plan['sceneConf'], true) ?: [];
|
||||
$reqConf = json_decode($plan['reqConf'], true) ?: [];
|
||||
$msgConf= json_decode($plan['msgConf'], true) ?: [];
|
||||
$msgConf = json_decode($plan['msgConf'], true) ?: [];
|
||||
$tagConf = json_decode($plan['tagConf'], true) ?: [];
|
||||
|
||||
// 合并数据
|
||||
$newData['messagePlans'] = $msgConf;
|
||||
$newData = array_merge($newData,$sceneConf,$reqConf,$tagConf,$plan);
|
||||
$newData = array_merge($newData, $sceneConf, $reqConf, $tagConf, $plan);
|
||||
|
||||
// 移除不需要的字段
|
||||
unset(
|
||||
$newData['sceneConf'],
|
||||
$newData['reqConf'],
|
||||
@@ -50,10 +133,11 @@ class GetAddFriendPlanDetailV1Controller extends Controller
|
||||
$newData['userInfo'],
|
||||
$newData['createTime'],
|
||||
$newData['updateTime'],
|
||||
$newData['deleteTime'],
|
||||
$newData['deleteTime']
|
||||
);
|
||||
|
||||
|
||||
|
||||
// 生成测试URL
|
||||
$newData['textUrl'] = $this->testUrl($newData['apiKey']);
|
||||
|
||||
return ResponseHelper::success($newData, '获取计划详情成功');
|
||||
|
||||
|
||||
@@ -0,0 +1,125 @@
|
||||
<?php
|
||||
|
||||
namespace app\cunkebao\controller\plan;
|
||||
|
||||
use library\ResponseHelper;
|
||||
use think\Controller;
|
||||
use think\Db;
|
||||
|
||||
/**
|
||||
* 对外API接口控制器
|
||||
*/
|
||||
class PostExternalApiV1Controller extends Controller
|
||||
{
|
||||
/**
|
||||
* 验证签名
|
||||
*
|
||||
* @param array $params 请求参数
|
||||
* @param string $apiKey API密钥
|
||||
* @param string $sign 签名
|
||||
* @return bool
|
||||
*/
|
||||
private function validateSign($params, $apiKey, $sign)
|
||||
{
|
||||
// 1. 从参数中移除sign和apiKey
|
||||
unset($params['sign'], $params['apiKey']);
|
||||
|
||||
// 2. 移除空值
|
||||
$params = array_filter($params, function($value) {
|
||||
return !is_null($value) && $value !== '';
|
||||
});
|
||||
|
||||
// 3. 参数按键名升序排序
|
||||
ksort($params);
|
||||
|
||||
// 4. 直接拼接参数值
|
||||
$stringToSign = implode('', array_values($params));
|
||||
|
||||
// 5. 第一次MD5加密
|
||||
$firstMd5 = md5($stringToSign);
|
||||
|
||||
// 6. 拼接apiKey并第二次MD5加密
|
||||
$expectedSign = md5($firstMd5 . $apiKey);
|
||||
|
||||
// 7. 比对签名
|
||||
return $expectedSign === $sign;
|
||||
}
|
||||
|
||||
/**
|
||||
* 对外API接口入口
|
||||
*
|
||||
* @return \think\response\Json
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
try {
|
||||
$params = $this->request->param();
|
||||
|
||||
// 验证必填参数
|
||||
if (empty($params['apiKey'])) {
|
||||
return ResponseHelper::error('apiKey不能为空', 400);
|
||||
}
|
||||
|
||||
if (empty($params['sign'])) {
|
||||
return ResponseHelper::error('sign不能为空', 400);
|
||||
}
|
||||
|
||||
if (empty($params['timestamp'])) {
|
||||
return ResponseHelper::error('timestamp不能为空', 400);
|
||||
}
|
||||
|
||||
// 验证时间戳(允许5分钟误差)
|
||||
if (abs(time() - intval($params['timestamp'])) > 300) {
|
||||
return ResponseHelper::error('请求已过期', 400);
|
||||
}
|
||||
|
||||
// 查询API密钥是否存在
|
||||
$plan = Db::name('customer_acquisition_task')
|
||||
->where('apiKey', $params['apiKey'])
|
||||
->where('status', 1)
|
||||
->find();
|
||||
|
||||
if (!$plan) {
|
||||
return ResponseHelper::error('无效的apiKey', 401);
|
||||
}
|
||||
|
||||
// 验证签名
|
||||
if (!$this->validateSign($params,$params['apiKey'], $params['sign'])) {
|
||||
return ResponseHelper::error('签名验证失败', 401);
|
||||
}
|
||||
|
||||
$identifier = !empty($params['wechatId']) ? $params['wechatId'] : $params['phone'];
|
||||
|
||||
|
||||
$trafficPool = Db::name('traffic_pool')->where('identifier', $identifier)->find();
|
||||
if (!$trafficPool) {
|
||||
Db::name('traffic_pool')->insert([
|
||||
'identifier' => $identifier,
|
||||
'mobile' => $params['phone']
|
||||
]);
|
||||
}
|
||||
|
||||
$taskCustomer = Db::name('task_customer')->where('task_id', $plan['id'])->where('phone', $identifier)->find();
|
||||
if (!$taskCustomer) {
|
||||
Db::name('task_customer')->insert([
|
||||
'task_id' => $plan['id'],
|
||||
'phone' => $identifier
|
||||
]);
|
||||
|
||||
return json([
|
||||
'code' => 200,
|
||||
'message' => '新增成功',
|
||||
'data' => $identifier
|
||||
]);
|
||||
}else{
|
||||
return json([
|
||||
'code' => 200,
|
||||
'message' => '已存在',
|
||||
'data' => $identifier
|
||||
]);
|
||||
}
|
||||
} catch (\Exception $e) {
|
||||
return ResponseHelper::error('系统错误: ' . $e->getMessage(), 500);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -12,7 +12,7 @@ class SyncAllFriendsJob
|
||||
public function fire(Job $job, $data)
|
||||
{
|
||||
try {
|
||||
$wechatId = $data['wechatId'];
|
||||
$wechatId = 'Lytiao1';
|
||||
$pageIndex = $data['pageIndex'];
|
||||
$pageSize = $data['pageSize'];
|
||||
$preFriendId = isset($data['preFriendId']) ? $data['preFriendId'] : '';
|
||||
|
||||
@@ -204,6 +204,13 @@ class WorkbenchTrafficDistributeJob
|
||||
->whereIn('wa.currentDeviceId', $devices)
|
||||
->field('wf.id,wf.wechatAccountId,wf.wechatId,wf.labels,sa.userName,wa.currentDeviceId as deviceId');
|
||||
|
||||
//lllll
|
||||
if($workbench->id == 65){
|
||||
$query->where('wf.accountId',1602);
|
||||
}
|
||||
|
||||
|
||||
|
||||
if(!empty($labels)){
|
||||
$query->where(function ($q) use ($labels) {
|
||||
foreach ($labels as $label) {
|
||||
@@ -212,7 +219,7 @@ class WorkbenchTrafficDistributeJob
|
||||
});
|
||||
}
|
||||
$list = $query->page($page, $pageSize)->order('wf.id DESC')->select();
|
||||
|
||||
|
||||
return $list;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user