PAYATHON 2026

如何在 PayWay 支付集成中设置证书路径

支付小周

明确结论

服务器使用 Linux,不能沿用 C:/website/... 这样的 Windows 路径,也不能只填写 cacerts.crt 之类的相对路径。请改用服务器文件系统中的绝对路径,或者通过 PHP 的 __DIR__,根据当前脚本的位置生成路径。

假设相关文件位于:

/home/serverusername/public_html/payment-gateway/
├── processCard.php
├── ccapi.pem
├── cacerts.crt
└── log/

可以这样配置:

<?php

$baseDir = __DIR__;

$initParams =
    "certificateFile=" . $baseDir . "/ccapi.pem" . "&" .
    "caFile=" . $baseDir . "/cacerts.crt" . "&" .
    "logDirectory=" . $baseDir . "/log";

出错原因

从错误信息来看,客户端实际收到的参数是:

certificateFile=ccapi.pem&caFile=cacerts.crt&logDirectory=log

其中使用的都是相对路径。PHP 会根据进程的当前工作目录解析相对路径,而这个目录不一定是 processCard.php 所在的目录。因此,即使 cacerts.crt 和脚本放在同一目录下,PayWay API Client 仍可能找不到该文件。

__DIR__ 返回当前 PHP 文件所在目录的绝对路径,不受入口脚本、Web 服务器工作目录或调用关系影响,用它处理这种情况通常更可靠。

部署在其他目录时的写法

为了安全,证书最好存放在网站公开目录之外。例如:

/home/serverusername/payway-secure/
├── ccapi.pem
├── cacerts.crt
└── log/

对应配置如下:

<?php

$paywayDir = '/home/serverusername/payway-secure';

$initParams =
    "certificateFile=" . $paywayDir . "/ccapi.pem" . "&" .
    "caFile=" . $paywayDir . "/cacerts.crt" . "&" .
    "logDirectory=" . $paywayDir . "/log";

这里必须填写服务器上的真实路径。/home/serverusername/... 只是根据报错推测的示例,具体目录应以服务器或主机控制面板显示的路径为准。

初始化前检查路径和权限

调用 PayWay API Client 前,可以先检查文件是否存在且可读,并确认日志目录是否可写:

<?php

$paywayDir = __DIR__;

$certificateFile = $paywayDir . '/ccapi.pem';
$caFile = $paywayDir . '/cacerts.crt';
$logDirectory = $paywayDir . '/log';

if (!is_file($certificateFile) || !is_readable($certificateFile)) {
    throw new RuntimeException(
        'PayWay certificate file does not exist or is not readable: ' .
        $certificateFile
    );
}

if (!is_file($caFile) || !is_readable($caFile)) {
    throw new RuntimeException(
        'PayWay CA file does not exist or is not readable: ' .
        $caFile
    );
}

if (!is_dir($logDirectory)) {
    throw new RuntimeException(
        'PayWay log directory does not exist: ' .
        $logDirectory
    );
}

if (!is_writable($logDirectory)) {
    throw new RuntimeException(
        'PayWay log directory is not writable: ' .
        $logDirectory
    );
}

$initParams =
    "certificateFile=" . $certificateFile . "&" .
    "caFile=" . $caFile . "&" .
    "logDirectory=" . $logDirectory;

通过这些检查,可以分别判断是路径错误、文件不可读,还是日志目录不可写,比等待 PayWay 客户端返回笼统的初始化错误更容易定位问题。

还需要注意的事项

  • 必须填写服务器文件系统路径,不能使用 https://... URL。
  • Linux 路径区分大小写,cacerts.crt 和 caCerts.crt 是两个不同的文件名。
  • logDirectory 必须提前创建,并允许运行 PHP 的系统用户写入。
  • ccapi.pem 和 cacerts.crt 必须允许 PHP 进程读取。
  • 不要为了绕过权限问题,直接将证书权限设置为 0777。只需向 PHP 运行用户或对应用户组授予必要的读取权限。
  • 私钥或含有敏感证书信息的文件不应存放在 public_html 等可公开访问的目录中。
  • 不要将完整的 $initParams、证书内容、信用卡信息或私钥输出到生产日志或网页中。

如果 processCard.php、证书和日志目录都在同一个 payment-gateway 目录中,使用 __DIR__ 即可解决当前的 cacerts.crt does not exist 问题。如果文件位于其他位置,请将 $paywayDir 改为该目录的真实绝对路径。

备注:内容仅供参考。