PHP/CodeIgniter PayPal IPN无效验证

PHP/CodeIgniter PayPal IPN无效验证,php,validation,codeigniter,paypal-ipn,Php,Validation,Codeigniter,Paypal Ipn,我有一个基于CodeIgniter 2的网站,我正在使用CodeIgniter PayPal库。我已经做了所有必要的事情,现在可以继续付款了。我收到IPN数据并将其发送到我的电子邮件中。我已经阅读了PayPal IPN指南,但在那里我找不到解决方案 在这里之前一切都很好,我对结果很满意,但我很担心,因为PayPal IPN验证失败,我无法理解问题出在哪里 当我从沙盒测试站点发送一个IPN测试时,我收到一个有效的IPN,,但当我从我的网站付款时,IPN验证失败 我正在记录所有数据,在这两种情况下(

我有一个基于CodeIgniter 2的网站,我正在使用CodeIgniter PayPal库。我已经做了所有必要的事情,现在可以继续付款了。我收到IPN数据并将其发送到我的电子邮件中。我已经阅读了PayPal IPN指南,但在那里我找不到解决方案

在这里之前一切都很好,我对结果很满意,但我很担心,因为PayPal IPN验证失败,我无法理解问题出在哪里

当我从沙盒测试站点发送一个IPN测试时,我收到一个有效的IPN,,但当我从我的网站付款时,IPN验证失败

我正在记录所有数据,在这两种情况下(有效或无效),付款都是成功的,我收到了来自PayPal的“成功”消息

我尝试过的事情

  • 打开/关闭CSRF保护
  • 更改编码(utf-8 | windows-1252)
  • 添加|从我的PayPal请求中删除字段
  • 我正在使用的代码

    我正在使用的字段

    $this->paypal_lib->add_field('business', 'name_1321715512_biz@gmail.com');
    $this->paypal_lib->add_field('return', site_url('paypal/success'));
    $this->paypal_lib->add_field('cancel_return', site_url('paypal/cancel'));
    $this->paypal_lib->add_field('notify_url', site_url('contest/receive_ipn'));
    $this->paypal_lib->add_field('item_name', 'Contest Subscribtion Payment (Test)');
    $this->paypal_lib->add_field('amount', '30');
    $this->paypal_lib->add_field('item_number', Y11-1329469079-12); // Reference number
    $this->paypal_lib->add_field('quantity', '1');
    $this->paypal_lib->add_field('charset', 'utf8');
    $this->paypal_lib->add_field('custom', 1723); //This is an id that I need.  
    
    将邮件发送到PayPal进行验证

    $post_string.="cmd=_notify-validate";
    
    if (isset($_POST)){
        foreach ($_POST as $field=>$value){
             $value = str_replace("\n", "\r\n", $value);
             $value = urlencode(stripslashes($value));
             $post_string .= "&$field=$value";
    
             $this->ipn_data[$field] = $value; //this is part of the library
        }
    }
    
    $header .= "POST /cgi-bin/webscr HTTP/1.0\r\n";
    $header .= "Content-Type: application/x-www-form-urlencoded\r\n";
    $header .= "Content-Length: " . strlen($post_string) . "\r\n\r\n";
    
    $fp = fsockopen ('ssl://www.sandbox.paypal.com', 443, $errno, $errstr, 30);
    
    验证IPN的代码

    fputs ($fp, $header . $post_string);
    while (!feof($fp)) {
        $res = fgets ($fp, 1024);
        if (strcmp ($res, "VERIFIED") == 0) {
            // Send me e-mail - Verified
        } else if (strcmp ($res, "INVALID") == 0) {
            // Send me e-mail - Invalid
        }
    }
    fclose($fp);
    
    我也在发布我收到的回复

    这是无效的(然后从我的网站发送)

    这是已验证的(从PayPal测试站点发送时)

    我注意到两件事

  • 在我的网站发送的IPN请求和从沙盒测试站点发送的IPN请求之间,字段(请求)的顺序不同
  • notify\u version
    字段中存在差异。来自我的网站(3.4)|来自贝宝(2.1)

  • 有没有人在验证时遇到过同样的问题。是否有我遗漏的东西,或者我可以调试更多的方法?

    CodeIgniter PayPal Lib已经过时,并且一直有漏洞。至少以我的经验来看

    我所做的,也是我推荐的,就是使用官方的PayPal SDK并将其“转换”为CI。 这相当容易

    你可以在这里找到:

    此外,请查看以下文档:
    没有他们你就活不下去

    不确定您是否使用了自适应支付,但我使用了这个库:它非常有用,作者也非常有帮助


    请看我的问题:。我已经在回答中发布了我的paypal IPN代码。

    我从paypal得到的回复可能也与您有关:

    现在我们从经验中了解到,在IPN验证期间,特殊字符可能很难处理。 基本上,当IPN处理程序将消息发回PayPal系统进行验证时,我们用于将IPN消息发送到服务器的字符编码需要与IPN处理程序匹配

    通过将帐户的语言编码选项更改为UTF-8,我们在解决这些问题方面取得了很大成功

    以下是您的操作方法: 1.请登录您的PayPal帐户

  • 然后按照此链接直接进入语言编码选项:

  • 点击“更多选项”按钮

  • 将两个下拉菜单更改为UTF-8并单击保存


  • 如果您在代码中指定了不同的字符编码,请也将其切换到UTF-8。

    我做了所有必要的更改,但仍然有无效的响应。我已经修改了所有的PayPal库,并将其替换为正确的代码,从PayPal网站获取。同样对于测试,我已经用固定字段对表单进行了硬编码,但仍然没有成功。还有其他建议吗?我已经用无效和已验证的请求更新了我的帖子。请看一下,我在你的帖子里找到了答案。我已经更改了
    $post\u string.=“cmd=\u notify-validate”
    $post\u string='cmd=\u notify-validate&'。文件\u get\u内容('php://input");
    并删除了
    foreach
    循环。现在IPN返回已验证。我注意到两个请求中的一些字符是不同的,我可以猜测非法字符是无效返回的原因。
    cmd=_notify-validate&mc_gross=30.00&protection_eligibility=Ineligible&address_status=unconfirmed&payer_id=LD9UMUWHD44GY&tax=0.00&address_street=Via+Unit+d%27Italia%2C+5783296&payment_date=02%3A19%3A29+Feb+17%2C+2012+PST&payment_status=Completed&charset=windows-1252&address_zip=80127&first_name=Alexander&mc_fee=1.37&address_country_code=IT&address_name=Alexander+Videnov&notify_version=3.4&custom=1721&payer_status=verified&business=aviden_1321715512_biz%40gmail.com&address_country=Italy&address_city=Napoli&quantity=1&verify_sign=AF1YwvTycK97c-VCwQnfsdzArWAcAqZjskElh-FsmZ0s9HqL9BjFUKVH&payer_email=aviden_1329133801_per%40gmail.com&txn_id=32Y96385XJ0686735&payment_type=instant&last_name=Videnov&address_state=Napoli&receiver_email=aviden_1321715512_biz%40gmail.com&payment_fee=&receiver_id=TQVQ3ASRDBW28&txn_type=web_accept&item_name=Yicca+Contest+Subscribtion+Payment+%28Test%29&mc_currency=EUR&item_number=Y11-1329473936-12&residence_country=IT&test_ipn=1&handling_amount=0.00&transaction_subject=1721&payment_gross=&shipping=0.00&ipn_track_id=35382e1887f00
    
    cmd=_notify-validate&test_ipn=1&payment_type=echeck&payment_date=02%3A28%3A24+Feb+17%2C+2012+PST&payment_status=Completed&address_status=confirmed&payer_status=verified&first_name=John&last_name=Smith&payer_email=buyer%40paypalsandbox.com&payer_id=TESTBUYERID01&address_name=John+Smith&address_country=United+States&address_country_code=US&address_zip=95131&address_state=CA&address_city=San+Jose&address_street=123%2C+any+street&business=seller%40paypalsandbox.com&receiver_email=seller%40paypalsandbox.com&receiver_id=TESTSELLERID1&residence_country=US&item_name=something&item_number=AK-1234&quantity=1&shipping=3.04&tax=2.02&mc_currency=USD&mc_fee=0.44&mc_gross=12.34&txn_type=web_accept&txn_id=242171028&notify_version=2.1&custom=xyz123&invoice=abc1234&charset=windows-1252&verify_sign=An5ns1Kso7MWUdW4ErQKJJJ4qi4-Arge8MWjXZSo7fPSQf3xaqAOjrSH