PAYATHON 2026

PHP 集成 eWAY payment gateway 时无法连接 Rapid

支付阿杰

结论

eWAY library has encountered a problem connecting to Rapid 通常表示 PHP SDK 未能通过 HTTP/HTTPS 连接 eWAY Rapid API。问题一般出在网络、TLS/cURL 或接口环境配置上,并非支付参数校验失败。

建议先检查:

  1. PHP 是否启用了 cURL 和 OpenSSL。
  2. 测试账户是否连接到 Sandbox,而非生产环境。
  3. API Key、API Password 和接口环境是否匹配。
  4. 系统的 CA 根证书是否有效。
  5. 服务器、防火墙或代理是否拦截了 HTTPS 请求。
  6. PHP、OpenSSL 或 eWAY SDK 是否过旧,因而不支持服务器要求的 TLS 协议。

先确认 PHP 运行环境

请在实际运行支付代码的 PHP 环境中检查扩展:

<?php

var_dump([
    'php_version'      => PHP_VERSION,
    'curl_loaded'      => extension_loaded('curl'),
    'openssl_loaded'   => extension_loaded('openssl'),
    'curl_version'     => function_exists('curl_version')
        ? curl_version()
        : null,
    'openssl_version'  => defined('OPENSSL_VERSION_TEXT')
        ? OPENSSL_VERSION_TEXT
        : null,
]);

如果 curl_loaded 或 openssl_loaded 为 false,请安装或启用对应扩展,再重启 PHP-FPM、Apache 或其他 PHP 运行服务。

命令行 PHP 和 Web 服务器可能使用不同的 php.ini。其中一个环境运行正常,并不代表另一个也配置正确。可以用下面的代码确认当前加载的配置文件:

<?php

echo php_ini_loaded_file();

确认 Sandbox 和生产环境没有混用

测试凭证必须用于 Sandbox,生产凭证则要连接生产环境。不能只修改 URL,却继续使用另一个环境的凭证。

使用 eway/eway-rapid-php SDK 时,常见的配置方式如下:

<?php

require __DIR__ . '/vendor/autoload.php';

$apiKey = getenv('EWAY_API_KEY');
$apiPassword = getenv('EWAY_API_PASSWORD');

$client = \Eway\Rapid::createClient(
    $apiKey,
    $apiPassword,
    \Eway\Rapid\Client::MODE_SANDBOX
);

正式上线时再切换到生产模式:

$client = \Eway\Rapid::createClient(
    $apiKey,
    $apiPassword,
    \Eway\Rapid\Client::MODE_PRODUCTION
);

不同版本 SDK 使用的常量或初始化方法可能略有不同,请以项目实际安装版本的 README 和示例为准。API Key、API Password 和 endpoint 必须属于同一个环境。

单独测试 HTTPS 连接

可以绕过 SDK,直接用 cURL 检查 PHP 能否连接 Sandbox。这个测试只用于诊断 TLS 和网络连接,不会提交交易:

<?php

$url = 'https://api.sandbox.ewaypayments.com/';

$ch = curl_init($url);

curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HEADER         => true,
    CURLOPT_CONNECTTIMEOUT => 10,
    CURLOPT_TIMEOUT        => 30,
    CURLOPT_SSL_VERIFYPEER => true,
    CURLOPT_SSL_VERIFYHOST => 2,
]);

$result = curl_exec($ch);

if ($result === false) {
    printf(
        "cURL error %d: %s\n",
        curl_errno($ch),
        curl_error($ch)
    );
} else {
    printf("HTTP status: %d\n", curl_getinfo($ch, CURLINFO_HTTP_CODE));
}

curl_close($ch);

即使根地址返回 401、403、404 或其他 HTTP 状态,通常也说明 DNS、TCP 和 TLS 连接已经建立。需要重点关注的是以下 cURL 错误:

  • Could not resolve host:DNS 解析失败。
  • Failed to connect 或 Connection timed out:防火墙、路由或网络出口存在问题。
  • SSL certificate problem:CA 根证书缺失、过期或配置错误。
  • SSL connect error:PHP、cURL 或 OpenSSL 版本可能过旧,也可能是代理干扰了 TLS。
  • Could not resolve proxy:代理配置错误。

修复 CA 证书问题

如果错误信息中出现 certificate、issuer 或 CA,请更新系统 CA 证书,或者在 php.ini 中指定可信的 CA 文件:

curl.cainfo="/absolute/path/to/cacert.pem"
openssl.cafile="/absolute/path/to/cacert.pem"

修改配置后,需要重启 PHP 服务。

不要使用下面的配置来绕过问题:

CURLOPT_SSL_VERIFYPEER => false

关闭证书校验后,支付请求将无法验证服务器身份,并面临中间人攻击风险。这样做只会掩盖真正的证书配置问题。

输出 SDK 抛出的原始异常

如果只显示固定的错误提示,底层的 cURL 错误、HTTP 状态和异常信息都会丢失。开发环境中可以记录完整异常:

<?php

try {
    $response = $client->createTransaction(
        \Eway\Rapid\Enum\ApiMethod::DIRECT,
        $transaction
    );
} catch (\Throwable $e) {
    error_log(sprintf(
        "%s: %s\n%s",
        get_class($e),
        $e->getMessage(),
        $e->getTraceAsString()
    ));

    echo 'Payment service connection failed. Check the server log.';
}

如果当前 PHP 版本不支持 Throwable,可以改为捕获 Exception:

catch (\Exception $e) {
    error_log($e->getMessage());
}

生产环境中不要向用户直接展示异常堆栈、API Password 或请求内容。

检查防火墙和代理

如果代码运行在公司网络、云服务器或受限主机上,还需要确认:

  • 服务器允许向 eWAY API 域名发起 TCP 443 出站连接。
  • DNS 可以正确解析目标域名。
  • HTTPS 代理没有替换证书或拦截请求。
  • PHP/cURL 的代理配置符合服务器的实际网络环境。
  • 主机时间准确,因为严重的时间偏差可能导致 TLS 证书验证失败。

如果本地开发环境能够连接,而正式服务器无法连接,通常应检查正式服务器的网络出口、CA 证书和 PHP 运行环境。

排查顺序

可以按以下顺序排查:

  1. 记录原始异常信息和 cURL 错误码。
  2. 确认 PHP 已加载 curl 和 openssl。
  3. 使用独立的 cURL 代码测试 Sandbox HTTPS 连接。
  4. 核对测试凭证和 Sandbox endpoint。
  5. 更新 CA 根证书、PHP、cURL 和 OpenSSL。
  6. 检查服务器的防火墙、DNS 和代理。
  7. 更新 eWAY PHP SDK,并按照当前安装版本的示例重新初始化客户端。

如果独立 cURL 测试成功,但 SDK 仍报告相同错误,应重点检查 SDK 版本、endpoint 配置和异常日志。如果独立测试也失败,请先修复服务器的网络或 TLS 环境,不必继续调整交易参数。

备注:内容仅供参考。