PayPal IPN 错误:不支持标题字段的行折叠

Posted

技术标签:

【中文标题】PayPal IPN 错误:不支持标题字段的行折叠【英文标题】:PayPal IPN error: line folding of header fields is not supported 【发布时间】:2021-11-25 06:08:56 【问题描述】:

运行多年的 PayPal IPN 脚本突然停止工作。 PayPal 正在返回以下响应:

HTTP/1.1 400 Bad Request
Connection: close
Content-Length: 46
content-type: text/plain; charset=utf-8

line folding of header fields is not supported

总结一下 PayPal IPN 的工作原理:

    PayPal POST 到您系统上的端点 端点必须用它收到的 POST 数据回复 PayPal PayPal 回复 VERIFIED

就我而言,PayPal 无法验证响应,因为“不支持标题字段的行折叠”。

Google 没有提供太多关于“行折叠标题字段”的内容。我只能假设这与标题格式有关。以下是相关代码:

// read the post from PayPal system and add 'cmd'
$req = 'cmd=_notify-validate';

foreach ($_POST as $key => $value) 
  $value = urlencode(stripslashes($value));
  $req .= "&$key=$value";


// post back to PayPal system to validate
// 7/22/2013 - Update to use HTTP 1.1 instead of HTTP 1.0
$header  = "POST /cgi-bin/webscr HTTP/1.1\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Content-Length: " . strlen($req) . "\r\n";
$header .= "Host: www.paypal.com\r\n ";
$header .= "Connection: close\r\n\r\n";

// Open a connection to PayPal.com
$fp = @fsockopen("ssl://$target", 443, $errno, $errstr, 30);

if (!$fp) 
  // HTTP ERROR
else
  @fputs ($fp, $header . $req);
  while (!@feof($fp)) 
    $res = @fgets ($fp, 1024);
    if (strcmp ($res, "VERIFIED") == 0) 
      $verified = true;
    else
      // Log failure
    
  
  @fclose ($fp);

任何想法可能导致关于标题的行折叠错误?

【问题讨论】:

我没有看到任何多行标题​​,所以我没有看到问题。但几年前我将我们的代码改为使用curl @Barmar 它是Host 标题行末尾的空格, 换行符之后。不过很难发现。 【参考方案1】:

标题折叠在https://datatracker.ietf.org/doc/html/rfc7230#section-3.2.4下解释:

从历史上看,HTTP 标头字段值可以扩展至 多行,每行前至少有一个空格 或水平制表符(obs-fold)。

我必须回显您生成的标题才能自己查看问题,这很难发现:

$header .= "Host: www.paypal.com\r\n ";

此处换行后的额外空格,意味着 next 标题行将以该空格开始 - 这意味着,您 “折叠标题”,实际上并没有打算这样做。

删除多余的尾随空格,一切正常。

【讨论】:

以上是关于PayPal IPN 错误:不支持标题字段的行折叠的主要内容,如果未能解决你的问题,请参考以下文章

PayPal IPN 不返回自定义字段

不支持的操作数类型错误。 paypal付款后啥时候退货?

PayPal IPN SSL 协议版本

PayPal IPN 停止工作 422 错误

使用 PayPal 订阅 IPN 字段管理用户帐户

使用 PayPal 订阅 IPN 字段管理用户帐户