【问题标题】:Paypal IPN returning HTTP/1.1 200 OKPaypal IPN 返回 HTTP/1.1 200 OK
【发布时间】:2011-03-25 07:42:00
【问题描述】:

我正在测试使用 Web 支付标准和 HTML 变量将网站集成到 Paypal。

我编写了一个简单的 PHP 脚本来处理 IPN 通知。

根据Paypal documentation,一旦您将收到的数据 ping 回 Paypal,Paypal 服务器就会以简单的“VERIFIED”或“INVALID”响应进行响应。

在我的处理程序中,我正在对这两个关键字进行区分大小写的字符串比较,如果未找到这些已知关键字中的任何一个,则将其视为错误。

<?php
  $fp = fsockopen ($socket_url, 80, $errno, $errstr, 10);

  if (!$fp){
     // SOCKET ERROR
     return false;
  }
  else {
         fputs ($fp, $header . $req);
         $is_ok = false;

         while (!feof($fp)) {
             $res = fgets ($fp, 1024);

             if (strcmp("VERIFIED",$this->ipn_response)==0) {
                //do something ...
             }
             // if the IPN POST was 'INVALID'
             else if (strcmp ($res, "INVALID") == 0) {
                 fclose ($fp);
                 return false;
             }
             else {
                echo "Unknown response from Paypal: $res";
                fclose ($fp);
                return false;
            }
         }

         fclose ($fp);
         return true;
   }
?>

我的错误消息显示我收到了来自 Paypal 的“HTTP/1.1 200 OK”响应。

来自 Paypal 的未知回复: 'HTTP/1.1 200 正常'

PayPal API 是否发生了变化,还是我做错了什么?

【问题讨论】:

    标签: php paypal paypal-ipn


    【解决方案1】:

    抱歉,我最初的回复措辞很糟糕:)

    fgets 只是逐行读取,第一行是 HTTP 响应。但是,您的代码永远不会提供继续阅读的机会,因为在处理第一行后您会“出错”。

    我倾向于将您的 while 循环替换为:

        while (!feof($fp)) {
             $res = trim(fgets($fp, 1024));
    
             if (strcmp($res, "VERIFIED")==0) {
                //do something ...
             }
             else if (strcmp($res, "INVALID") == 0) {
                 fclose ($fp);
                 return false;
             }
         }
    

    【讨论】:

      【解决方案2】:

      PayPal 的响应位于 HTTP 响应的正文中。您需要先处理 HTTP 标头,然后才能获取正文。或者,或者,继续阅读行,直到找到一个空白行,下一行将是正文。

      【讨论】:

      • 非常感谢您的回答,对我很有帮助。
      【解决方案3】:

      正如@Mike 所说,您必须阅读整个正文-在您的情况下,您只是在测试VERIFIEDINVALID 是否出现在回复的前1024 个字节中,这可能是标题。

      顺便说一句,您不需要使用fsockopen(),大多数人都这样做,因为 PayPal 提供了一个使用它的示例,以便它可以在旧盒子设置中使用。带有 HTTP POST 上下文的 CURL 或 file_get_contents 可以很好地完成这项工作,这是我为 phunction PHP framework 编写的示例:

      public static function PayPal($email, $status = 'Completed', $sandbox = false)
      {
          if (preg_match('~^(?:.+[.])?paypal[.]com$~', gethostbyaddr($_SERVER['REMOTE_ADDR'])) > 0)
          {
              $url = ($sandbox !== true) ? '' : '.sandbox';
              $result = self::CURL('https://www' . $url . '.paypal.com/cgi-bin/webscr/', array_merge(array('cmd' => '_notify-validate'), $_POST), 'POST');
      
              if ($result == 'VERIFIED')
              {
                  $email = strlen($email) * strcasecmp($email, $_POST['receiver_email']);
                  $status = strlen($status) * strcasecmp($status, $_POST['payment_status']);
      
                  if (($email == 0) && ($status == 0))
                  {
                      return true;
                  }
              }
          }
      
          return false;
      }
      

      【讨论】:

        猜你喜欢
        • 2018-09-11
        • 2012-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-04
        • 2021-06-16
        • 1970-01-01
        相关资源
        最近更新 更多