小呆支付系统6.8.3/6.8.7解决ThinkPHP方法弃用问题

小呆支付系统6.8.3/6.8.7解决ThinkPHP方法弃用问题

admin
8月15日发布

小呆支付系统修复指南

问题背景

小呆支付系统在生产环境突然 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/*
© 版权声明
THE END
喜欢就支持一下吧
点赞 1 分享 收藏
评论 共2条
OωO
取消 登录评论
  1. 头像
    作者
     · 

    电脑也可评论

  2. 头像
    admin 作者
     · 

    可以评论

SSL