24a4b60517 refactor(gateway): 重构 v4 版本接口签名验证逻辑
- 在 AuthService 中添加对 sign 和 signature 参数的处理
- 更新 Core 控制器中的签名验证逻辑
- 新增 Goods 控制器,实现商品列表查询功能
- 修改 Handle 控制器的日志记录逻辑
- 优化 JunKa、Lingshi 等渠道服务类的实现
- 更新 MerchantService 中的回调处理逻辑
-调整 OrderService 中的订单查询和更新逻辑
- 新增 Qiling 和 Reapi 渠道服务类
2025-04-17 17:21:00 +08:00

826 lines
44 KiB
PHP
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
namespace app\private_api\controller\robotApi;
use app\channel\service\ChannelService;
use app\core\Service;
use app\gateway\service\RedisService;
use app\merchant\service\MerchantLogService;
use app\merchant\service\MerchantService;
use app\merchant\service\OrderLastweekHistoryService;
use app\order\service\OrderService;
use think\exception\HttpResponseException;
use app\robot\controller\WeChatBot as WeChatBotC;
use app\robot\service\WeChatService;
/**
* 接口处理
* Class Handle
* @package app\gateway\api
*/
class WeChatBot extends Core
{
# 是否检测数据
protected bool $check = false;
protected array $robotInfo = [];
# 获取机器人信息
public function getRobotInfo($token)
{
$redisKey = 'wechat_robot_info_' . $token;
$robotInfo = $this->redis->get($redisKey);
if ($robotInfo === false) {
$WeChatService = WeChatService::instance();
// 如果 Redis 连接失败或没有找到机器人信息,从数据库中获取
$robotInfo = $WeChatService->getInfo($token);
if($robotInfo && $robotInfo['status'] == 1){
// 将获取到的信息存入 Redis以便下次快速访问
$this->redis->set($redisKey, json_encode($robotInfo), 3600);
} else {
return false;
}
} else {
$robotInfo = json_decode($robotInfo, true);
}
return $robotInfo;
}
public function Call()
{
$RobotService = new WeChatBotC($this->app);
$data = input();
// if(isset($data['token'])){
// $robotInfo = $this->getRobotInfo($data['token']);
// if($robotInfo){
// $this->robotInfo = $robotInfo;
// }else{
// return $this->response(['code'=>-1,'msg'=>'机器人不存在']);
// }
// }else{
// return $this->response(['code'=>-1,'msg'=>'参数错误']);
// }
# 判断是否为群组
if($data['is_group']){
$roomid = $data['roomid'];
if( str_contains($data['xml'],'wxid_9iv1hha8g3ok29')){
if(str_contains($data['content'],'')){
#判断微信用户中空格,转换成普通空格
$data['content'] = str_replace('', ' ', $data['content']);
}
$merchantService = MerchantService::instance();
$check_merchant = $merchantService->db()->whereLike('other_param', '%'.$roomid.'%')->findOrEmpty();
#其他初始化设置
if($data['sender'] == '25984982683393974@openim'){
#设置渠道
if(str_starts_with($data['content'], '@发财-庚辰小秘设置渠道 ')||str_starts_with($data['content'], '@发财-庚辰小秘 设置渠道 ')){
#渠道id
$newString = strstr($data['content'], '渠道 ');
$cid = substr($newString, strlen("渠道 "));
#查找渠道
$ChannelService = ChannelService::instance();
$channel_info = $ChannelService->db()->where(['id'=>$cid])->findOrEmpty();
if(!$channel_info)return $RobotService->send_text('渠道不存在!请重新核对',$data['roomid'],$data['sender']);
$array = json_decode($channel_info['other_data'],true);
if($channel_info['other_data'] && !is_array($array))return $RobotService->send_text('渠道数据格式错误!请重新核对',$data['roomid'],$data['sender']);
if(!is_array($array))$array = [];
$array['QYWX_roomid'] = $roomid;
$up = $ChannelService->db()->where(['id'=>$cid])->update(['other_data'=>json_encode($array)]);
return $RobotService->send_text('设置成功!渠道名称:'.$channel_info['name'].'渠道id'.$channel_info['id'].',设置时间:'.date('Y-m-d H:i:s').'',$data['roomid'],$data['sender']);
}
#设置渠道
if(str_starts_with($data['content'], '@发财-庚辰小秘设置商户 ')||str_starts_with($data['content'], '@发财-庚辰小秘 设置商户 ')){
if(str_starts_with($data['content'], '@发财-庚辰小秘设置商户 余额预警 ')||str_starts_with($data['content'], '@发财-庚辰小秘 设置商户 余额预警 ')){
// var_dump($data);die;
if(!$check_merchant)return $RobotService->send_text('请先设置商户!',$data['roomid'],$data['sender']);
#渠道id
$newString = strstr($data['content'], '预警 ');
$need_content = substr($newString, strlen("预警 "));
// $new_data = explode(' ', $need_content);
#查找渠道
$mid = $check_merchant['id'];
// $top1 = $new_data[0];
// $top2 = $new_data[1];
$array = json_decode($check_merchant['other_param'],true);
if($check_merchant['other_param'] && !is_array($array))return $RobotService->send_text('商户数据格式错误!请重新核对',$data['roomid'],$data['sender']);
if(!is_array($array))$array = [];
$array['Monitor_Balance'] = $need_content;
$up = $merchantService->db()->where(['id'=>$mid])->update(['other_param'=>json_encode($array)]);
return $RobotService->send_text('设置成功!商户名称:'.$check_merchant['name']."\n余额预警:".$need_content."\n设置时间:".date('Y-m-d H:i:s')."\n",$data['roomid'],$data['sender']);
}
#渠道id
$newString = strstr($data['content'], '商户 ');
$mid = substr($newString, strlen("商户 "));
#查找渠道
$merchant_info = $merchantService->db()->where(['id'=>$mid])->findOrEmpty();
if(!$merchant_info)return $RobotService->send_text('商户不存在!请重新核对',$data['roomid'],$data['sender']);
$array = json_decode($merchant_info['other_param'],true);
if($merchant_info['other_param'] && !is_array($array))return $RobotService->send_text('商户数据格式错误!请重新核对',$data['roomid'],$data['sender']);
if(!is_array($array))$array = [];
$array['QYWX_roomid'] = $roomid;
$up = $merchantService->db()->where(['id'=>$mid])->update(['other_param'=>json_encode($array)]);
return $RobotService->send_text('设置成功!商户名称:'.$merchant_info['name']."\n设置时间:".date('Y-m-d H:i:s')."\n",$data['roomid'],$data['sender']);
}
}
if($check_merchant){
$ac = $RobotService->get_contacts($data['sender']) ;
if(!$ac){
$ac = '';
}
if($roomid == '47576792968@chatroom'){
#内部群
if(str_starts_with($data['content'], '@发财-庚辰小秘设置管理 ') ||str_starts_with($data['content'], '@发财-庚辰小秘 设置管理 ') ||($data['content'] == '@发财-庚辰小秘登记管理'||$data['content'] == '@发财-庚辰小秘 登记管理')){
$redis = RedisService::getInstance();
if($data['sender'] !== '25984982683393974@openim' && ($data['content'] == '@发财-庚辰小秘登记管理'||$data['content'] == '@发财-庚辰小秘 登记管理')){
$name = $RobotService->get_contacts($data['sender']);
$randomNumber = mt_rand(100000, 999999);
$redis->set('wechat_wait_set_manage_'.$randomNumber,$data['sender'],300);
return $RobotService->send_text('登记成功,请联系超级管理员输入验证码【 '.$randomNumber.'】设置管理员,验证码五分钟内有效。@'.$name,$data['roomid'],$data['sender']);
}elseif(($data['content'] == '@发财-庚辰小秘登记管理'||$data['content'] == '@发财-庚辰小秘 登记管理')){
return $RobotService->send_text('无需登记',$data['roomid'],$data['sender']);
}else{
$newString = strstr($data['content'], '设置管理 ');
if ($newString) {
$newString = substr($newString, strlen('设置管理 '));
}else{
$this->response(['code'=>1]);
}
$waitManage = $redis->get('wechat_wait_set_manage_'.$newString) ;
if(!$waitManage){
return $RobotService->send_text('验证码错误或者超时,请重新获取',$data['roomid'],$data['sender']);
}
$set = $RobotService->set_manage($waitManage,1) ;
if($set == 'fail'){
return $RobotService->send_text('设置管理失败,请重新设置',$data['roomid'],$data['sender']);
}
if($set == 'ok'){
$acm = $RobotService->get_contacts($waitManage) ;
return $RobotService->send_text('设置管理成功,管理员名为:'.$acm,$data['roomid'],$data['sender']);
}
return $RobotService->send_text('其他提示:'.$set,$data['roomid'],$data['sender']);
}
}
if(str_starts_with($data['content'], '@发财-庚辰小秘设置门禁 ') ||str_starts_with($data['content'], '@发财-庚辰小秘 设置门禁 ') ||($data['content'] == '@发财-庚辰小秘登记门禁'||$data['content'] == '@发财-庚辰小秘 登记门禁')){
$redis = RedisService::getInstance();
if($data['sender'] !== '25984982683393974@openim' && ($data['content'] == '@发财-庚辰小秘登记门禁'||$data['content'] == '@发财-庚辰小秘 登记门禁')){
$name = $RobotService->get_contacts($data['sender']);
$randomNumber = mt_rand(100000, 999999);
$redis->set('gcdat_wait_set_EntranceGuard_'.$randomNumber,$data['sender'],300);
return $RobotService->send_text('登记成功,请联系超级管理员输入验证码【 '.$randomNumber.'】设置门禁,验证码五分钟内有效。@'.$name,$data['roomid'],$data['sender']);
}elseif(($data['content'] == '@发财-庚辰小秘设置门禁'||$data['content'] == '@发财-庚辰小秘 设置门禁')){
return $RobotService->send_text('无需登记',$data['roomid'],$data['sender']);
}else{
$newString = strstr($data['content'], '设置门禁 ');
if ($newString) {
$newString = substr($newString, strlen('设置门禁 '));
}else{
$this->response(['code'=>1]);
}
$waitManage = $redis->get('gcdat_wait_set_EntranceGuard_'.$newString) ;
if(!$waitManage){
return $RobotService->send_text('验证码错误或者超时,请重新获取',$data['roomid'],$data['sender']);
}
$redis->delete('gcdat_wait_set_EntranceGuard_'.$newString);
$name = $RobotService->get_contacts($waitManage);
if($name){
$get = $redis->get('GCDAT_EntranceGuard_' . $waitManage);
if($get){
if($get != $name){
$redis->set('GCDAT_EntranceGuard_' . $waitManage, $name);
}
return $RobotService->send_text('已经登记过门禁,无法重新设置',$data['roomid'],$data['sender']);
}
$redis->set('GCDAT_EntranceGuard_' . $waitManage, $name);
$RobotService->send_text('登记门禁成功,门禁名为:'.$name,$data['roomid'],$data['sender']);
return $RobotService->send_text('欢迎您登记GCDAT门禁系统您的门禁名为【'.$name."\n您以后可以使用【开门】指令进行门禁操作,权限只限于您排班当天,且私聊即可使用,非排班时间请于本群发出【开门】指令。",$data['roomid'],$waitManage);
}
}
return $RobotService->send_text('其他提示:设置失败或者其他错误',$data['roomid'],$data['sender']);
}
if(str_starts_with($data['content'], '@发财-庚辰小秘通知 ') ||str_starts_with($data['content'], '@发财-庚辰小秘 通知 ')||str_starts_with($data['content'], '@发财-庚辰小秘通知全部 ')){
$newString = strstr($data['content'], '通知全部 ');
if ($newString) {
$newString = substr($newString, strlen('通知全部 '));
}else{
$newString = strstr($data['content'], '通知 ');
if ($newString) {
$newString = substr($newString, strlen('通知 '));
}else{
$this->response(['code'=>1]);
}
}
$merchantsList = $merchantService->db()->where(['merchant_type'=>1,'status'=>1])->whereLike('other_param','%Monitor_Balance_status%')->select()->toArray();
if(!$merchantsList)return $this->response(['code'=>1]);
$tip_info=[];
$num = 0;
foreach ($merchantsList as $merchant){
$other_param = json_decode($merchant['other_param'],true);
$roomids = $other_param['QYWX_roomid'];
$sender = $other_param['QYWX_sender'];
if($roomids == $roomid){
continue;
}
// $acm = '';
$acm = $RobotService->get_contacts($sender) ;
if(!$acm){
$acm = '';
}
$RobotService->send_text("通知 \n ".$newString."\n 时间:".date('Y-m-d H:i:s')."\n @".$acm,$roomids,$sender);
$tip_info[]=$merchant['name'];
$num++;
}
$merchant_name = implode("\n", $tip_info);
return $RobotService->send_text('通知完毕 共通知了'.$num."个商户:\n".$merchant_name.'@'.$ac,$data['roomid'],$data['sender']);
}
if(str_ends_with($data['content'], '余额') ){
if(str_ends_with($data['content'], '商户余额')){
$merchantsList = $merchantService->db()->where(['status'=>1])->whereLike('other_param','%Monitor_Balance_status%')->select()->toArray();
if(!$merchantsList)return $RobotService->send_text('暂无可查询商户@'.$ac,$data['roomid'],$data['sender']);
$tip_info=[];
foreach ($merchantsList as $merchant){
$tip_info[]="商户:[".$merchant['name']."] --【".$merchant['account_surplus'].'】';
}
if(!$tip_info)return $RobotService->send_text('暂无可查询商户@'.$ac,$data['roomid'],$data['sender']);
$tip_infos = implode("\n", $tip_info);
return $RobotService->send_text("商户余额查询完毕:\n".$tip_infos."\n@".$ac,$data['roomid'],$data['sender']);
}
$channelService = ChannelService::instance();
$channelList = $channelService->db()->where(['status'=>1])->whereLike('other_data','%Monitor_Balance_status%')->select()->toArray();
if(!$channelList)return $RobotService->send_text('暂无可查询渠道@'.$ac,$data['roomid'],$data['sender']);
$count_sum= 0;
$day = date('Y-m-d', strtotime('-1 day'));
$tip_info=[];
foreach($channelList as $channel) {
$other_param = json_decode($channel['other_data'], true);
if (!$other_param) {
continue;
}
$Monitor_Balance = $other_param['Monitor_Balance'] ?? null;
if (!$Monitor_Balance) {
continue;
}
try {
$account_data = $channelService->call('account', $channel['id'], $day);
if (is_array($account_data) && isset($account_data['account'])) {
$balance = $account_data['account'];
$tip_info[]='渠道:['.$channel['name']."] \n余额:【".$balance.'】元';
$count_sum++;
}
}catch (\Exception $e){
}
}
if(!$tip_info)return $RobotService->send_text('暂无可查询渠道@'.$ac,$data['roomid'],$data['sender']);
$errorMsg = implode("\n", $tip_info);
return $RobotService->send_text("渠道余额查询完毕,共查询了".$count_sum."个渠道:\n".$errorMsg."\n@".$ac,$data['roomid'],$data['sender']);
}
if(str_ends_with($data['content'], '成本')){
return $RobotService->send_text("成本报价测试@".$ac,$data['roomid'],$data['sender']);
}
}
if(str_ends_with($data['content'], '余额') || str_ends_with($data['content'],'查余额')){
return $RobotService->send_text("商户[".$check_merchant['name']."] : \n 余额为:".$check_merchant['account_surplus']." @".$ac,$data['roomid'],$data['sender']);
}
# 拦截处理
if(str_starts_with($data['content'], '@发财-庚辰小秘拦截 1')||str_starts_with($data['content'], '@发财-庚辰小秘 拦截 1')||str_starts_with($data['content'], '@发财-庚辰小秘拦截 GC')||str_starts_with($data['content'], '@发财-庚辰小秘 拦截 GC')){
if(str_contains($data['content'], 'GC')){
#订单号
$newString = strstr($data['content'], 'G');
$order_id = strstr($newString, 'G');
$intercept_msg = $this->intercept_order($order_id);
return $RobotService->send_text($intercept_msg."\n@".$ac,$data['roomid'],$data['sender']);
}else{
$newString = strstr($data['content'], '1');
if (preg_match('/\b1[3-9]\d{9}\b/', $newString)) {
$orderService = OrderService::instance();
$order = $orderService->db()->field('cid,pid,mid,order_id,merchant_order_id,param,account,cash,status,apply_refund,channel_callback_at,create_at')->where(['account'=>$newString,'mid'=>$check_merchant['id']])->whereNotIn('status', '2,3')->select()->toArray();
if(!$order){
return $RobotService->send_text("您输入的手机号暂无找到可拦截订单,请核对手机号或者是否有已经充值成功或失败 @".$ac,$data['roomid'],$data['sender']);
}
$tip_info = [];
$num = 0;
foreach ($order as $k => $v){
$order_id = $v['order_id'];
$intercept_msg = $this->intercept_order($order_id,$v);
$tip_info[]="订单号:".$order_id.''.$intercept_msg;
$num++;
}
$msg = implode("\n", $tip_info);
return $RobotService->send_text("手机号: ".$newString."\n查询到".$num."订单,处理结果:\n".$msg."\n@".$ac,$data['roomid'],$data['sender']);
}else{
return $RobotService->send_text("您输入的手机号格式错误,请重新核对格式 @".$ac,$data['roomid'],$data['sender']);
}
}
}
if(str_starts_with($data['content'], '@发财-庚辰小秘1')||str_starts_with($data['content'], '@发财-庚辰小秘 1')){
$newString = strstr($data['content'], '1');
if (preg_match('/\b1[3-9]\d{9}\b/', $newString)) {
// Log::write('Robot', 'wechat', $data);
#查询订单
$msg = [];
$orderService = OrderService::instance();
$order = $orderService->db()->field('cid,pid,mid,order_id,merchant_order_id,param,account,cash,status,channel_callback_at,create_at')->where(['account'=>$newString,'mid'=>$check_merchant['id']])->select()->toArray();
if(!$order){
$orderLastweekHistoryService = OrderLastweekHistoryService::instance();
$order = $orderLastweekHistoryService->db()->field('cid,pid,mid,order_id,merchant_order_id,param,account,cash,status,channel_callback_at,create_at')->where(['account'=>$newString,'mid'=>$check_merchant['id']])->select()->toArray();
}
if(!$order)return $RobotService->send_text("手机号格式正确,但是未找到订单,暂时支持当天和最近一周的订单筛选,更多请前往后台查询 @".$ac,$data['roomid'],$data['sender']);
if (count($order) == 1) {
$orders = $order[0];
$infos =$orderService->getOrderInfo($orders['cid'],$orders['mid'],$orders['pid']);
$msg = [
'系统订单号:' . $orders['order_id'],
'产品:' . $infos['p']['name']??'',
'商户订单号:' . $orders['merchant_order_id'],
'手机号:' . $orders['account'],
'订单金额:' . $orders['cash'],
'订单状态:' . ($orders['status'] == 2 ? '成功' : ($orders['status'] == 3 ? '失败' : '处理中')),
'订单时间:' . $orders['create_at'],
];
if(str_contains($orders['param'], 'mnp_isp_array')){
$param_data = json_decode($orders['param'],true);
if($param_data['mnp_isp_array']['old_isp'] == $param_data['mnp_isp_array']['new_isp']){
$msg[] = '携转检测:未携转';
}else{
$msg[] = '携转检测:已携转';
$isp_name = [
1=>'移动',
2=>'联通',
3=>'电信',
];
$msg[] = '旧运营商:'.$isp_name[$param_data['mnp_isp_array']['old_isp']??0] ?? '';
$msg[] = '新运营商:'.$isp_name[$param_data['mnp_isp_array']['new_isp']??0] ?? '';
}
}
if(isset($orders['channel_callback_at']) && $orders['channel_callback_at']){
$msg[] = '完成时间:'.$orders['channel_callback_at'];
}
$m_msg= implode("\n", $msg);
return $RobotService->send_text("已为您查询到订单信息:\n".$m_msg." \n@".$ac, $data['roomid'], $data['sender']);
} else {
return $RobotService->send_text("手机号格式正确,查询到多条订单,暂时只支持单条查询,更多请前往后台查询 @".$ac,$data['roomid'],$data['sender']);
// foreach ($order as $singleOrder) {
// // 在这里处理每一条订单数据
// // 例如:$RobotService->send_text("订单信息: " . $singleOrder['some_field'], $data['roomid'], $data['sender']);
// }
}
}
}
if(str_starts_with($data['content'], '@发财-庚辰小秘检测 ')||str_starts_with($data['content'], '@发财-庚辰小秘 检测 ')){
$newString = strstr($data['content'], '1');
if (!preg_match('/\b1[3-9]\d{9}\b/', $newString)) return $RobotService->send_text("暂时只支持手机号码检测,其他请联系管理员 @".$ac,$data['roomid'],$data['sender']);
$settingPhoneMNPStatus = sysconf('settingPhoneMNPStatus');
if ($settingPhoneMNPStatus == 1) {
$mnp_cid = sysconf('PhoneMnp_cid');
$param = [
'mobile' => $newString,
];
if ($mnp_cid) {
$mnp_array = ChannelService::instance()->call('phone_mnp', $mnp_cid, $param);
if (is_array($mnp_array) && isset($mnp_array['new_isp'])) {
$msg = [
'手机号:' . $newString,
'是否携转:' . ($mnp_array['new_isp'] == $mnp_array['old_isp'] ? '否' : '是'),
'旧运营商:' . ($mnp_array['old_isp'] == 1 ? '移动' : ($mnp_array['old_isp'] == 2 ? '联通' : '电信')),
'新运营商:' . ($mnp_array['new_isp'] == 1 ? '移动' : ($mnp_array['new_isp'] == 2 ? '联通' : '电信')),
];
$m_msg= implode("\n", $msg);
return $RobotService->send_text("已经为您查询到手机号信息:\n".$m_msg." \n@".$ac, $data['roomid'], $data['sender']);
}
}
}
$isp = Service::instance()->isp($newString);
$msg = [
'手机号:' . $newString,
'是否携转:' . '未携转或者无法查询',
'运营商:' . ($isp == 1 ? '移动' : ($isp == 2 ? '联通' : '电信')),
];
$m_msg= implode("\n", $msg);
return $RobotService->send_text("已经为您查询到手机号信息:\n".$m_msg." \n@", $data['roomid'], $data['sender']);
}
$need_Manage_list = [
'返销','加款'
];
if(str_starts_with($data['content'], '@发财-庚辰小秘 ')){
$need_content = substr($data['content'], strlen('@发财-庚辰小秘 '));
}elseif(str_starts_with($data['content'], '@发财-庚辰小秘')){
$need_content = substr($data['content'], strlen('@发财-庚辰小秘'));
}else{
$need_content = false;
}
foreach ($need_Manage_list as $need_Manage){
if($need_content && str_starts_with($need_content, $need_Manage)){
$redis = RedisService::getInstance();
$is_manage = $redis->get('Wechat_manage_'.$data['sender']);
if(!$is_manage){
return $RobotService->send_text('您没有权限 @'.$ac,$data['roomid'],$data['sender']);
}
if(str_starts_with($need_content, '返销 GC')){
$order_id = substr($need_content, strlen('返销 '));
$orderService = OrderService::instance();
$order = $orderService->db()->field('id,pid,mid,order_id,merchant_order_id,product_key,account,cash,status,project_id,isp,channel_callback_at,create_at,buy_back')->where(['order_id'=>$order_id,'mid'=>$check_merchant['id']])->findOrEmpty();
if(!$order){
$orderService = OrderLastweekHistoryService::instance();
$order = $orderService->db()->field('id,cid,pid,mid,order_id,merchant_order_id,product_key,account,cash,status,project_id,isp,channel_callback_at,create_at,buy_back')->where(['order_id'=>$order_id,'mid'=>$check_merchant['id']])->findOrEmpty();
if(!$order){
return $RobotService->send_text('订单不存在,或者超过七天,超七天订单需要返销请前往后台手动处理 @'.$ac,$data['roomid'],$data['sender']);
}
}
if($order['status'] != 2){
return $RobotService->send_text('订单状态不是成功,无法返销 @'.$ac,$data['roomid'],$data['sender']);
}
if(isset($order['buy_back']) && $order['buy_back'] == 1){
return $RobotService->send_text('订单已经返销,无需重复返销 @'.$ac,$data['roomid'],$data['sender']);
}
$state = MerchantService::instance()->buyBackFrozenAccount($order['id'], $order['order_id'], $order['mid'], $order['pid'], $order['product_key'], $order['cash'], $order['project_id'], $order['account'], $order['isp']);
if ($state) {
$log['type'] = 'account_fail';
$log['data'] = $order;
$log['msg'] = '返销';
$this->log($log);
$orderService->db()->where(['order_id'=>$order_id,'mid'=>$check_merchant['id']])->update(['status'=>3,'buy_back'=>1]);
$check_merchants = $merchantService->db()->whereLike('other_param', '%'.$roomid.'%')->findOrEmpty();
return $RobotService->send_text("返销成功! \n返销订单:".$order_id."\n商户订单:".$order['merchant_order_id']."\n账号:".$order['account']."\n返销金额:".$state."\n返销后余额:".$check_merchants['account_surplus']."\n@".$ac,$data['roomid'],$data['sender']);
}
return $RobotService->send_text('返销失败,请后台人工核查 @'.$ac,$data['roomid'],$data['sender']);
}
if(str_starts_with($need_content, '加款 ')){
#加款格式 金额 备注
$jk_data = explode(' ', $need_content);
if($jk_data[0] != '加款'){
return $RobotService->send_text('加款格式错误@'.$ac,$data['roomid'],$data['sender']);
}
$jk_money = $jk_data[1];
if(!$jk_money || !is_numeric($jk_money)){
return $RobotService->send_text('加款金额错误@'.$ac,$data['roomid'],$data['sender']);
}
if(!$jk_data[2]){
$desc = '机器人加款,加款人:'.$ac;
}else{
$desc = $jk_data[2].',操作人:'.$ac;
}
if (MerchantLogService::instance()->add($check_merchant['id'], $jk_money, 1,1,$desc) !== false) {
sysoplog('修改金额', '加款金额:'.$jk_money.'元,类型为:'. '余额账户');
$check_merchants = $merchantService->db()->where(['id'=>$check_merchant['id']])->findOrEmpty();
return $RobotService->send_text("加款成功! \n加款金额:【".$jk_money."】元 \n加款描述:".$desc."\n加款操作人:".$ac."\n加款时间:".date('Y-m-d H:i:s')."\n加款前余额:".$check_merchant['account_surplus']."\n加款后余额:".$check_merchants['account_surplus']."\n@".$ac,$data['roomid'],$data['sender']);
}
}
return $RobotService->send_text('测试权限设置 @'.$ac,$data['roomid'],$data['sender']);
}
}
return $RobotService->send_text('测试自动回复 @'.$ac,$data['roomid'],$data['sender']);
}else{
$ChannelService = ChannelService::instance();
$check_channel = $ChannelService->db()->whereLike('other_data', '%'.$roomid.'%')->findOrEmpty();
if($check_channel){
return $this->channel_logic($roomid, $check_channel, $data);
}
}
}
$this->response(['code'=>1]);
}else{
#不为群组
$sender = $data['sender'] ?? null;
if(!$sender) return $this->response($data);
$redis = RedisService::getInstance();
$is_manage = $redis->get('GCDAT_EntranceGuard_'.$sender);
$ac = $RobotService->get_contacts($data['sender']) ;
if(!$ac){
$ac = '';
}
if($is_manage){
if($data['content'] == '开门'){
$url = 'http://nw.gcdat.com:6001/?command=c1';
$msg = $RobotService->curl('get',$url);
if($msg == 'n1f1'){
return $RobotService->send_text('开门成功!时间:'.date('Y-m-d H:i:s').'!欢迎['.$ac.']来到庚辰数据',$data['sender']);
}else{
return $RobotService->send_text('开门失败,请后台人工核查 ',$data['sender']);
}
}
}
}
$this->response($data);
}
public function channel_logic($roomid,$check_channel,$data)
{
$RobotService = new WeChatBotC($this->app);
$ac = $RobotService->get_contacts($data['sender']) ;
if(!$ac){
$ac = '';
}
if(str_starts_with($data['content'], '@发财-庚辰小秘检测 ')||str_starts_with($data['content'], '@发财-庚辰小秘 检测 ')){
$newString = strstr($data['content'], '1');
if (!preg_match('/\b1[3-9]\d{9}\b/', $newString)) return $RobotService->send_text("暂时只支持手机号码检测,其他请联系管理员 @".$ac,$data['roomid'],$data['sender']);
$settingPhoneMNPStatus = sysconf('settingPhoneMNPStatus');
if ($settingPhoneMNPStatus == 1) {
$mnp_cid = sysconf('PhoneMnp_cid');
$param = [
'mobile' => $newString,
];
if ($mnp_cid) {
$mnp_array = ChannelService::instance()->call('phone_mnp', $mnp_cid, $param);
if (is_array($mnp_array) && isset($mnp_array['new_isp'])) {
$msg = [
'手机号:' . $newString,
'是否携转:' . ($mnp_array['new_isp'] == $mnp_array['old_isp'] ? '否' : '是'),
'旧运营商:' . ($mnp_array['old_isp'] == 1 ? '移动' : ($mnp_array['old_isp'] == 2 ? '联通' : '电信')),
'新运营商:' . ($mnp_array['new_isp'] == 1 ? '移动' : ($mnp_array['new_isp'] == 2 ? '联通' : '电信')),
];
$m_msg= implode("\n", $msg);
return $RobotService->send_text("已经为您查询到手机号信息:\n".$m_msg." \n@".$ac, $data['roomid'], $data['sender']);
}
}
}
$isp = Service::instance()->isp($newString);
$msg = [
'手机号:' . $newString,
'是否携转:' . '未携转或者无法查询',
'运营商:' . ($isp == 1 ? '移动' : ($isp == 2 ? '联通' : '电信')),
];
$m_msg= implode("\n", $msg);
return $RobotService->send_text("已经为您查询到手机号信息:\n".$m_msg." \n@", $data['roomid'], $data['sender']);
}
return $RobotService->send_text('输入指令有误,或者其他错误! @'.$ac,$data['roomid'],$data['sender']);
}
public function manage_logic($openid)
{
}
#拦截
public function intercept_order($order_id,$order = [])
{
if(!$order){
#未传入订单全部信息需要查询订单信息
$order = OrderService::instance()->db()->where(['order_id'=>$order_id])->findOrEmpty();
}
if(!$order) return '没有订单信息';
if(in_array($order['status'], [2, 3])){
return '订单已完成,无需拦截或者无法拦截';
}
if($order['status'] == 4){
#判断渠道
#登记订单状态拦截 apply_refund ==1
#TODO 待优化,本次未进行自动化拦截,仅支持微信消息推送。
if($order['apply_refund'] !=0){
if($order['apply_refund'] == 2)return '订单拦截成功,请核实订单状态';
if($order['apply_refund'] == 3)return '订单拦截失败,请核实订单状态';
#待优化后续可以使用redis记录用户催促数据着急的可以使用定时任务或者队列反复提醒
return '订单正在拦截中,请耐心等待';
}
$orderService = OrderService::instance();
$upApply_refund = $orderService->db()->where(['order_id'=>$order_id])->update(['apply_refund'=>1]);
if(!$upApply_refund)return '拦截订单登记失败,请联系管理员';
#发送拦截信息给对应的渠道
$channel_id = $order['cid'];
$channel_info = ChannelService::instance()->get($channel_id);
$json = $channel_info['other_data']??'';
$array = json_decode($json, true);
if(!$array || !is_array($array) || !isset($array['QYWX_roomid']))return '已登记拦截订单,请核实拦截消息';
$WX_Group = $array['QYWX_roomid'];
$intercept_msg = '我方订单号:'.$order_id."\n手机号:".$order['account']."\n需要催促拦截处理,请尽快核实订单状态";
$RobotService = new WeChatBotC($this->app);
#待优化 未做消息查询判断
$send = $RobotService->send_text($intercept_msg, $WX_Group, '');
return '已登记拦截订单,并尝试拦截中,请耐心等待';
}elseif($order['status'] == 1 || $order['status'] == -4 || $order['status'] == -5){
$orderService = OrderService::instance();
$upApply_refund = $orderService->db()->where(['order_id'=>$order_id])->update(['apply_refund'=>2,'status'=>3]);
if(!$upApply_refund)return '拦截订单登记失败,请联系管理员';
return '订单拦截成功,请核实订单状态';
}else{
$orderService = OrderService::instance();
$upApply_refund = $orderService->db()->where(['order_id'=>$order_id])->update(['apply_refund'=>1]);
return '订单状态异常,请联系管理员';
}
}
public function response($result)
{
throw new HttpResponseException(json($result));
}
protected function maketime($v): float|false|int|string
{
if (!$v) {
return '';
}
if (is_numeric($v)) {
return $v;
}
if (is_array($v)) {
$v = $v[1];
}
if (strstr($v, ' ')) {
$t = explode(' ', $v);
$v = $t[0];
$s = explode(':', $t[1]);
} else {
$s = array(0, 0, 0);
}
if (!isset($s[1])) {
$s[1] = 0;
}
if (!isset($s[2])) {
$s[2] = 0;
}
if (strstr($v, '-')) {
$t = explode('-', $v);
} elseif (strstr($v, '/')) {
$u = explode('/', $v);
$t[0] = $u[2];
$t[1] = $u[0];
$t[2] = $u[1];
}
if (!isset($t)) {
$t = array(0, 0, 0);
}
if (!isset($t[1])) {
$t[1] = 0;
}
if (!isset($t[2])) {
$t[2] = 0;
}
return mktime($s[0], $s[1], $s[2], $t[1], $t[2], $t[0]);
}
}