贝宝 IPN 集成到 PHP
Posted
技术标签:
【中文标题】贝宝 IPN 集成到 PHP【英文标题】:Paypal IPN Integration into PHP 【发布时间】:2012-08-06 04:26:18 【问题描述】:我无法将 Paypal 的 IPN 集成到我的 php 中,我有以下脚本,当在 paypal 沙箱中进行付款时,它一直处于默认情况。
任何帮助将不胜感激!
$request = "cmd=_notify-validate";
foreach ($_POST as $varname => $varvalue)
$email .= "$varname: $varvalue\n";
if(function_exists('get_magic_quotes_gpc') and get_magic_quotes_gpc())
$varvalue = urlencode(stripslashes($varvalue));
else
$value = urlencode($value);
$request .= "&$varname=$varvalue";
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,"https://www.sandbox.paypal.com/cgi-bin/webscr");
//curl_setopt($ch,CURLOPT_URL,"https://www.paypal.com");
curl_setopt($ch,CURLOPT_POST,true);
curl_setopt($ch,CURLOPT_POSTFIELDS,$request);
curl_setopt($ch,CURLOPT_FOLLOWLOCATION,false);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
$result = curl_exec($ch);
curl_close($ch);
switch($result)
case "VERIFIED":
mail('test@test.com','worked','worked');
break;
case "INVALID":
mail('test@test.com','invaild','invaild');
break;
default:
mail('test@test.com','failed','failed');
如果我给自己发电子邮件 $result 它只是空白。
编辑:我发现这是我的 LAMP 的服务器端问题,但不确定如何解决。
注意:我确实在服务器上安装了 curl,但我不确定它是否配置正确。
【问题讨论】:
【参考方案1】:我建议使用 var_dump 和 Paypal 的测试工具进行一些调试:https://developer.paypal.com/cgi-bin/devscr?cmd=_ipn-link-session
我可以理解,使用第三方服务会变得困难且耗时。
可能值得简单地获取 POST 数据,将其序列化并将其应用于变量,这样您就可以在 PayPal 不触发回调的情况下进行测试。
我最初会做这样的事情来获取 PayPal POST。
<?php
file_put_contents(serialize($_POST), 'post.log');
//Now you have the post request serialized we can grab the contents and apply it to a variable for fast testing.
?>
代码的开始:
<?php
$_POST = unserialize(file_get_content('post.log'));
//Now you can execute the script via command line or within your browser without requiring PayPal's testing tool. Use var_dump to investigate what's the issue.
$request = "cmd=_notify-validate";
foreach ($_POST as $varname => $varvalue)
$email .= "$varname: $varvalue\n";
if(function_exists('get_magic_quotes_gpc') and get_magic_quotes_gpc())
$varvalue = urlencode(stripslashes($varvalue));
else
$value = urlencode($value);
$request .= "&$varname=$varvalue";
?>
现在:这在测试方面更加有效和高效。在您的示例中,您正在向自己发送电子邮件,但在邮件函数正文中的任何位置都没有包含 $result。 http://php.net/manual/en/function.mail.php
PayPal 的 IPN 示例使用 fsock,尽管 CURL 更有效且更易于使用。 PayPal 的沙盒更改最近也出现了一些问题。 https://www.paypal-community.com/t5/Selling-on-your-website/IPN-response-problem/m-p/519862/message-uid/519862#U519862
另外:要确定主要原因是什么,正如您所说,这似乎是您的 LAMP 堆栈。检查您的日志目录(通常是 /var/log/),通常从他们那里您将能够查明失败的原因。
【讨论】:
我解决了这个问题,看起来贝宝在通过 SSL 与我的服务器通信时遇到问题,我在下面的行中输入了它并且它有效:curl_setopt($ch,CURLOPT_SSL_VERIFYPEER, false);以上是关于贝宝 IPN 集成到 PHP的主要内容,如果未能解决你的问题,请参考以下文章