Paypal IPN 获得空白确认(应为“已验证”或“无效”)
Posted
技术标签:
【中文标题】Paypal IPN 获得空白确认(应为“已验证”或“无效”)【英文标题】:Paypal IPN Getting blank confirmation ( should be "VERIFIED" or "INVALID" ) 【发布时间】:2012-11-14 12:41:27 【问题描述】:我只是在这里测试 Paypal IPN。我已经用沙盒设置了它。我正在向它发送虚假的 IPN 请求,它正在接收 IPN。然后,我让它返回信息以供验证,并将响应写入文本文件,以便我自己检查。 IPN 正常触发,响应正在写入文本文件。
只有一个问题...响应是空白的。
响应应该被接收为“已验证”或“无效”,这是仅有的 2 个可能的响应......所以发生了什么事 =S。非常感谢任何帮助。
整个代码贴在下面:
$ipn_post_data = $_POST;
$response = "";
// Choose url
$url = 'https://www.sandbox.paypal.com/cgi-bin/webscr';
// Set up request to PayPal
$request = curl_init();
curl_setopt_array($request, array
(
CURLOPT_URL => $url,
CURLOPT_POST => TRUE,
CURLOPT_POSTFIELDS => http_build_query(array('cmd' => '_notify-validate') + $ipn_post_data),
CURLOPT_RETURNTRANSFER => TRUE,
CURLOPT_HEADER => FALSE,
CURLOPT_SSL_VERIFYPEER => TRUE,
CURLOPT_CAINFO => 'cacert.pem',
));
// Execute request and get response and status code
$response = curl_exec($request);
$status = curl_getinfo($request, CURLINFO_HTTP_CODE);
// Close connection
curl_close($request);
$fh = fopen( "ipntest.txt", 'a+' );
$date = date( "Y-M-j H:i" );
fwrite( $fh, $date . " Response: " . $response . "\n" );
fclose( $fh );
if($status == 200 && $response == 'VERIFIED')
// All good! Proceed...
else
// Not good. Ignore, or log for investigation...
文本文件输出:
2012-Nov-26 23:24 Response:
2012-Nov-26 23:25 Response:
我之前一直在使用这个代码,我已经尝试让它工作一个星期,所以这不仅仅是暂时的失败或什么......
大家好。
【问题讨论】:
试试这个库:github.com/Quixotix/php-PayPal-IPN我在开发的某个时候遇到了同样的问题......我退出了故障排除并开始使用那个很棒的库。 这很可能只是一个 https 的东西。你确定 curl_exec() 的返回值了吗?也许是假的? 为那个 eldblz 做大事,这让我的生活变得轻松多了。问题是我没有 CA 文件。请参阅我在下面发布的答案。 【参考方案1】:所以仅供将来参考,对于有同样问题的人:
这里的问题是没有 CA 文件。
我不确定 CA 文件究竟做了什么,但我知道它与 Paypal 的 SSL 证书和建立 SSL 连接有关。当我开始查看 cURL 的错误时,我看到了以下内容:
[27-Nov-2012 21:46:11 UTC] cURL error: [77] error setting certificate verify locations:
CAfile: /etc/ssl/certs/api_cert_chain.crt
CApath: /etc/ssl/certs
我找到的快速解决方案是下载IpnListener.php 类。 (这是eldblz 推荐的。它使处理 IPN 变得更容易,并且它为我没有 CAFile 提供了一个解决方案。如果你下载整个 IpnListener.php 包,它包含一个名为 cert的文件夹> 其中包括您需要的 api_cert_chain.crt,并且已经配置好使用。
【讨论】:
当您建立 SSL 连接时,服务器将返回自己的证书(用于保护连接)以及通往权威机构的中间证书链;然后在证书颁发机构捆绑文件(CA 文件)中查找后者并进行验证,以确保您正在与正确的人交谈。希望有帮助:) 实际问题是你没有检查curl_exec()
的结果,在这种情况下是false
;然后使用curl_error($ch)
可以检查错误是什么。【参考方案2】:
class Paypal_IPN
/** @var string $_url The paypal url to go to through cURL
private $_url;
/**
* @param string $mode 'live' or 'sandbox'
*/
public function __construct($mode = 'live')
if ($mode == 'live')
$this->_url = 'https://www.paypal.com/cgi-bin/webscr';
else
$this->_url = 'https://www.sandbox.paypal.com/cgi-bin/webscr';
public function run()
$postFields = 'cmd=_notify-validate';
foreach($_POST as $key => $value)
$postFields .= "&$key=".urlencode($value);
$ch = curl_init();
curl_setopt_array($ch, array(
CURLOPT_URL => $this->_url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $postFields
));
$result = curl_exec($ch);
curl_close($ch);
$fh = fopen('result.txt', 'w');
fwrite($fh, $result . ' -- ' . $postFields);
fclose($fh);
echo $result;
在另一个 php 文件中调用它:
<?php
require 'Paypal_IPN.php';
$paypal= new Paypal_IPN('sandbox');
$paypal->run();
?>
【讨论】:
【参考方案3】:我一直使用以下方法,效果很好......
// Validate with curl
$curl_result=$curl_err='';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,'https://'.$ppHost.'/cgi-bin/webscr');
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $req);
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: application/x-www-form-urlencoded", "Content-Length: " . strlen($req)));
curl_setopt($ch, CURLOPT_HEADER , 1);
curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, $ssl);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
$curl_result = curl_exec($ch);
$curl_err = curl_error($ch);
curl_close($ch);
//are we verified? If so, let's process the IPN
if (strpos($curl_result, "VERIFIED")!==false)
$valid = true;
else
$valid = false;
您只需要确保此示例中的 $ppHost 正确,具体取决于事务是来自沙箱还是来自实时服务器,然后当然要相应地填写 $req 和 $ssl。
【讨论】:
以上是关于Paypal IPN 获得空白确认(应为“已验证”或“无效”)的主要内容,如果未能解决你的问题,请参考以下文章