PHP 集成 eWAY payment gateway 时无法连接 Rapid
结论
eWAY library has encountered a problem connecting to Rapid 通常表示 PHP SDK 未能通过 HTTP/HTTPS 连接 eWAY Rapid API。问题一般出在网络、TLS/cURL 或接口环境配置上,并非支付参数校验失败。
建议先检查:
- PHP 是否启用了
cURL和OpenSSL。 - 测试账户是否连接到 Sandbox,而非生产环境。
- API Key、API Password 和接口环境是否匹配。
- 系统的 CA 根证书是否有效。
- 服务器、防火墙或代理是否拦截了 HTTPS 请求。
- 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 运行环境。
排查顺序
可以按以下顺序排查:
- 记录原始异常信息和 cURL 错误码。
- 确认 PHP 已加载
curl和openssl。 - 使用独立的 cURL 代码测试 Sandbox HTTPS 连接。
- 核对测试凭证和 Sandbox endpoint。
- 更新 CA 根证书、PHP、cURL 和 OpenSSL。
- 检查服务器的防火墙、DNS 和代理。
- 更新 eWAY PHP SDK,并按照当前安装版本的示例重新初始化客户端。
如果独立 cURL 测试成功,但 SDK 仍报告相同错误,应重点检查 SDK 版本、endpoint 配置和异常日志。如果独立测试也失败,请先修复服务器的网络或 TLS 环境,不必继续调整交易参数。
备注:内容仅供参考。