小呆支付系统修复指南
问题背景
小呆支付系统在生产环境突然 500:
Fatal error: ReflectionParameter::getClass() is deprecated …
根源:PHP 8.x 把 getClass()
标为弃用,ThinkPHP 旧核心仍在调用,同时宝塔计划任务中断。
不及时修复 → 订单与回调全面停摆。
修复思路
不升级整站框架,仅替换 2 个核心函数 + 批量修改变量写法 + 清缓存,全程 6 步,约 5 分钟,零业务侵入,兼容 PHP 7.4 → 8.2。
适用人群
- 正在使用 ThinkPHP 5.x/6.x 的支付系统
- 宝塔计划任务出现 curl / Reflection 报错
- 手机 / 电脑均可按步骤操作
修复步骤(手机长按即可复制)
① 备份
cp -r /www/wwwroot/你的根目录 /path/to/backup
② 替换 thinkphp/library/think/Container.php(第 453 行)
protected function bindParams(\ReflectionFunctionAbstract $reflect, $vars = [])
{
if ($reflect->getNumberOfParameters() == 0) return [];
reset($vars);
$type = key($vars) === 0 ? 1 : 0;
$params = $reflect->getParameters();
$args = [];
foreach ($params as $param) {
$name = $param->getName();
$reflectionType = $param->getType();
if ($reflectionType && $reflectionType instanceof \ReflectionNamedType && !$reflectionType->isBuiltin()) {
$args[] = $this->getObjectParam($reflectionType->getName(), $vars);
} elseif ($type == 1 && !empty($vars)) {
$args[] = array_shift($vars);
} elseif ($type == 0 && isset($vars[$name])) {
$args[] = $vars[$name];
} elseif ($param->isDefaultValueAvailable()) {
$args[] = $param->getDefaultValue();
} else {
throw new \InvalidArgumentException('参数缺失: ' . $name);
}
}
return $args;
}
③ 修改 application/common.php第 1771 行
function doCurl($url, $header, $data = [], $timeout = 30, $bankId = "", $POST = true)
{
$ch = curl_init();
if (substr($url, 0, 5) === 'https') {
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
}
$atad = Db::name("pay_sz")->find();
$use_agent = $atad['ip_hfw'] != 2;
}
application/common.php第 1913 行
function sign($type, $api = '', $data1 = '', $data2 = '')
{
$cls = pay($data2['duijei'] == 1 ? 'mr' : 'yzf');
return $type == 'sign'
? $cls->sign($api, $data1)
: $cls->ybhd($api, $data1, $data2['key']);
}
⑤ 手动检查
# 检查替换后的文件
grep -rn --include=\*.php '\$[a-zA-Z_]\w*\s*\[' /www/wwwroot/你的根目录/
⑥ 清缓存
rm -rf /www/wwwroot/你的根目录/runtime/*
电脑也可评论
可以评论