我只是在这里测试贝宝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:
我一直在使用这个代码之前,我一直在试图得到它的一个星期的工作,所以它不只是一个临时故障或东西...
干杯家伙。
因此,只要以供将来参考,为人与此相同的问题:
这里的问题是没有一个CA文件。
我不能确定完全是一个CA文件做什么,但我知道它是与PayPal的SSL证书,并建立SSL连接。 当我开始寻找卷曲的错误,我看到以下内容:
[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的方式更容易,它提供了一个解决方案,我没有一个凭证档案错误。如果你下载整个IpnListener.php包,它包括一个文件夹,名为证书其中包括api_cert_chain.crt你需要,并且已经配置它以供使用。
我一直使用的追随者,它很好地...
// 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。
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();
?>
文章来源: Paypal IPN Getting blank confirmation ( should be “VERIFIED” or “INVALID” )