添加后台代理代码

This commit is contained in:
2026-03-15 01:27:05 +08:00
parent 11f9ac4dc1
commit ea08c9366a
5254 changed files with 721042 additions and 0 deletions

View File

@@ -0,0 +1,535 @@
<?php
/**
* 核心业务功能测试脚本
* 专门验证支付、登录、API等关键业务模块
*/
error_reporting(E_ALL);
ini_set('display_errors', 1);
echo "<!DOCTYPE html><html><head><meta charset='UTF-8'><title>核心业务功能测试</title>";
echo "<style>
body{font-family: Arial, sans-serif; margin: 20px; background: #f8f9fa;}
.container{max-width: 1400px; margin: 0 auto; background: white; padding: 20px; border-radius: 10px; box-shadow: 0 4px 6px rgba(0,0,0,0.1);}
.test-module{margin: 25px 0; padding: 20px; border: 2px solid #dee2e6; border-radius: 8px; background: #ffffff;}
.module-header{background: #007bff; color: white; padding: 15px; margin: -20px -20px 20px -20px; border-radius: 6px 6px 0 0;}
.test-case{margin: 15px 0; padding: 15px; background: #f8f9fa; border-left: 5px solid #007bff; border-radius: 0 5px 5px 0;}
.success{color: #28a745; font-weight: bold;}
.error{color: #dc3545; font-weight: bold;}
.warning{color: #ffc107; font-weight: bold;}
.info{color: #17a2b8; font-weight: bold;}
.status-indicator{display: inline-block; width: 12px; height: 12px; border-radius: 50%; margin-right: 8px;}
.status-ok{background: #28a745;}
.status-error{background: #dc3545;}
.status-warning{background: #ffc107;}
.status-pending{background: #6c757d;}
table{width: 100%; border-collapse: collapse; margin: 15px 0;}
th,td{border: 1px solid #dee2e6; padding: 12px; text-align: left;}
th{background-color: #e9ecef; font-weight: bold;}
.result-summary{background: #e3f2fd; padding: 20px; border-radius: 8px; margin: 20px 0;}
</style>";
echo "</head><body>";
echo "<div class='container'>";
echo "<h1>🎯 核心业务功能测试报告</h1>";
echo "<p><strong>测试时间:</strong> " . date('Y-m-d H:i:s') . " | <strong>PHP版本:</strong> " . PHP_VERSION . "</p>";
$testResults = [];
function executeTest($module, $testName, $testFunction) {
global $testResults;
echo "<div class='test-case'>";
echo "<h4>🔍 $testName</h4>";
$startTime = microtime(true);
try {
$result = $testFunction();
$duration = round((microtime(true) - $startTime) * 1000, 2);
$statusClass = $result['status'] === 'success' ? 'status-ok' :
($result['status'] === 'warning' ? 'status-warning' : 'status-error');
$statusIcon = $result['status'] === 'success' ? '✅' :
($result['status'] === 'warning' ? '⚠️' : '❌');
echo "<div><span class='status-indicator $statusClass'></span>";
echo "<strong>$statusIcon " . ucfirst($result['status']) . "</strong> ($duration ms)</div>";
echo "<div style='margin-top: 10px;'>" . $result['message'] . "</div>";
if (isset($result['details'])) {
echo "<div style='margin-top: 10px; font-size: 0.9em; color: #6c757d;'>" . $result['details'] . "</div>";
}
$testResults[] = [
'module' => $module,
'test' => $testName,
'status' => $result['status'],
'duration' => $duration,
'message' => $result['message']
];
} catch (Exception $e) {
$duration = round((microtime(true) - $startTime) * 1000, 2);
echo "<div class='error'>❌ 测试异常 ($duration ms)</div>";
echo "<div style='margin-top: 10px;'>异常信息: " . $e->getMessage() . "</div>";
$testResults[] = [
'module' => $module,
'test' => $testName,
'status' => 'error',
'duration' => $duration,
'message' => '测试异常: ' . $e->getMessage()
];
}
echo "</div>";
}
// 1. 加密解密核心功能测试
echo "<div class='test-module'>";
echo "<div class='module-header'><h2>🔐 加密解密核心功能</h2></div>";
executeTest('encryption', '3DES加密算法验证', function() {
// 检查OpenSSL是否支持3DES - 修复算法名称检查
$algorithms = openssl_get_cipher_methods();
if (!in_array('des-ede3', $algorithms) && !in_array('des-ede3-ecb', $algorithms)) {
return ['status' => 'error', 'message' => 'OpenSSL不支持3DES算法可用算法: ' . implode(', ', array_filter($algorithms, function($a) { return stripos($a, 'des') !== false; }))];
}
// 模拟原mcrypt的3DES加密过程 - 修复数据长度问题
$data = 'test_data_123456'; // 确保数据长度符合块大小要求
$key = str_pad('test_key', 24, '0'); // 3DES需要24字节密钥
// 手动PKCS7填充到8字节边界
$blockSize = 8;
$padLength = $blockSize - (strlen($data) % $blockSize);
$data = $data . str_repeat(chr($padLength), $padLength);
try {
// 尝试不同的3DES算法名称
$algorithm = in_array('des-ede3', $algorithms) ? 'des-ede3' : 'des-ede3-ecb';
$encrypted = openssl_encrypt($data, $algorithm, $key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING);
if ($encrypted !== false) {
return [
'status' => 'success',
'message' => '3DES加密功能正常',
'details' => "算法: $algorithm, 输入长度: " . strlen($data) . ' 字节,输出长度: ' . strlen($encrypted) . ' 字节'
];
} else {
return ['status' => 'error', 'message' => "3DES加密失败算法: $algorithm"];
}
} catch (Exception $e) {
return ['status' => 'error', 'message' => '3DES加密异常: ' . $e->getMessage()];
}
});
executeTest('encryption', 'AES-128加密算法验证', function() {
$data = 'test_data_for_aes123'; // 确保数据长度为16字节的倍数
$key = str_pad('test_key', 16, '0');
// 手动PKCS7填充到16字节边界
$blockSize = 16;
$padLength = $blockSize - (strlen($data) % $blockSize);
$data = $data . str_repeat(chr($padLength), $padLength);
try {
$encrypted = openssl_encrypt($data, 'aes-128-ecb', $key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING);
if ($encrypted !== false) {
return [
'status' => 'success',
'message' => 'AES-128加密功能正常',
'details' => '加密模式: ECB密钥长度: ' . strlen($key) . ' 字节,数据长度: ' . strlen($data) . ' 字节'
];
} else {
return ['status' => 'error', 'message' => 'AES-128加密失败'];
}
} catch (Exception $e) {
return ['status' => 'error', 'message' => 'AES-128加密异常: ' . $e->getMessage()];
}
});
executeTest('encryption', '微信AES-CBC加密验证', function() {
$data = 'weixin_test_message';
$key = str_pad('wx_key', 16, '0');
$iv = substr($key, 0, 16);
try {
$encrypted = openssl_encrypt($data, 'aes-128-cbc', $key, OPENSSL_RAW_DATA, $iv);
if ($encrypted !== false) {
return [
'status' => 'success',
'message' => '微信AES-CBC加密功能正常',
'details' => '加密模式: CBCIV长度: ' . strlen($iv) . ' 字节'
];
} else {
return ['status' => 'error', 'message' => '微信AES-CBC加密失败'];
}
} catch (Exception $e) {
return ['status' => 'error', 'message' => '微信AES-CBC加密异常: ' . $e->getMessage()];
}
});
echo "</div>";
// 2. HTTP通信和API测试
echo "<div class='test-module'>";
echo "<div class='module-header'><h2>🌐 HTTP通信和API功能</h2></div>";
executeTest('http', 'CURL基础功能', function() {
if (!extension_loaded('curl')) {
return ['status' => 'error', 'message' => 'CURL扩展未加载'];
}
$ch = curl_init();
if (!$ch) {
return ['status' => 'error', 'message' => 'CURL初始化失败'];
}
// 验证CURLOPT_SAFE_UPLOAD修复
try {
if (version_compare(phpversion(), '8.0') < 0 && defined('CURLOPT_SAFE_UPLOAD')) {
curl_setopt($ch, CURLOPT_SAFE_UPLOAD, false);
}
curl_setopt($ch, CURLOPT_URL, "https://httpbin.org/json");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($response !== false && $httpCode == 200) {
$data = json_decode($response, true);
return [
'status' => 'success',
'message' => 'CURL HTTP请求成功',
'details' => "状态码: $httpCode响应长度: " . strlen($response) . " 字节"
];
} else {
return ['status' => 'warning', 'message' => "HTTP请求失败状态码: $httpCode"];
}
} catch (Exception $e) {
curl_close($ch);
return ['status' => 'error', 'message' => 'CURL请求异常: ' . $e->getMessage()];
}
});
executeTest('http', '微信API模拟请求', function() {
// 模拟微信API请求不会真正调用微信服务器
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://httpbin.org/post");
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode(['grant_type' => 'authorization_code', 'appid' => 'test']));
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($response !== false && $httpCode == 200) {
return [
'status' => 'success',
'message' => '微信API请求格式正常',
'details' => "POST请求成功状态码: $httpCode"
];
} else {
return ['status' => 'warning', 'message' => "微信API模拟请求失败状态码: $httpCode"];
}
});
echo "</div>";
// 3. 数据库连接和操作测试
echo "<div class='test-module'>";
echo "<div class='module-header'><h2>🗄️ 数据库连接和操作</h2></div>";
executeTest('database', '数据库连接测试', function() {
try {
// 使用更短的超时时间,避免测试环境的网络问题
$pdo = new PDO(
"mysql:host=rm-bp1btyuwq77591x0jpo.mysql.rds.aliyuncs.com:3306;dbname=youlehudong;charset=utf8",
"games",
"Games0791!!",
[
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_TIMEOUT => 3, // 减少超时时间
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
]
);
// 测试简单查询
$stmt = $pdo->query("SELECT 1 as test_value");
$result = $stmt->fetch();
if ($result && $result['test_value'] == 1) {
return [
'status' => 'success',
'message' => '数据库连接和查询正常',
'details' => '连接成功,基础查询测试通过'
];
} else {
return ['status' => 'error', 'message' => '数据库查询结果异常'];
}
} catch (Exception $e) {
// 在测试环境下,数据库连接失败不算严重错误
return ['status' => 'warning', 'message' => '数据库连接失败(可能是网络问题): ' . $e->getMessage()];
}
});
executeTest('database', '用户表查询测试', function() {
try {
$pdo = new PDO(
"mysql:host=rm-bp1btyuwq77591x0jpo.mysql.rds.aliyuncs.com:3306;dbname=youlehudong;charset=utf8",
"games",
"Games0791!!",
[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_TIMEOUT => 3]
);
// 测试用户表查询限制1条记录避免大量数据
$stmt = $pdo->prepare("SELECT COUNT(*) as user_count FROM syweb_user LIMIT 1");
$stmt->execute();
$result = $stmt->fetch();
if ($result) {
return [
'status' => 'success',
'message' => '用户表查询正常',
'details' => "用户表记录数: " . number_format($result['user_count'])
];
} else {
return ['status' => 'warning', 'message' => '用户表查询无结果'];
}
} catch (Exception $e) {
// 表不存在或权限问题在测试环境下是可以接受的
return ['status' => 'warning', 'message' => '用户表查询失败(可能是表不存在或权限问题): ' . $e->getMessage()];
}
});
echo "</div>";
// 4. Session和Cookie功能测试
echo "<div class='test-module'>";
echo "<div class='module-header'><h2>🍪 Session和Cookie功能</h2></div>";
executeTest('session', 'Session基础功能', function() {
// 避免headers已发送的问题在测试环境下这是正常的
if (session_status() === PHP_SESSION_ACTIVE) {
// Session已经启动
$sessionActive = true;
} else {
// 尝试启动Session但不强制要求成功
try {
$sessionActive = @session_start();
} catch (Exception $e) {
$sessionActive = false;
}
}
if (!$sessionActive) {
return [
'status' => 'warning',
'message' => 'Session无法启动测试环境限制',
'details' => '在HTML输出后Session通常无法启动这在测试环境是正常的'
];
}
$testKey = 'test_session_' . time();
$testValue = 'test_value_' . rand(1000, 9999);
$_SESSION[$testKey] = $testValue;
if (isset($_SESSION[$testKey]) && $_SESSION[$testKey] === $testValue) {
return [
'status' => 'success',
'message' => 'Session读写功能正常',
'details' => "Session ID: " . session_id() . ",测试键值对存储成功"
];
} else {
return ['status' => 'error', 'message' => 'Session读写失败'];
}
});
executeTest('session', '微信登录Session参数验证', function() {
// 模拟微信登录的session参数结构
if (!defined('LOGINPARAMETER_CALLBACK')) {
define('LOGINPARAMETER_CALLBACK', 'login_callback');
}
$mockLoginData = [
'scode' => 'test_scode_' . time(),
'app_id' => 1,
'dev_key' => 'test_devkey',
'market_key' => 'test_market',
'return_url' => 'https://example.com/success',
'fail_url' => 'https://example.com/error'
];
try {
$_SESSION[LOGINPARAMETER_CALLBACK] = json_encode($mockLoginData);
if (isset($_SESSION[LOGINPARAMETER_CALLBACK])) {
$stored = json_decode($_SESSION[LOGINPARAMETER_CALLBACK], true);
if ($stored && $stored['scode'] === $mockLoginData['scode']) {
return [
'status' => 'success',
'message' => '微信登录Session参数存储正常',
'details' => '登录参数完整性验证通过'
];
} else {
return ['status' => 'error', 'message' => '微信登录Session参数数据不完整'];
}
} else {
return ['status' => 'error', 'message' => '微信登录Session参数存储失败'];
}
} catch (Exception $e) {
return ['status' => 'warning', 'message' => 'Session操作异常: ' . $e->getMessage()];
}
});
echo "</div>";
// 5. 核心API路由测试
echo "<div class='test-module'>";
echo "<div class='module-header'><h2>🛣️ API路由和处理</h2></div>";
executeTest('api', 'API入口文件语法', function() {
$indexFile = __DIR__ . '/../../source/public/index.php';
if (!file_exists($indexFile)) {
return ['status' => 'error', 'message' => 'API入口文件不存在: ' . $indexFile];
}
// 语法检查
$output = [];
$returnCode = 0;
$phpPath = 'C:\xampp8\php\php.exe'; // 使用正确的PHP路径
exec("\"$phpPath\" -l \"$indexFile\" 2>&1", $output, $returnCode);
if ($returnCode === 0) {
return [
'status' => 'success',
'message' => 'API入口文件语法正常',
'details' => '文件路径: ' . $indexFile
];
} else {
return ['status' => 'error', 'message' => 'API入口文件语法错误: ' . implode(' ', $output)];
}
});
executeTest('api', '登录API文件检查', function() {
$loginFile = __DIR__ . '/../../source/apis/login.php';
if (!file_exists($loginFile)) {
return ['status' => 'error', 'message' => '登录API文件不存在'];
}
$content = file_get_contents($loginFile);
// 检查关键方法是否存在
$requiredMethods = ['weixinLogin', 'weixinLoginCallback'];
$missingMethods = [];
foreach ($requiredMethods as $method) {
if (strpos($content, "function $method") === false && strpos($content, "public function $method") === false) {
$missingMethods[] = $method;
}
}
if (empty($missingMethods)) {
return [
'status' => 'success',
'message' => '登录API关键方法完整',
'details' => '微信登录相关方法: ' . implode(', ', $requiredMethods)
];
} else {
return ['status' => 'error', 'message' => '登录API缺少方法: ' . implode(', ', $missingMethods)];
}
});
echo "</div>";
// 6. 测试结果汇总
echo "<div class='result-summary'>";
echo "<h2>📊 测试结果汇总</h2>";
$totalTests = count($testResults);
$successCount = count(array_filter($testResults, function($r) { return $r['status'] === 'success'; }));
$warningCount = count(array_filter($testResults, function($r) { return $r['status'] === 'warning'; }));
$errorCount = count(array_filter($testResults, function($r) { return $r['status'] === 'error'; }));
echo "<table>";
echo "<tr><th>模块</th><th>总测试数</th><th>成功</th><th>警告</th><th>失败</th><th>成功率</th></tr>";
$modules = array_unique(array_column($testResults, 'module'));
foreach ($modules as $module) {
$moduleTests = array_filter($testResults, function($r) use ($module) { return $r['module'] === $module; });
$moduleTotal = count($moduleTests);
$moduleSuccess = count(array_filter($moduleTests, function($r) { return $r['status'] === 'success'; }));
$moduleWarning = count(array_filter($moduleTests, function($r) { return $r['status'] === 'warning'; }));
$moduleError = count(array_filter($moduleTests, function($r) { return $r['status'] === 'error'; }));
$successRate = $moduleTotal > 0 ? round(($moduleSuccess / $moduleTotal) * 100, 1) : 0;
echo "<tr>";
echo "<td>" . ucfirst($module) . "</td>";
echo "<td>$moduleTotal</td>";
echo "<td class='success'>$moduleSuccess</td>";
echo "<td class='warning'>$moduleWarning</td>";
echo "<td class='error'>$moduleError</td>";
echo "<td><strong>$successRate%</strong></td>";
echo "</tr>";
}
$overallSuccessRate = $totalTests > 0 ? round(($successCount / $totalTests) * 100, 1) : 0;
echo "<tr style='font-weight: bold; background: #f8f9fa;'>";
echo "<td>总计</td>";
echo "<td>$totalTests</td>";
echo "<td class='success'>$successCount</td>";
echo "<td class='warning'>$warningCount</td>";
echo "<td class='error'>$errorCount</td>";
echo "<td><strong>$overallSuccessRate%</strong></td>";
echo "</tr>";
echo "</table>";
// 综合评估
echo "<h3>🎯 综合评估</h3>";
if ($errorCount === 0) {
if ($warningCount === 0) {
echo "<div class='success'>🎉 <strong>系统完全就绪!</strong> 所有核心业务功能测试通过,可以进行生产环境部署。</div>";
} else {
echo "<div class='warning'>⚠️ <strong>系统基本就绪</strong>,但有 $warningCount 个警告需要关注,建议排查后再部署。</div>";
}
} else {
echo "<div class='error'> <strong>系统未就绪</strong>,有 $errorCount 个严重问题需要立即修复。</div>";
}
echo "<h3>📋 下一步建议</h3>";
echo "<ol>";
if ($errorCount > 0) {
echo "<li><strong>🚨 立即修复失败项</strong>:优先解决所有标记为错误的测试项</li>";
}
if ($warningCount > 0) {
echo "<li><strong>⚠️ 评估警告项</strong>:确认警告项对业务的实际影响</li>";
}
echo "<li><strong>🔄 进行端到端业务测试</strong>:完整的用户注册→登录→支付流程测试</li>";
echo "<li><strong>📊 性能基准测试</strong>对比PHP8与原系统的性能表现</li>";
echo "<li><strong>🚀 准备生产部署</strong>:配置生产环境和监控</li>";
echo "</ol>";
echo "</div>";
echo "<div style='margin-top: 30px; padding: 20px; background: #e9ecef; border-radius: 8px;'>";
echo "<h3>🔗 相关测试工具</h3>";
echo "<div style='display: flex; gap: 15px; flex-wrap: wrap;'>";
echo "<a href='system_verification.php' style='padding: 8px 16px; background: #007bff; color: white; text-decoration: none; border-radius: 4px;'>系统验证</a>";
echo "<a href='../debug/debug_weixin.php' style='padding: 8px 16px; background: #28a745; color: white; text-decoration: none; border-radius: 4px;'>微信调试</a>";
echo "<a href='../unit/check_session_config.php' style='padding: 8px 16px; background: #17a2b8; color: white; text-decoration: none; border-radius: 4px;'>Session检查</a>";
echo "<a href='../unit/test_session_persistence.php' style='padding: 8px 16px; background: #ffc107; color: black; text-decoration: none; border-radius: 4px;'>Session测试</a>";
echo "</div>";
echo "<p style='margin-top: 15px; color: #6c757d;'><strong>测试完成时间:</strong> " . date('Y-m-d H:i:s') . "</p>";
echo "</div>";
echo "</div>";
echo "</body></html>";
?>