";
echo "
🎯 核心业务功能测试报告
";
echo "
测试时间: " . date('Y-m-d H:i:s') . " | PHP版本: " . PHP_VERSION . "
";
$testResults = [];
function executeTest($module, $testName, $testFunction) {
global $testResults;
echo "
";
echo "
🔍 $testName
";
$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 "
";
echo "$statusIcon " . ucfirst($result['status']) . " ($duration ms)
";
echo "
" . $result['message'] . "
";
if (isset($result['details'])) {
echo "
" . $result['details'] . "
";
}
$testResults[] = [
'module' => $module,
'test' => $testName,
'status' => $result['status'],
'duration' => $duration,
'message' => $result['message']
];
} catch (Exception $e) {
$duration = round((microtime(true) - $startTime) * 1000, 2);
echo "
❌ 测试异常 ($duration ms)
";
echo "
异常信息: " . $e->getMessage() . "
";
$testResults[] = [
'module' => $module,
'test' => $testName,
'status' => 'error',
'duration' => $duration,
'message' => '测试异常: ' . $e->getMessage()
];
}
echo "
";
}
// 1. 加密解密核心功能测试
echo "
";
echo "";
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' => '加密模式: CBC,IV长度: ' . strlen($iv) . ' 字节'
];
} else {
return ['status' => 'error', 'message' => '微信AES-CBC加密失败'];
}
} catch (Exception $e) {
return ['status' => 'error', 'message' => '微信AES-CBC加密异常: ' . $e->getMessage()];
}
});
echo "
";
// 2. HTTP通信和API测试
echo "
";
echo "";
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 "
";
// 3. 数据库连接和操作测试
echo "
";
echo "";
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 "
";
// 4. Session和Cookie功能测试
echo "
";
echo "";
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 "
";
// 5. 核心API路由测试
echo "
";
echo "";
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 "
";
// 6. 测试结果汇总
echo "
";
echo "
📊 测试结果汇总
";
$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 "
";
echo "| 模块 | 总测试数 | 成功 | 警告 | 失败 | 成功率 |
";
$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 "";
echo "| " . ucfirst($module) . " | ";
echo "$moduleTotal | ";
echo "$moduleSuccess | ";
echo "$moduleWarning | ";
echo "$moduleError | ";
echo "$successRate% | ";
echo "
";
}
$overallSuccessRate = $totalTests > 0 ? round(($successCount / $totalTests) * 100, 1) : 0;
echo "";
echo "| 总计 | ";
echo "$totalTests | ";
echo "$successCount | ";
echo "$warningCount | ";
echo "$errorCount | ";
echo "$overallSuccessRate% | ";
echo "
";
echo "
";
// 综合评估
echo "
🎯 综合评估
";
if ($errorCount === 0) {
if ($warningCount === 0) {
echo "
🎉 系统完全就绪! 所有核心业务功能测试通过,可以进行生产环境部署。
";
} else {
echo "
⚠️ 系统基本就绪,但有 $warningCount 个警告需要关注,建议排查后再部署。
";
}
} else {
echo "
❌ 系统未就绪,有 $errorCount 个严重问题需要立即修复。
";
}
echo "
📋 下一步建议
";
echo "
";
if ($errorCount > 0) {
echo "- 🚨 立即修复失败项:优先解决所有标记为错误的测试项
";
}
if ($warningCount > 0) {
echo "- ⚠️ 评估警告项:确认警告项对业务的实际影响
";
}
echo "- 🔄 进行端到端业务测试:完整的用户注册→登录→支付流程测试
";
echo "- 📊 性能基准测试:对比PHP8与原系统的性能表现
";
echo "- 🚀 准备生产部署:配置生产环境和监控
";
echo "
";
echo "
";
echo "
";
echo "
🔗 相关测试工具
";
echo "
";
echo "
测试完成时间: " . date('Y-m-d H:i:s') . "
";
echo "
";
echo "
";
echo "