You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PayPal IPN验证回调升级为HTTPS的技术求助

解决PayPal IPN升级HTTPS时的无限加载问题

看起来你在把PayPal IPN回调从HTTP升级到HTTPS时遇到了麻烦,尤其是切换到ipnpb.paypal.com域名后出现无限加载的情况。我来帮你分析问题并给出可行的解决方案:

原代码的核心问题

你的初始代码用的是HTTP/1.0协议连接80端口,没有加密,而且使用的是www.paypal.com域名——PayPal现在推荐使用专门的IPN域名ipnpb.paypal.com(沙箱环境对应ipnpb.sandbox.paypal.com),同时必须使用TLS加密的HTTPS连接。

无限加载的可能原因

  1. HTTP协议版本问题:你可能还是用了HTTP/1.0,没有添加Host头,导致服务器无法正确处理请求,一直等待。
  2. 连接未正确建立:PHP的fsockopen在建立TLS连接时,可能因为openssl扩展未开启、防火墙限制443端口,或者域名前缀不正确导致连接超时。
  3. 响应读取逻辑缺失:如果没有正确读取PayPal的响应,代码会一直卡在等待状态,出现无限加载。

修复后的fsockopen版本代码

下面是调整后的代码,解决了上述问题:

$demo = false;
// 区分生产/沙箱环境的专用IPN域名,加上tls://前缀启用加密
$domain = $demo ? 'ipnpb.sandbox.paypal.com' : 'ipnpb.paypal.com';
$url = "tls://{$domain}";
$port = 443;

// 构造HTTP/1.1请求头,必须包含Host字段(HTTP/1.1强制要求)
$header = "POST /cgi-bin/webscr HTTP/1.1\r\n";
$header .= "Host: {$domain}\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Content-Length: " . strlen($req) . "\r\n";
$header .= "Connection: Close\r\n\r\n"; // 明确关闭连接,避免长连接阻塞

// 建立连接并检查是否成功
$fp = fsockopen($url, $port, $errno, $errstr, 30);
if (!$fp) {
    // 连接失败时直接抛出错误,避免无限等待
    error_log("PayPal IPN连接失败: {$errno} - {$errstr}");
    die("IPN服务暂时不可用");
}

// 发送请求
fputs($fp, $header . $req);

// 正确读取响应,直到连接关闭
$response = '';
while (!feof($fp)) {
    $response .= fgets($fp, 1024);
}
fclose($fp);

// 验证PayPal的响应
if (strpos($response, 'VERIFIED') !== false) {
    // 验证通过,处理你的业务逻辑(比如更新订单状态)
} else {
    // 验证失败,记录日志并忽略请求
    error_log("PayPal IPN验证失败,响应内容: {$response}");
}

更推荐的cURL替代方案

fsockopen需要手动处理很多HTTP细节,容易出错,建议改用cURL,它对HTTPS的支持更稳定:

$demo = false;
$url = $demo ? 'https://ipnpb.sandbox.paypal.com/cgi-bin/webscr' : 'https://ipnpb.paypal.com/cgi-bin/webscr';

// 构造验证请求,必须加上cmd=_notify-validate
$req = 'cmd=_notify-validate&' . file_get_contents('php://input');

$ch = curl_init($url);
// 配置cURL参数
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $req);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// 开启SSL证书验证,确保连接安全
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);

// 执行请求并检查错误
$response = curl_exec($ch);
if (curl_errno($ch)) {
    $error = curl_error($ch);
    error_log("PayPal IPN cURL错误: {$error}");
    curl_close($ch);
    die("IPN服务暂时不可用");
}
curl_close($ch);

// 验证响应
if (strcmp(trim($response), 'VERIFIED') === 0) {
    // 验证通过,处理业务逻辑
} else {
    error_log("PayPal IPN验证失败,响应: {$response}");
}

额外排查要点

  • 确认你的服务器已经开启openssl扩展(可以通过phpinfo()查看)。
  • 检查服务器防火墙/安全组是否允许出站443端口。
  • 沙箱和生产环境的域名不要混用,否则会导致验证失败或连接问题。
  • 务必记录详细的日志(请求内容、响应内容、错误信息),方便后续排查问题。

内容的提问来源于stack exchange,提问作者Revolution

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:08:05