我试图捕获用户在paypal(沙盒)中付款的时间。 IPN就是答案,但似乎我没有得到任何回应。我试图将它放在日志甚至数据库中,但没有数据输入。我知道IPN是一个倾听者,但我不知道为什么不工作..有任何澄清和想法吗?
我正在使用codeigniter Paypal_Lib
这是我的剧本:
首先我宣布了字段
$this->paypal_lib->add_field('cmd','_cart');
$this->paypal_lib->add_field('upload','1');
$this->paypal_lib->add_field('business', $business_email);
$this->paypal_lib->add_field('return', site_url('invoice/payment_success/'.$invoice_id.'/'.$album_id));
$this->paypal_lib->add_field('cancel_return', site_url('invoice/payment_cancel/'.$invoice_id));
$this->paypal_lib->add_field('notify_url', site_url('invoice/payment_validate/'.$invoice_id)); // <-- IPN url
$this->paypal_lib->add_field('custom', $invoice_id); // <-- Verify return
这是我的IPN,只是通过记录但没有运气来检查它是否有效。
public function payment_validate(){
//$this->paypal_lib->dump();
$invoice_id = $this->uri->segment(3);
if ($this->paypal_lib->validate_ipn()){
$payer_email = $this->paypal_lib->ipn_data['payer_email'];
$fp=fopen('temp/logs/paypal_ipn.log','a');
fwrite($fp, $this->paypal_lib->ipn_data . "\n");
fclose($fp); // close file
}
}
这是库中的validate_ipn。
function validate_ipn() {
// get instance
$CI =& get_instance();
// parse the paypal URL
$url_parsed = parse_url($this->paypal_url);
// generate the post string from the _POST vars aswell as load the
// _POST vars into an arry so we can play with them from the calling
// script.
$post_string = '';
#if(count($_POST))
if($_POST)
{
#foreach (array_keys($_POST) as $field)
foreach ($_POST as $field => $value)
{
#$value = $CI->input->post($field, true);
$this->ipn_data[$field] = $value;
$post_string .= $field.'='.urlencode(stripslashes($value)).'&';
}
}
$post_string.='cmd=_notify-validate'; // append ipn command
// open the connection to paypal
$fp = fsockopen($url_parsed['host'],'80',$err_num,$err_str,30);
if(!$fp)
{
// could not open the connection. If loggin is on, the error message
// will be in the log.
$this->last_error = 'fsockopen error no. '.$err_num.': '.$err_str;
$this->log_ipn_results(false);
return false;
}
else
{
// Post the data back to paypal
fputs($fp, "POST $url_parsed[path] HTTP/1.1\r\n");
fputs($fp, "Host: $url_parsed[host]\r\n");
fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n");
fputs($fp, "Content-length: ".strlen($post_string)."\r\n");
fputs($fp, "Connection: close\r\n\r\n");
fputs($fp, $post_string . "\r\n\r\n");
// loop through the response from the server and append to variable
while(!feof($fp))
$this->ipn_response .= fgets($fp, 1024);
fclose($fp); // close connection
}
if (eregi('VERIFIED',$this->ipn_response))
{
// Valid IPN transaction.
if ($this->ipn_log_method == 'db')
{
return $this->log_ipn_results(true);
}
/*// Valid IPN transaction.
$this->log_ipn_results(true);*/
return true;
}
else
{
// Invalid IPN transaction. Check the log for details.
$this->last_error = 'IPN Validation Failed.';
$this->log_ipn_results(false);
return false;
}
}
答案 0 :(得分:2)
回答我自己的问题:
无法接收paypal IPN因为连接到paypal时出现问题,修复此问题所要做的就是更改端口:
$fp = fsockopen($url_parsed['host'],'80',$err_num,$err_str,30);
到
$fp = fsockopen($url_parsed['host'],'443',$err_num,$err_str,30);
现在已建立接收连接并接收PayPal IPN通知。
后来我发现在沙盒中测试IPN失败了,我发现沙箱中的IPN无法正常工作。您可以参考here
答案 1 :(得分:0)
我知道这是一个愚蠢的问题,但你是在本地主机上开发这个吗?在localhost上测试时,PayPal IPN可能无法访问您的服务器。考虑像PageKite,Localtunnel等工具将您的本地计算机放到互联网上,以便PayPal可以访问它。
另一种方法是登录商家沙箱帐户并查看IPN历史记录,以确切了解错误是什么。