PAYATHON 2026

在 Laravel Controller 中添加第三方 RSA Library

支付阿杰

结论

Controller 的命名空间是 App\Http\Controllers,因此下面这段代码:

$rsa = new Crypt_RSA();

会被 PHP 解析为:

App\Http\Controllers\Crypt_RSA

如果第三方 Library 中的 Crypt_RSA 定义在全局命名空间,需要使用完整类名:

include_once app_path('PaymentGateway/Crypt/RSA.php');

$rsa = new \Crypt_RSA();

原因

Laravel Controller 通常会声明以下命名空间:

namespace App\Http\Controllers;

在该文件中使用未限定的类名 Crypt_RSA 时,PHP 会先在当前命名空间中查找。报错信息:

Class 'App\Http\Controllers\Crypt_RSA' not found

说明 PHP 查找的是 Controller 命名空间中的类,而第三方 Library 提供的 Crypt_RSA 很可能定义在全局命名空间。

web.php 通常不在 App\Http\Controllers 命名空间中,所以相同代码在那里可以正常运行。

直接解决方法

在类名前加反斜杠,明确指定全局命名空间:

<?php

namespace App\Http\Controllers;

class PaymentController extends Controller
{
    public function pay()
    {
        include_once app_path('PaymentGateway/Crypt/RSA.php');

        $rsa = new \Crypt_RSA();

        // 后续 RSA 操作
    }
}

建议使用 include_once 或 require_once,以免重复加载同一个文件:

require_once app_path('PaymentGateway/Crypt/RSA.php');

如果该 Library 是支付流程必需的依赖,require_once 更合适。文件不存在或加载失败时,程序会立即停止,不会继续执行。

使用 use 导入类名

也可以在 Controller 顶部导入全局类:

<?php

namespace App\Http\Controllers;

use Crypt_RSA;

class PaymentController extends Controller
{
    public function pay()
    {
        require_once app_path('PaymentGateway/Crypt/RSA.php');

        $rsa = new Crypt_RSA();
    }
}

需要注意,use 只处理类名解析,不会加载 RSA.php。如果该 Library 没有接入 Composer 自动加载,仍需执行 require_once。

如果项目中还有其他同名的 RSA 类,可以设置别名:

use Crypt_RSA as GatewayRSA;

实例化时使用别名:

$rsa = new GatewayRSA();

推荐接入 Composer 自动加载

不建议在每次 Controller 请求中手动引入 Library。对于不符合 PSR-4 规范的旧式 PHP Library,可以将其目录加入 Composer 的 classmap。

在项目的 composer.json 中配置:

{
    "autoload": {
        "classmap": [
            "app/PaymentGateway/"
        ]
    }
}

如果现有的 autoload 中还有其他配置,请保留原有内容,只添加 classmap 项。修改后执行:

composer dump-autoload

之后,Controller 中就不需要再手动 include:

<?php

namespace App\Http\Controllers;

class PaymentController extends Controller
{
    public function pay()
    {
        $rsa = new \Crypt_RSA();

        // 后续 RSA 操作
    }
}

如果 Library 还包含 BigInteger.php 等依赖文件,将整个 PaymentGateway 目录加入 classmap,通常比只登记 RSA.php 更稳妥,但仍要看该 Library 如何加载依赖。

注意事项

先检查 RSA.php 中的实际类声明:

class Crypt_RSA
{
    // ...
}

如果文件声明了自己的命名空间,例如:

namespace PaymentGateway\Crypt;

class Crypt_RSA
{
}

就需要使用对应的完整类名:

$rsa = new \PaymentGateway\Crypt\Crypt_RSA();

也可以在 Controller 顶部导入:

use PaymentGateway\Crypt\Crypt_RSA;

然后实例化:

$rsa = new Crypt_RSA();

部分旧版 RSA Library 依赖特定的目录结构、PHP include_path 或其他文件。即使 RSA.php 已经成功加载,后续仍可能出现依赖类缺失的问题。这种情况下需要保留支付网关提供的完整 Library 目录,不能只复制单个 RSA.php。

如果支付网关明确要求使用其提供的版本,应遵守网关的签名和加密规范,不要自行替换 RSA 实现。如果网关允许使用标准 Composer 包,选择仍在维护并支持自动加载的版本,通常更方便升级和排查安全问题。

备注:内容仅供参考。