Files
verify/1.php
T
admin 10044b474f feat: 添加云端函数HTTP请求、SMTP邮件、数据库操作能力
- 添加HTTP客户端工具支持GET/POST请求
- 添加SMTP邮件发送功能
- 添加数据库操作(db.getRecords, db.deleteRecord, db.deleteRecords)
- 添加订单管理云端函数(读取、接收、筛选、成功、失败)
- 添加测试推送和邮件通知云端函数
- 修复云端函数编辑页面预览代码换行显示
- 云端变量数据模型重构(合并数据类型)
2026-04-30 20:54:02 +08:00

1086 lines
46 KiB
PHP

<?php
error_reporting(0);
$_GET && SafeFilter($_GET);
$_POST && SafeFilter($_POST);
$_COOKIE && SafeFilter($_COOKIE);
function SafeFilter(&$arr)
{
$ra = array("/([\\x00-\\x08,\\x0b-\\x0c,\\x0e-\\x19])/", "/script/", "/javascript/", "/vbscript/", "/expression/", "/applet/", "/meta/", "/xml/", "/blink/", "/link/", "/style/", "/embed/", "/object/", "/frame/", "/layer/", "/title/", "/bgsound/", "/base/", "/onload/", "/onunload/", "/onchange/", "/onsubmit/", "/onreset/", "/onselect/", "/onblur/", "/onfocus/", "/onabort/", "/onkeydown/", "/onkeypress/", "/onkeyup/", "/onclick/", "/ondblclick/", "/onmousedown/", "/onmousemove/", "/onmouseout/", "/onmouseover/", "/onmouseup/", "/onunload/");
if (is_array($arr)) {
foreach ($arr as $key => $value) {
if (!is_array($value)) {
// 移除废弃的get_magic_quotes_gpc()检查,因为PHP 7.4+已经移除了magic_quotes
$value = preg_replace($ra, '', $value);
$arr[$key] = htmlentities(strip_tags($value));
} else {
SafeFilter($arr[$key]);
}
}
}
}
require_once "include/core.php";
require_once "include/TelegramBot.php";
//取到提交的功能接口
$mod = isset($_GET['mod']) ? purge($_GET['mod']) : '';
define('LOG_FILE_API', __DIR__ . '/api.log');
function log_api($message, $level = 'INFO')
{
$timestamp = date('Y-m-d H:i:s');
$logMessage = "[{$timestamp}] [{$level}] {$message}\n";
file_put_contents(LOG_FILE_API, $logMessage, FILE_APPEND | LOCK_EX);
}
function getForwardTelegram()
{
// 查询配置
$config = DB::table("sys")->select();
if (!$config) {
return "";
}
foreach ($config as $value) {
if ($value["mate_key"] == "forward_telegram") {
return $value["mate_value"];
}
}
return "";
}
function getForwardEmail()
{
// 查询配置
$config = DB::table("sys")->select();
if (!$config) {
return "";
}
foreach ($config as $value) {
if ($value["mate_key"] == "forward_email") {
return $value["mate_value"];
}
}
return "";
}
if ($mod == "push") {
log_api("接收到推送请求");
// 获取IP
$ip = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '';
if (!ip2long($ip)) {
$ip = '未知';
}
// 应用ID
$appId = isset($_GET['appId']) ? purge($_GET['appId']) : '';
if (!$appId) {
log_api("校验应用失败");
$result["timestamp"] = time();
$result["code"] = "0";
$result["msg"] = "数据错误";
$result["data"] = "";
$result["sign"] = md5($result["code"] . $result["msg"] . $result["data"]);
die(json_encode($result));
}
// 查询应用
$app = DB::table("app")->where(["id" => $appId])->find();
if (!$app) {
log_api("校验应用失败2");
$result["timestamp"] = time();
$result["code"] = "0";
$result["msg"] = "应用不存在";
$result["data"] = "";
$result["sign"] = md5($result["code"] . $result["msg"] . $result["data"]);
die(json_encode($result));
}
// 校验数据签名
$sign = isset($_GET['sign']) ? purge($_GET['sign']) : '';
if (!$sign) {
log_api("校验数据签名失败");
$result["code"] = "0";
$result["msg"] = "签名数据错误";
$result["data"] = "";
$result["sign"] = md5($result["code"] . $result["msg"] . $result["data"]);
die(json_encode($result));
}
$timestamp = isset($_GET['timestamp']) ? purge($_GET['timestamp']) : '';
if (!$sign) {
log_api("校验数据签名失败2");
$result["code"] = "0";
$result["msg"] = "时间戳校验失败";
$result["data"] = "";
$result["sign"] = md5($result["code"] . $result["msg"] . $result["data"]);
die(json_encode($result));
}
$data = file_get_contents("php://input");
$md5 = md5($data . $timestamp . $app["commKey"]);
if ($md5 != $sign) {
log_api("校验数据签名失败3");
$result["code"] = "0";
$result["msg"] = "签名校验失败";
$result["data"] = "";
$result["sign"] = md5($result["code"] . $result["msg"] . $result["data"]);
die(json_encode($result));
}
// 解密数据
$decryptData = json_decode(mi_rc4($data, $app["commKey"], 1), true);
$user = DB::table("user")->where(["username" => $decryptData["username"], "password" => $decryptData["password"]])->find();
if (!$user) {
log_api("校验用户失败");
$result["code"] = "0";
$result["msg"] = "账号或密码错误";
$result["data"] = "";
$result["sign"] = md5($result["code"] . $result["msg"] . $result["data"]);
die(json_encode($result));
}
//log_api("开始解析数据");
// 解析数据入库
$order = $decryptData["order"];
// 解析消息类型
$notice_type = $decryptData["type"];
$app = $decryptData["app"];
//log_api("消息类型".$notice_type);
// 解析收信账户
$notice_account = $decryptData["account"];
//log_api("收信账户".$notice_account);
// 邮箱
if (filter_var($notice_account, FILTER_VALIDATE_EMAIL)) {
//log_api("邮箱用户".$notice_account);
// 邮件内容
if ($notice_type == "test_push") {
//log_api("当前账号:".$decryptData["username"]);
$msg = "用户:" . $decryptData["username"] . "\n程序:" . $app . "\n内容:信息接收测试, 接收到本消息则表明测试正常.";
//log_api("发送消息:".$msg);
//$bot->sendMessage($chat_id, $msg);
}
// 读取注单
if ($notice_type == "read_order") {
if ($order["SRV_IP"] == "手机") {
$order["SRV_IP"] = "\r\n手机";
}
// $msg = $decryptData["order"]["TID"]."AAA";
//log_api(json_encode($order));
$msg = "用户:" . $decryptData["username"] . "\n程序:" . $app . "\n类型:读取注单\n" . "单号: " . $order["TID"] . "\n时间:" . $order["DATETIME"] . "\n会员:" . $order["NAME0"] . "\n球种:" . $order["GT"] . "\n赛段:" . $order["SESSION"] . "\n玩法:" . $order["WAGERS_TYPE"] . $order["SRV_IP"] . "\n联盟:" . $order["LEAGUE"] . "\r\n队伍:" . $order["TEAM_H"] . " : " . $order["TEAM_C"] . "\n比分:" . $order["SCORE"] . "\n盘口:" . $order["ORDER_CON"] . "\n下注:" . $order["ORDER_TYPE"] . "\n赔率:" . $order["IORATIO"] . "\n金额:" . $order["GOLD"] . "\r\n开赛时间:" . $order["G_TIME"];
$find_cache = DB::table("orders")->where(["TID" => $order["TID"]])->find();
if (!$find_cache) {
$database_order["TID"] = $order["TID"];
$database_order["USERNAME"] = $decryptData["username"];
$database_order["DATETIME"] = $order["DATETIME"];
$database_order["NAME0"] = $order["NAME0"];
$database_order["GT"] = $order["GT"];
$database_order["WAGERS_TYPE"] = $order["WAGERS_TYPE"];
$database_order["LEAGUE"] = $order["LEAGUE"];
$database_order["TEAM_H"] = $order["TEAM_H"];
$database_order["TEAM_C"] = $order["TEAM_C"];
$database_order["ORDER_TYPE"] = $order["ORDER_TYPE"];
$database_order["ORDER_CON"] = $order["ORDER_CON"];
$database_order["SCORE"] = $order["SCORE"];
$database_order["IORATIO"] = $order["IORATIO"];
$database_order["GOLD"] = $order["GOLD"];
$database_order["SRV_IP"] = $order["SRV_IP"];
$database_order["SESSION"] = $order["SESSION"];
$database_order["STAGE"] = $order["STAGE"];
$database_order["G_TIME"] = $order["G_TIME"];
$database_order["NUM_C"] = $order["NUM_C"];
$database_order["NUM_H"] = $order["NUM_H"];
DB::table("orders")->add($database_order);
//log_api($user["forward"]);
if ($user["forward"] == 1) {
//log_api("邮箱转发");
$forward_email = getForwardEmail();
if (filter_var($forward_email, FILTER_VALIDATE_EMAIL)) {
sendemail("金运来消息推送", $msg, $forward_email, $back);
}
}
}
//$bot->sendMessage($chat_id, $msg);
}
// 接收注单
if ($notice_type == "accept_order") {
if ($order["SRV_IP"] == "手机") {
$order["SRV_IP"] = "\n手机";
}
// $msg = $decryptData["order"]["TID"]."AAA";
$msg = "用户:" . $decryptData["username"] . "\n程序:" . $app . "\n类型:接收注单\n" . "单号: " . $order["TID"] . "\n时间:" . $order["DATETIME"] . "\n会员:" . $order["NAME0"] . "\n球种:" . $order["GT"] . "\n赛段:" . $order["SESSION"] . "\n玩法:" . $order["WAGERS_TYPE"] . $order["SRV_IP"] . "\n联盟:" . $order["LEAGUE"] . "\n队伍:" . $order["TEAM_H"] . " : " . $order["TEAM_C"] . "\n比分:" . $order["SCORE"] . "\n盘口:" . $order["ORDER_CON"] . "\n下注:" . $order["ORDER_TYPE"] . "\n赔率:" . $order["IORATIO"] . "\n金额:" . $order["GOLD"] . "\n开赛时间:" . $order["G_TIME"];
//$bot->sendMessage($chat_id, $msg);
}
// 筛选注单
if ($notice_type == "screen_order") {
if ($order["SRV_IP"] == "手机") {
$order["SRV_IP"] = "\n手机";
}
// $msg = $decryptData["order"]["TID"]."AAA";
$msg = "用户:" . $decryptData["username"] . "\n程序:" . $app . "\n类型:筛选注单\n" . "单号: " . $order["TID"] . "\n时间:" . $order["DATETIME"] . "\n会员:" . $order["NAME0"] . "\n球种:" . $order["GT"] . "\n赛段:" . $order["SESSION"] . "\n玩法:" . $order["WAGERS_TYPE"] . $order["SRV_IP"] . "\n联盟:" . $order["LEAGUE"] . "\n队伍:" . $order["TEAM_H"] . " : " . $order["TEAM_C"] . "\n比分:" . $order["SCORE"] . "\n最新比分:" . $order["SCORE_NEW"] . "\n盘口:" . $order["ORDER_CON"] . "\n最新盘口:" . $order["ORDER_CON_NEW"] . "\n下注:" . $order["ORDER_TYPE"] . "\n赔率:" . $order["IORATIO"] . "\n最新赔率:" . $order["IORATIO"] . "\n金额:" . $order["GOLD"] . "\n开赛时间:" . $order["G_TIME"] . "\n过滤原因:" . $order["REASON"];
//$bot->sendMessage($chat_id, $msg);
}
// 跟单成功
if ($notice_type == "bet_order_success") {
if ($order["SRV_IP"] == "手机") {
$order["SRV_IP"] = "\n手机";
}
// $msg = $decryptData["order"]["TID"]."AAA";
$msg = "用户:" . $decryptData["username"] . "\n程序:" . $app . "\n类型:跟单成功\n" . "单号: " . $order["TID"] . "\n时间:" . $order["DATETIME"] . "\n会员:" . $order["NAME0"] . "\n球种:" . $order["GT"] . "\n赛段:" . $order["SESSION"] . "\n玩法:" . $order["WAGERS_TYPE"] . $order["SRV_IP"] . "\n联盟:" . $order["LEAGUE"] . "\n队伍:" . $order["TEAM_H"] . " : " . $order["TEAM_C"] . "\n比分:" . $order["SCORE"] . "\n最新比分:" . $order["SCORE_NEW"] . "\n盘口:" . $order["ORDER_CON"] . "\n最新盘口:" . $order["ORDER_CON_NEW"] . "\n下注:" . $order["ORDER_TYPE"] . "\n赔率:" . $order["IORATIO"] . "\n最新赔率:" . $order["IORATIO_NEW"] . "\n金额:" . $order["GOLD"] . "\n开赛时间:" . $order["G_TIME"];
// $bot->sendMessage($chat_id, $msg);
}
// 跟单失败
if ($notice_type == "bet_order_failed") {
if ($order["SRV_IP"] == "手机") {
$order["SRV_IP"] = "\n手机";
}
// $msg = $decryptData["order"]["TID"]."AAA";
$msg = "用户:" . $decryptData["username"] . "\n程序:" . $app . "\n类型:跟单失败\n" . "单号: " . $order["TID"] . "\n时间:" . $order["DATETIME"] . "\n会员:" . $order["NAME0"] . "\n球种:" . $order["GT"] . "\n赛段:" . $order["SESSION"] . "\n玩法:" . $order["WAGERS_TYPE"] . $order["SRV_IP"] . "\n联盟:" . $order["LEAGUE"] . "\n队伍:" . $order["TEAM_H"] . " : " . $order["TEAM_C"] . "\n比分:" . $order["SCORE"] . "\n比分:" . $order["SCORE_NEW"] . "\n盘口:" . $order["ORDER_CON"] . "\n最新盘口:" . $order["ORDER_CON_NEW"] . "\n下注:" . $order["ORDER_TYPE"] . "\n赔率:" . $order["IORATIO"] . "\n最新赔率:" . $order["IORATIO_NEW"] . "\n金额:" . $order["GOLD"] . "\n开赛时间:" . $order["G_TIME"] . "\n失败原因:" . $order["REASON"];
// $bot->sendMessage($chat_id, $msg);
}
// 账户掉线
if ($notice_type == "account_dissconnected") {
$msg = "用户:" . $decryptData["username"] . "\n程序:" . $app . "\n类型:账户掉线";
//$bot->sendMessage($chat_id, $msg);
}
// 账户重连
if ($notice_type == "account_reconnected") {
$msg = "用户:" . $decryptData["username"] . "\n程序:" . $app . "\n类型:账户重连";
//$bot->sendMessage($chat_id, $msg);
//$bot->sendMessage($chat_id, "账户重连");
}
if (!sendemail("金运来消息推送", $msg, $notice_account, $back)) {
$result["code"] = "0";
$result["msg"] = "推送失败";
$result["data"] = mi_rc4(json_encode($result["data"]), $app["commKey"], 0);
$result["sign"] = md5($result["code"] . $result["msg"] . $result["data"]);
//log_api("推送失败结果:".$back);
die(json_encode($result));
//die("请求超时或返回的数据解析失败:" . $back);
} else {
$result["code"] = "1";
$result["msg"] = "推送成功";
$result["data"] = mi_rc4(json_encode($result["data"]), $app["commKey"], 0);
$result["sign"] = md5($result["code"] . $result["msg"] . $result["data"]);
die(json_encode($result));
//die("邮件已发送至您开通授权时候设置的站长邮箱,请检查收件箱和垃圾箱是否已收到文件");
}
} else {
//log_api("机器人初始化".$notice_account);
$bot = new TelegramBot();
// log_api("机器人初始化完成".$notice_account);
// 先找send_id(群聊)
$telegram_account = DB::table("telegram")->where(["chat_id" => $notice_account])->find();
if (!$telegram_account) {
// 找TG号
$telegram_account = DB::table("telegram")->where(["account" => $notice_account])->find();
}
// 机器人发信
$chat_id = $telegram_account["chat_id"];
// log_api("收信账户chat_id".$chat_id);
// 测试通信
$msg = "";
if ($notice_type == "test_push") {
//log_api("当前账号:".$decryptData["username"]);
$msg = "用户:" . $decryptData["username"] . "\n程序:" . $app . "\n内容:信息接收测试, 接收到本消息则表明测试正常.";
//log_api("发送消息:".$msg);
// $database_order["TID"] = "22855900875";
// $database_order["DATETIME"] = "2025-10-24 18:03:29";
// $database_order["NAME0"] = "dtt8user1";
// $database_order["GT"] = "足球";
// $database_order["WAGERS_TYPE"] = "(滚球) 大 / 小-上半场";
// $database_order["LEAGUE"] = "巴西乙组联赛";
// $database_order["TEAM_H"] = "甘美奥诺瓦里桑蒂诺SP";
// $database_order["TEAM_C"] = "博塔福格SP";
// $database_order["ORDER_TYPE"] ="大";
// $database_order["ORDER_CON"] = "0.5 / 1";
// $database_order["SCORE"] = "0:0";
// $database_order["IORATIO"] = "0.73";
// $database_order["GOLD"] = "50";
// $database_order["SRV_IP"] = "手机";
// $database_order["SESSION"] = "滚球";
// $database_order["STAGE"] = "上半场";
// $database_order["G_TIME"] = "10-24-2025 18:00:00";
// $database_order["NUM_C"] = "11111";
// $database_order["NUM_H"] = "222222";
// DB::table("orders")->add($database_order);
$bot->sendMessage($chat_id, $msg);
}
// 读取注单
if ($notice_type == "read_order") {
if ($order["SRV_IP"] == "手机") {
$order["SRV_IP"] = "\r\n手机";
}
// $msg = $decryptData["order"]["TID"]."AAA";
//log_api(json_encode($order));
$msg = "用户:" . $decryptData["username"] . "\n程序:" . $app . "\n类型:读取注单\n" . "单号: " . $order["TID"] . "\n时间:" . $order["DATETIME"] . "\n会员:" . $order["NAME0"] . "\n球种:" . $order["GT"] . "\n赛段:" . $order["SESSION"] . "\n玩法:" . $order["WAGERS_TYPE"] . $order["SRV_IP"] . "\n联盟:" . $order["LEAGUE"] . "\r\n队伍:" . $order["TEAM_H"] . " : " . $order["TEAM_C"] . "\n比分:" . $order["SCORE"] . "\n盘口:" . $order["ORDER_CON"] . "\n下注:" . $order["ORDER_TYPE"] . "\n赔率:" . $order["IORATIO"] . "\n金额:" . $order["GOLD"] . "\r\n开赛时间:" . $order["G_TIME"];
// log_api("开始入库");
$find_cache = DB::table("orders")->where(["TID" => $order["TID"]])->find();
if (!$find_cache) {
$database_order["TID"] = $order["TID"];
$database_order["USERNAME"] = $decryptData["username"];
$database_order["DATETIME"] = $order["DATETIME"];
$database_order["NAME0"] = $order["NAME0"];
$database_order["GT"] = $order["GT"];
$database_order["WAGERS_TYPE"] = $order["WAGERS_TYPE"];
$database_order["LEAGUE"] = $order["LEAGUE"];
$database_order["TEAM_H"] = $order["TEAM_H"];
$database_order["TEAM_C"] = $order["TEAM_C"];
$database_order["ORDER_TYPE"] = $order["ORDER_TYPE"];
$database_order["ORDER_CON"] = $order["ORDER_CON"];
$database_order["SCORE"] = $order["SCORE"];
$database_order["IORATIO"] = $order["IORATIO"];
$database_order["GOLD"] = $order["GOLD"];
$database_order["SRV_IP"] = $order["SRV_IP"];
$database_order["SESSION"] = $order["SESSION"];
$database_order["STAGE"] = $order["STAGE"];
$database_order["G_TIME"] = $order["G_TIME"];
$database_order["NUM_C"] = $order["NUM_C"];
$database_order["NUM_H"] = $order["NUM_H"];
DB::table("orders")->add($database_order);
//log_api($user["forward"]);
if ($user["forward"] == 1) {
//log_api("TG转发");
$forward_tg = getForwardTelegram();
//log_api("TG转发:".$forward_tg);
if ($forward_tg != "") {
$forward_telegram_account = DB::table("telegram")->where(["chat_id" => $forward_tg])->find();
if (!$forward_telegram_account) {
// 找TG号
$forward_telegram_account = DB::table("telegram")->where(["account" => $forward_tg])->find();
}
if ($forward_telegram_account["chat_id"] != "") {
$bot->sendMessage($forward_telegram_account["chat_id"], $msg);
}
}
}
}
//log_api("结束入库");
if($chat_id!="")
{
$bot->sendMessage($chat_id, $msg);
}
}
// 接收注单
if ($notice_type == "accept_order") {
if ($order["SRV_IP"] == "手机") {
$order["SRV_IP"] = "\n手机";
}
// $msg = $decryptData["order"]["TID"]."AAA";
$msg = "用户:" . $decryptData["username"] . "\n程序:" . $app . "\n类型:接收注单\n" . "单号: " . $order["TID"] . "\n时间:" . $order["DATETIME"] . "\n会员:" . $order["NAME0"] . "\n球种:" . $order["GT"] . "\n赛段:" . $order["SESSION"] . "\n玩法:" . $order["WAGERS_TYPE"] . $order["SRV_IP"] . "\n联盟:" . $order["LEAGUE"] . "\n队伍:" . $order["TEAM_H"] . " : " . $order["TEAM_C"] . "\n比分:" . $order["SCORE"] . "\n盘口:" . $order["ORDER_CON"] . "\n下注:" . $order["ORDER_TYPE"] . "\n赔率:" . $order["IORATIO"] . "\n金额:" . $order["GOLD"] . "\n开赛时间:" . $order["G_TIME"];
$bot->sendMessage($chat_id, $msg);
}
// 筛选注单
if ($notice_type == "screen_order") {
if ($order["SRV_IP"] == "手机") {
$order["SRV_IP"] = "\n手机";
}
// $msg = $decryptData["order"]["TID"]."AAA";
$msg = "用户:" . $decryptData["username"] . "\n程序:" . $app . "\n类型:筛选注单\n" . "单号: " . $order["TID"] . "\n时间:" . $order["DATETIME"] . "\n会员:" . $order["NAME0"] . "\n球种:" . $order["GT"] . "\n赛段:" . $order["SESSION"] . "\n玩法:" . $order["WAGERS_TYPE"] . $order["SRV_IP"] . "\n联盟:" . $order["LEAGUE"] . "\n队伍:" . $order["TEAM_H"] . " : " . $order["TEAM_C"] . "\n比分:" . $order["SCORE"] . "\n最新比分:" . $order["SCORE_NEW"] . "\n盘口:" . $order["ORDER_CON"] . "\n最新盘口:" . $order["ORDER_CON_NEW"] . "\n下注:" . $order["ORDER_TYPE"] . "\n赔率:" . $order["IORATIO"] . "\n最新赔率:" . $order["IORATIO"] . "\n金额:" . $order["GOLD"] . "\n开赛时间:" . $order["G_TIME"] . "\n过滤原因:" . $order["REASON"];
$bot->sendMessage($chat_id, $msg);
}
// 跟单成功
if ($notice_type == "bet_order_success") {
if ($order["SRV_IP"] == "手机") {
$order["SRV_IP"] = "\n手机";
}
// $msg = $decryptData["order"]["TID"]."AAA";
$msg = "用户:" . $decryptData["username"] . "\n程序:" . $app . "\n类型:跟单成功\n" . "单号: " . $order["TID"] . "\n时间:" . $order["DATETIME"] . "\n会员:" . $order["NAME0"] . "\n球种:" . $order["GT"] . "\n赛段:" . $order["SESSION"] . "\n玩法:" . $order["WAGERS_TYPE"] . $order["SRV_IP"] . "\n联盟:" . $order["LEAGUE"] . "\n队伍:" . $order["TEAM_H"] . " : " . $order["TEAM_C"] . "\n比分:" . $order["SCORE"] . "\n最新比分:" . $order["SCORE_NEW"] . "\n盘口:" . $order["ORDER_CON"] . "\n最新盘口:" . $order["ORDER_CON_NEW"] . "\n下注:" . $order["ORDER_TYPE"] . "\n赔率:" . $order["IORATIO"] . "\n最新赔率:" . $order["IORATIO_NEW"] . "\n金额:" . $order["GOLD"] . "\n开赛时间:" . $order["G_TIME"];
$bot->sendMessage($chat_id, $msg);
}
// 跟单失败
if ($notice_type == "bet_order_failed") {
if ($order["SRV_IP"] == "手机") {
$order["SRV_IP"] = "\n手机";
}
// $msg = $decryptData["order"]["TID"]."AAA";
$msg = "用户:" . $decryptData["username"] . "\n程序:" . $app . "\n类型:跟单失败\n" . "单号: " . $order["TID"] . "\n时间:" . $order["DATETIME"] . "\n会员:" . $order["NAME0"] . "\n球种:" . $order["GT"] . "\n赛段:" . $order["SESSION"] . "\n玩法:" . $order["WAGERS_TYPE"] . $order["SRV_IP"] . "\n联盟:" . $order["LEAGUE"] . "\n队伍:" . $order["TEAM_H"] . " : " . $order["TEAM_C"] . "\n比分:" . $order["SCORE"] . "\n比分:" . $order["SCORE_NEW"] . "\n盘口:" . $order["ORDER_CON"] . "\n最新盘口:" . $order["ORDER_CON_NEW"] . "\n下注:" . $order["ORDER_TYPE"] . "\n赔率:" . $order["IORATIO"] . "\n最新赔率:" . $order["IORATIO_NEW"] . "\n金额:" . $order["GOLD"] . "\n开赛时间:" . $order["G_TIME"] . "\n失败原因:" . $order["REASON"];
$bot->sendMessage($chat_id, $msg);
}
// 账户掉线
if ($notice_type == "account_dissconnected") {
$msg = "用户:" . $decryptData["username"] . "\n程序:" . $app . "\n类型:账户掉线";
$bot->sendMessage($chat_id, $msg);
}
// 账户重连
if ($notice_type == "account_reconnected") {
$msg = "用户:" . $decryptData["username"] . "\n程序:" . $app . "\n类型:账户重连";
$bot->sendMessage($chat_id, $msg);
//$bot->sendMessage($chat_id, "账户重连");
}
}
// 未到期
$result["code"] = "1";
$result["msg"] = "推送成功";
$result["data"] = mi_rc4(json_encode($result["data"]), $app["commKey"], 0);
$result["sign"] = md5($result["code"] . $result["msg"] . $result["data"]);
die(json_encode($result));
}
if ($mod == "version") {
// 获取IP
$ip = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '';
if (!ip2long($ip)) {
$ip = '未知';
}
// 应用ID
$appId = isset($_GET['appId']) ? purge($_GET['appId']) : '';
if (!$appId) {
$result["timestamp"] = time();
$result["code"] = "0";
$result["msg"] = "数据错误";
$result["data"] = "";
$result["sign"] = md5($result["code"] . $result["msg"] . $result["data"]);
die(json_encode($result));
}
// 查询应用
$app = DB::table("app")->where(["id" => $appId])->find();
if (!$app) {
$result["timestamp"] = time();
$result["code"] = "0";
$result["msg"] = "应用不存在";
$result["data"] = "";
$result["sign"] = md5($result["code"] . $result["msg"] . $result["data"]);
die(json_encode($result));
}
// 校验数据签名
$sign = isset($_GET['sign']) ? purge($_GET['sign']) : '';
if (!$sign) {
$result["code"] = "0";
$result["msg"] = "签名数据错误";
$result["data"] = "";
$result["sign"] = md5($result["code"] . $result["msg"] . $result["data"]);
die(json_encode($result));
}
$timestamp = isset($_GET['timestamp']) ? purge($_GET['timestamp']) : '';
if (!$sign) {
$result["code"] = "0";
$result["msg"] = "时间戳校验失败";
$result["data"] = "";
$result["sign"] = md5($result["code"] . $result["msg"] . $result["data"]);
die(json_encode($result));
}
$data = file_get_contents("php://input");
$md5 = md5($data . $timestamp . $app["commKey"]);
if ($md5 != $sign) {
$result["code"] = "0";
$result["msg"] = "签名校验失败";
$result["data"] = "";
$result["sign"] = md5($result["code"] . $result["msg"] . $result["data"]);
die(json_encode($result));
}
// 未到期
$result["code"] = "1";
$result["msg"] = "获取成功";
$result["data"]["version"] = $app["version"];
$result["data"] = mi_rc4(json_encode($result["data"]), $app["commKey"], 0);
$result["sign"] = md5($result["code"] . $result["msg"] . $result["data"]);
die(json_encode($result));
}
if ($mod == "heartbeat") {
// 获取IP
$ip = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '';
if (!ip2long($ip)) {
$ip = '未知';
}
// 应用ID
$appId = isset($_GET['appId']) ? purge($_GET['appId']) : '';
if (!$appId) {
$result["code"] = "0";
$result["msg"] = "数据错误";
$result["data"] = "";
$result["sign"] = md5($result["code"] . $result["msg"] . $result["data"]);
die(json_encode($result));
}
// 查询应用
$app = DB::table("app")->where(["id" => $appId])->find();
if (!$app) {
$result["code"] = "0";
$result["msg"] = "应用不存在";
$result["data"] = "";
$result["sign"] = md5($result["code"] . $result["msg"] . $result["data"]);
die(json_encode($result));
}
// 校验数据签名
$sign = isset($_GET['sign']) ? purge($_GET['sign']) : '';
if (!$sign) {
$result["code"] = "0";
$result["msg"] = "签名数据错误";
$result["data"] = "";
$result["sign"] = md5($result["code"] . $result["msg"] . $result["data"]);
die(json_encode($result));
}
$timestamp = isset($_GET['timestamp']) ? purge($_GET['timestamp']) : '';
if (!$sign) {
$result["code"] = "0";
$result["msg"] = "时间戳校验失败";
$result["data"] = "";
$result["sign"] = md5($result["code"] . $result["msg"] . $result["data"]);
die(json_encode($result));
}
$data = file_get_contents("php://input");
$md5 = md5($data . $timestamp . $app["commKey"]);
if ($md5 != $sign) {
$result["code"] = "0";
$result["msg"] = "签名校验失败";
$result["data"] = "";
$result["sign"] = md5($result["code"] . $result["msg"] . $result["data"]);
die(json_encode($result));
}
// 解密数据
$decryptData = json_decode(mi_rc4($data, $app["commKey"], 1), true);
$user = DB::table("user")->where(["username" => $decryptData["username"], "password" => $decryptData["password"]])->find();
if (!$user) {
// if($decryptData["username"] == "hh6888")
// {
// log_api("gg1");
// }
$result["code"] = "0";
$result["msg"] = "账号或密码错误";
$result["data"] = "";
$result["sign"] = md5($result["code"] . $result["msg"] . $result["data"]);
die(json_encode($result));
}
// 计时收费
if ($app["billingType"] == "1") {
// if($decryptData["username"] == "hh6888")
// {
// log_api("gg2");
// }
// 判断到期
if (strtotime($user["expireTime"]) - time() < 0) {
// if($decryptData["username"] == "hh6888")
// {
// log_api("gg3");
// }
$result["code"] = "0";
$result["msg"] = "用户已到期";
$result["data"] = "";
$result["sign"] = md5($result["code"] . $result["msg"] . $result["data"]);
die(json_encode($result));
}
// 绑定机器
if ($app["bindType"] == "1") {
if ($decryptData["hardwareCode"] != $user["hardwareCode"]) {
$result["code"] = "0";
$result["msg"] = "非绑定机器";
$result["data"] = "";
$result["sign"] = md5($result["code"] . $result["msg"] . $result["data"]);
die(json_encode($result));
}
}
// 绑定IP
if ($app["bindType"] == "2") {
if ($decryptData["ip"] != $user["ip"]) {
$result["code"] = "0";
$result["msg"] = "非绑定IP";
$result["data"] = "";
$result["sign"] = md5($result["code"] . $result["msg"] . $result["data"]);
die(json_encode($result));
}
}
}
// 判断是否存活
if (time() - strtotime($user["heartbeatTime"]) > $app["heartbeatInterval"]) {
if($decryptData["username"] == "hh6888")
{
log_api("心跳失败 原始时间".strtotime($user["heartbeatTime"])."当前".time()."周期".$app["heartbeatInterval"]);
}
$result["code"] = "0";
$result["msg"] = "心跳超时";
$result["data"]["expireTime"] = $user["expireTime"];
$result["data"] = mi_rc4(json_encode($result["data"]), $app["commKey"], 0);
$result["sign"] = md5($result["code"] . $result["msg"] . $result["data"]);
die(json_encode($result));
}
if($decryptData["username"] == "hh6888")
{
log_api("ssss");
}
// 更新心跳时间
$currentTime = date("Y-m-d H:i:s", time());
DB::table("user")->where(["username" => $decryptData["username"], "password" => $decryptData["password"]])->update(['heartbeatTime' => $currentTime]);
$result["code"] = "1";
$result["msg"] = "心跳成功";
$result["data"]["expireTime"] = $user["expireTime"];
$result["data"]["heartbeatTime"] = $currentTime; // 添加心跳时间到返回数据
$result["data"] = mi_rc4(json_encode($result["data"]), $app["commKey"], 0);
$result["sign"] = md5($result["code"] . $result["msg"] . $result["data"]);
die(json_encode($result));
}
if ($mod == "login") {
// 获取IP
$ip = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '';
if (!ip2long($ip)) {
$ip = '未知';
}
// 应用ID
$appId = isset($_GET['appId']) ? purge($_GET['appId']) : '';
if (!$appId) {
$result["timestamp"] = time();
$result["code"] = "0";
$result["msg"] = "数据错误";
$result["data"] = "";
$result["sign"] = md5($result["code"] . $result["msg"] . $result["data"]);
die(json_encode($result));
}
// 查询应用
$app = DB::table("app")->where(["id" => $appId])->find();
if (!$app) {
$result["timestamp"] = time();
$result["code"] = "0";
$result["msg"] = "应用不存在";
$result["data"] = "";
$result["sign"] = md5($result["code"] . $result["msg"] . $result["data"]);
die(json_encode($result));
}
// 校验数据签名
$sign = isset($_GET['sign']) ? purge($_GET['sign']) : '';
if (!$sign) {
$result["code"] = "0";
$result["msg"] = "签名数据错误";
$result["data"] = "";
$result["sign"] = md5($result["code"] . $result["msg"] . $result["data"]);
die(json_encode($result));
}
$timestamp = isset($_GET['timestamp']) ? purge($_GET['timestamp']) : '';
if (!$sign) {
$result["code"] = "0";
$result["msg"] = "时间戳校验失败";
$result["data"] = "";
$result["sign"] = md5($result["code"] . $result["msg"] . $result["data"]);
die(json_encode($result));
}
$data = file_get_contents("php://input");
$md5 = md5($data . $timestamp . $app["commKey"]);
if ($md5 != $sign) {
$result["code"] = "0";
$result["msg"] = "签名校验失败";
$result["data"] = "";
$result["sign"] = md5($result["code"] . $result["msg"] . $result["data"]);
die(json_encode($result));
}
// 解密数据
$decryptData = json_decode(mi_rc4($data, $app["commKey"], 1), true);
$user = DB::table("user")->where(["username" => $decryptData["username"], "password" => $decryptData["password"]])->find();
if (!$user) {
$result["code"] = "0";
$result["msg"] = "账号或密码错误";
$result["data"] = "";
$result["sign"] = md5($result["code"] . $result["msg"] . $result["data"]);
die(json_encode($result));
}
// 计时收费
if ($app["billingType"] == "1") {
// 判断到期
if (strtotime($user["expireTime"]) - time() < 0) {
$result["code"] = "0";
$result["msg"] = "用户已到期";
$result["data"] = "";
$result["sign"] = md5($result["code"] . $result["msg"] . $result["data"]);
die(json_encode($result));
}
// 绑定机器
if ($app["bindType"] == "1") {
// 只有当用户已经绑定了机器码时,才进行验证
if ($user["hardwareCode"] && $user["hardwareCode"] != '') {
if ($decryptData["hardwareCode"] != $user["hardwareCode"]) {
// 禁止解绑
if ($app["unbindType"] == "0") {
$result["code"] = "0";
$result["msg"] = "非绑定机器,禁止解绑";
$result["data"] = "";
$result["sign"] = md5($result["code"] . $result["msg"] . $result["data"]);
die(json_encode($result));
}
// 免费解绑
if ($app["unbindType"] == "1") {
// 更新机器码
DB::table("user")->where(["username" => $decryptData["username"], "password" => $decryptData["password"]])->update(['hardwareCode' => $decryptData["hardwareCode"]]);
}
// 收费解绑
if ($app["unbindType"] == "2") {
// 判断余额
if (strtotime($user["expireTime"]) - $app["unbindDeduct"] < 0) {
$result["code"] = "0";
$result["msg"] = "解绑余额不足";
$result["data"] = "";
$result["sign"] = md5($result["code"] . $result["msg"] . $result["data"]);
die(json_encode($result));
}
// 收费
DB::table("user")->where(["username" => $decryptData["username"], "password" => $decryptData["password"]])->update(['expireTime' => date("Y-m-d H:i:s", strtotime($user["expireTime"]) - $app["unbindDeduct"])]);
// 更新机器码
DB::table("user")->where(["username" => $decryptData["username"], "password" => $decryptData["password"]])->update(['hardwareCode' => $decryptData["hardwareCode"]]);
}
}
} else {
// 用户没有绑定机器码,直接绑定当前机器码
DB::table("user")->where(["username" => $decryptData["username"], "password" => $decryptData["password"]])->update(['hardwareCode' => $decryptData["hardwareCode"]]);
}
}
// 绑定IP
if ($app["bindType"] == "2") {
// 只有当用户已经绑定了IP时,才进行验证
if ($user["ip"] && $user["ip"] != '') {
if ($decryptData["ip"] != $user["ip"]) {
// 禁止解绑
if ($app["unbindType"] == "0") {
$result["code"] = "0";
$result["msg"] = "非绑定IP,禁止解绑";
$result["data"] = "";
$result["sign"] = md5($result["code"] . $result["msg"] . $result["data"]);
die(json_encode($result));
}
// 免费解绑
if ($app["unbindType"] == "1") {
DB::table('user')->where(["username" => $decryptData["username"], "password" => $decryptData["password"]])->update(['ip' => $ip]);
}
// 收费解绑
if ($app["unbindType"] == "2") {
// 判断余额
if (strtotime($user["expireTime"]) - $app["unbindDeduct"] < 0) {
$result["code"] = "0";
$result["msg"] = "解绑余额不足";
$result["data"] = "";
$result["sign"] = md5($result["code"] . $result["msg"] . $result["data"]);
die(json_encode($result));
}
// 收费
DB::table("user")->where(["username" => $decryptData["username"], "password" => $decryptData["password"]])->update(['expireTime' => date("Y-m-d H:i:s", strtotime($user["expireTime"]) - $app["unbindDeduct"])]);
// 更新ip
DB::table('user')->where(["username" => $decryptData["username"], "password" => $decryptData["password"]])->update(['ip' => $ip]);
}
}
} else {
// 用户没有绑定IP,直接绑定当前IP
DB::table('user')->where(["username" => $decryptData["username"], "password" => $decryptData["password"]])->update(['ip' => $ip]);
}
}
}
// 更新登录时间
$currentTime = date("Y-m-d H:i:s", time());
DB::table("user")->where(["username" => $decryptData["username"], "password" => $decryptData["password"]])->update(['loginTime' => $currentTime]);
// 更新心跳时间
DB::table("user")->where(["username" => $decryptData["username"], "password" => $decryptData["password"]])->update(['heartbeatTime' => $currentTime]);
// 更新IP地址
DB::table('user')->where(["username" => $decryptData["username"], "password" => $decryptData["password"]])->update(['ip' => $ip]);
// 未到期
$result["code"] = "1";
$result["msg"] = "登录成功";
$result["data"]["expireTime"] = $user["expireTime"];
$result["data"] = mi_rc4(json_encode($result["data"]), $app["commKey"], 0);
$result["sign"] = md5($result["code"] . $result["msg"] . $result["data"]);
die(json_encode($result));
}
function decode($str, $pwd)
{
$TempUndata = hexToStrBytes($str);
$count = count($TempUndata) - 1;
$xor = getRigthBytes($TempUndata, 1);
$UnHashData = ByteXor($TempUndata, $xor);
$RValue = getMidBytes($UnHashData, $count - 2, 3);
$md5 = bytesToMd5($RValue, $xor, integerToBytes(crc32($pwd)));
$last = bytesToShort(getMidBytes($UnHashData, $count - 4, 2), 0);
$HashData = getLeftBytes($UnHashData, $count - 5);
$len = count($HashData);
$n = mb_strlen($md5);
$error = 0;
$offset = 1;
$_last = $last;
foreach ($HashData as $key => $value) {
if ($len < $_last) {
$error = 1;
break;
}
if ($offset > $n) {
$offset = 1;
}
if ($last - $offset < 0) {
$last = $n;
$offset = 1;
}
$Location = hexdec(mb_substr($md5, $last - $offset, 1)) + 3;
$offset++;
if ($Location > $len) {
continue;
}
// 问题修复 +1 解决
LocationExchange($len - $len + $key, $Location - 1, $HashData);
}
$tCrc32 = bytesToInteger(getRigthBytes($HashData, 4));
$HashData = getLeftBytes($HashData, $len - 4);
$nCrc32 = crc32(toStr($HashData));
//调试输出("解密",$tCrc32,toStr($HashData),$nCrc32);
if ($error == 1) {
return '';
}
if ($nCrc32 == $tCrc32) {
return toStr($HashData);
}
return '';
}
function encode($string, $pwd)
{
$crc32 = integerToBytes(crc32($string));// 正确
$Tempdata = array_merge_recursive(getBytes($string), $crc32);// 正确
$Xor = getBytes(chr(mt_rand(1, 255)));// 正确
$aaaa = mt_rand(1, 255);
$bbbb = mt_rand(1, 255);
$cccc = mt_rand(1, 255);
$RValue = [chr($aaaa), chr($bbbb), chr($cccc)]; // 修复成功 如果使用 getByTes 那么可能会识别成两个
$md5 = bytesToMd5($RValue, $Xor, integerToBytes(crc32($pwd)));// 正确
$n = mb_strlen($md5);// 正确
$len = count($Tempdata);// 正确
$offset = 1;
foreach ($Tempdata as $key => $value) {
if ($offset > $n) {
$offset = 1;
}
$Location = hexdec(mb_substr($md5, $offset - 1, 1)) + 3;
$offset++;
if ($Location > $len) {
continue;
}
LocationExchange($len - $key - 1, $Location - 1, $Tempdata);
}
$Tempdata = array_merge_recursive($Tempdata, shortToBytes($offset - 1), $RValue);
return bytesToHex(array_merge_recursive(ByteXor($Tempdata, $Xor), $Xor));
}
function LocationExchange($LocalA, $LocalB, &$ByteData)
{
$TempA = $ByteData[$LocalA];
$TempB = $ByteData[$LocalB];
$ByteData[$LocalA] = $TempB;
$ByteData[$LocalB] = $TempA;
}
function 调试输出()//简易调试输出
{
$args = func_get_args();
foreach ($args as $value) {
if (is_array($value)) {
print_r('字节集:' . count($value) . '{' . join($value, ',') . '}');
echo "\t<br/>\r\n";
} else {
print_r($value . "\t");
}
}
echo "\t<br/>\r\n";
}
function bytesToMd5()//字节集到md5
{
$args = func_get_args();
$bytes = [];
foreach ($args as $value) {
if (is_array($value)) {
$bytes = array_merge_recursive($bytes, $value);
}
}
$md5 = md5(toStr($bytes));
$md5 = strtoupper($md5);
return $md5;
}
function bytesToInteger($bytes, $position = 0)//取整数
{
$val = 0;
$val = @$bytes[$position + 3] & 0xff;
$val <<= 8;
$val |= @$bytes[$position + 2] & 0xff;
$val <<= 8;
$val |= $bytes[$position + 1] & 0xff;
$val <<= 8;
$val |= $bytes[$position] & 0xff;
return $val;
}
function bytesToShort($bytes, $position)//取短整数
{
$val = 0;
$val = $bytes[$position + 1] & 0xFF;
$val = $val << 8;
$val |= $bytes[$position] & 0xFF;
return $val;
}
function getMidBytes($bytes, $start, $num)//取字节集中间
{
$mBytes = [];
for ($i = 0; $i < $num; $i++) {
$mBytes[] = $bytes[$start - 1 + $i];
}
return $mBytes;
}
function getLeftBytes($bytes, $num)//取字节集左边
{
$lBytes = [];
for ($i = 0; $i < $num; $i++) {
$lBytes[] = $bytes[$i];
}
return $lBytes;
}
function getRigthBytes($bytes, $num)//取字节集右边
{
$count = count($bytes) - $num;
$rBytes = [];
for ($i = 0; $i < $num; $i++) {
$rBytes[] = $bytes[$count + $i];
}
return $rBytes;
}
function hexToStrBytes($hex)//十六进制到字节集
{
$bytes = array();
for ($i = 0; $i < mb_strlen($hex) - 1; $i += 2) {
$bytes[] = ord(chr(hexdec($hex[$i] . $hex[$i + 1])));
}
return $bytes;
}
function ByteXor($bytes, $xor)
{
$_bytes = [];
foreach ($bytes as $val) {
$_bytes[] = $val ^ $xor[0];
}
return $_bytes;
}
function bytesToHex($bytes)//字节集转十六进制
{
$hex = "";
foreach ($bytes as $value) {
$hex .= sprintf("%02X", $value);
}
return $hex;
}
function strToHex($string)//字符串转十六进制
{
$hex = "";
for ($i = 0; $i < strlen($string); $i++)
$hex .= dechex(ord($string[$i]));
$hex = strtoupper($hex);
return $hex;
}
function hexToStr($hex)//十六进制转字符串
{
$string = "";
for ($i = 0; $i < strlen($hex) - 1; $i += 2)
$string .= chr(hexdec($hex[$i] . $hex[$i + 1]));
return $string;
}
function toStr($bytes)//到文本
{
$str = '';
foreach ($bytes as $ch) {
$str .= chr($ch);
}
return $str;
}
function getBytes($string)//到字节集
{
$bytes = array();
for ($i = 0; $i < mb_strlen($string); $i++) {
$bytes[] = ord($string[$i]);
}
return $bytes;
}
function integerToBytes($val)//整数到字节集
{
$byt = array();
$byt[0] = ($val & 0xff);
$byt[1] = ($val >> 8 & 0xff);
$byt[2] = ($val >> 16 & 0xff);
$byt[3] = ($val >> 24 & 0xff);
return $byt;
}
function shortToBytes($val)//短整数到字节集
{
$byt = array();
$byt[0] = ($val & 0xff);
$byt[1] = ($val >> 8 & 0xff);
return $byt;
}
?>