2011-04-17 108 views
0

我想实现PayPal IPN,但它永远不会到达我设置的网址。我写了一个脚本记录访问这个网址,我得到的只是我的访问。PayPal IPN无法验证

Paypal发送通知需要多长时间?

编辑

互穿网络突然开始来了,但我现在无法确认...以下是代码:

$url = 'https://www.paypal.com/cgi-bin/webscr'; 
     $postdata = ''; 
     foreach ($_POST as $i => $v) { 
      $postdata .= $i . '=' . urlencode($v) . '&'; 
     } 
     $postdata .= 'cmd=_notify-validate'; 

     $web = parse_url($url); 
     if ($web['scheme'] == 'https') { 
      $web['port'] = 443; 
      $ssl = 'ssl://'; 
     } else { 
      $web['port'] = 80; 
      $ssl = ''; 
     } 
     $fp = @fsockopen($ssl . $web['host'], $web['port'], $errnum, $errstr, 30); 

     if (!$fp) { 
      echo $errnum . ': ' . $errstr; 
     } else { 
      fputs($fp, "POST " . $web['path'] . " HTTP/1.1\r\n"); 
      fputs($fp, "Host: " . $web['host'] . "\r\n"); 
      fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n"); 
      fputs($fp, "Content-length: " . strlen($postdata) . "\r\n"); 
      fputs($fp, "Connection: close\r\n\r\n"); 
      fputs($fp, $postdata . "\r\n\r\n"); 

      while (!feof($fp)) { 
       $info[] = @fgets($fp, 1024); 
      } 
      fclose($fp); 
      $info = implode(',', $info); 
      if (eregi('VERIFIED', $info)) { 

      } else { 

} 

}

+0

您是否在控制面板中启用了IPN? – PiZzL3 2011-04-17 17:10:46

+0

你在用什么语言?另外,你应该发布有问题的代码。 – 2011-04-17 17:11:08

+0

是的,网址是正确的... – chchrist 2011-04-17 17:11:23

回答

0

我上面已经评论。但我很确定编码为&的html正在搞乱你的回调。

URL编码HTML编码有很大的区别。

将此'&'更改为此'&'&是用于分隔不同组键/值对的url/post字符。通过将其更改为&,您将整个回调设置为单个值。

而且,只是一些建议,但我会沟壑

if (eregi('VERIFIED', $info)) {} else {} 

以及与此

if (preg_match('/VERIFIED/', $info)) {} else {} 

eregi更换折旧。
http://php.net/manual/en/function.eregi.php

+0

我希望你是对的! :)现在试试 – chchrist 2011-04-17 18:21:10

+0

Thnx男人!有效!现在,我需要弄清楚如何获得“自定义”变量... – chchrist 2011-04-17 18:32:20

+0

从您的购买表单提交的任何自定义值应该包含在上面的代码中的数组中:'$ _POST'(请务必清理任何您从那拉)。回调只是为了验证你收到的是一个真正的命令,而不是某人无意识的欺骗你的ipn脚本。 – PiZzL3 2011-04-17 18:40:41