0

我试图捕捉用户在贝宝(沙盒)中付款的时间。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。

函数 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;
}

}

4

2 回答 2

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);

现在接收连接已建立并接收贝宝 IPN 通知。

后面部分我体验到在沙盒中测试 IPN 失败,我发现沙盒中的 IPN 不起作用。你可以参考这里

于 2013-10-03T06:44:26.070 回答
0

我知道这是一个愚蠢的问题,但你是在本地主机上开发这个吗?当您在 localhost 上进行测试时,PayPal IPN 可能无法访问您的服务器。考虑使用 PageKite、Localtunnel 等工具将您的本地计算机连接到互联网,以便 PayPal 可以访问它。

另一种方法是登录商家沙盒帐户并查看 IPN 历史记录,以查看究竟是什么错误。

于 2013-07-31T08:23:47.540 回答