IPN 验证 ipnSimulator INVALID

Posted

技术标签:

【中文标题】IPN 验证 ipnSimulator INVALID【英文标题】:IPN validation ipnSimulator INVALID 【发布时间】:2016-07-09 11:31:54 【问题描述】:

我在沙盒中设置了贝宝 IPN。 我用这个脚本 https://github.com/paypal/ipn-code-samples/blob/master/paypal_ipn.php

但我总是得到无效的响应。

我用了这个技巧https://developer.paypal.com/docs/classic/ipn/integration-guide/IPNTesting/#invalid

但仍然是无效响应 我做错了什么?

[2016-03-22 16:53 Europe/Moscow] HTTP 验证请求 请求:POST /cgi-bin/webscr HTTP/1.1 主机:www.sandbox.paypal.com 接受:/ 连接:关闭 内容长度:970 内容类型: 应用程序/x-www-form-urlencoded

对于 IPN 有效负载: cmd=_notify-validate&payment_type=instant&payment_date=Tue+Mar+22+2016+16%3A47%3A09+GMT%2B0300+%28RTZ+2+%28%C3%90%C2%B7%C3%90%C2%B8%C3 %90%C2%C2%C3%C3%C2%B0%29%29%29&Paintact_Status = Address_Status = Serviced&First_Name = John&Last_Name = Smith&Payer_Email = Buyer%40paypalsandbox.com&payer_id = testbuyerid01&address_name = john + smith&address_country = United + Sermand _country_code = Us&address_zip = 95131&address_zip = ca&conderud_city =三+何塞&address_street = 123 +任何+街道和商业=卖家%40paypalsandbox.com&RECEIVER_EMAIL =卖家%40paypalsandbox.com&receiver_id =卖家%40paypalsandbox.com&residence_country = US&item_name1 =东西&item_number1 = AK-1234税额= 2.02&mc_currency = USD&mc_fee = 0.44 mc_gross = 12.34&mc_gross_1 = 12.34&mc_handling = 2.06&MC_HANDLING1 = 1.67&MC_SHIPPPIET = 3.02&MC_SHISPPY = 1.02&TXN_TYPE = 1.02&TXN_TYPE = 1.02&TXN_TYPE =&TXN_ID = 901876583&NOTIFY_VERSION = 2.1&CUSTOM_VERSION = 2.1&CUSTOM = XYZ123和INTER_IPN = 1&VERIFY_SIGN = A2AOTZPINFH-.CRF2FDADAP45Z4XAMRYJ2I2LYN0-BIRKSCSGQZJL1BU [2016-03-22 16:53 Europe/Moscow] 验证请求的 HTTP 响应: HTTP/1.1 200 OK 日期:2016 年 3 月 22 日星期二 13:53:57 GMT 服务器:Apache X-Frame-Options:SAMEORIGIN Set-Cookie: c9MWDuvPtT9GIMyPc3jwol1VSlO = 8YEulQPoVmljEzDjxqb2Eja5QkTvSSIHAnS6YQAcTx1q_LuQEbsn-_3B66X5sfKSbDLoRnK3Ry41yaTByrW98ADgx2oXvvGL_3Ip0w4UjbUAoWMw4czFk1LULFI1VqQqjvwTuLSm21iNcQvYl8U4h0oOhwZ8CJVVpogcyR3HjUweHmCjUhDzqGKS6jFMsbkUu9wyC85KmvldFXiXjFvokwlUTUmnH3e4Vt26dgA0jnaRK_vKMNX-aYV9uicgZf2DBUvz0f3kP329HR1IWGErDb8Wgtpf6jQMho8B0noW_vYfA6IPQpBAG927oZVlU3iSxa6zj53u-NGEr11Z1qE2wLmqO9vWbgOsbGcJG2F3au0FGuLQdy-7mdQpFEriGbBF9FknFI_5YTzKo4uFQudUT9Sr4i-LSapRj_4758BPSTEiJ2oHpY-6m1lWuOi; 域=.paypal.com;路径=/;安全的; HttpOnly Set-Cookie: cookie_check=是;过期=格林威治标准时间 2026 年 3 月 20 日星期五 13:53:58; 域=.paypal.com;路径=/;安全的; HttpOnly Set-Cookie: navcmd=_通知验证;域=.paypal.com;路径=/;安全的; HttpOnly 设置 Cookie:navlns=0.0;到期=格林威治标准时间 2018 年 3 月 22 日星期四 13:53:58; 域=.paypal.com;路径=/;安全的; HttpOnly Set-Cookie: 阿帕奇=10.72.108.11.1458654837796174;路径=/;到期=周四,15-Mar-46 13:53:57 GMT 变化:接受编码,用户代理连接:关闭 HTTP_X_PP_AZ_LOCATOR:sandbox.slc Paypal-Debug-Id:8023af87be9​​66 设置 Cookie: X-PP-SILOVER=名称%3DSANDBOX3.WEB.1%26silo_version%3D1880%26app%3Dappdispatcher%26TIME%3D1968107862; 域=.paypal.com;路径=/;安全的; HttpOnly Set-Cookie: X-PP-SILOVER=;过期=周四,1970 年 1 月 1 日 00:00:01 GMT 严格传输安全:max-age=14400 传输编码:分块 内容类型:文本/html; charset=UTF-8

无效 [2016-03-22 16:53 Europe/Moscow] IPN 无效: cmd=_notify-validate&payment_type=instant&payment_date=Tue+Mar+22+2016+16%3A47%3A09+GMT%2B0300+%28RTZ+2+%28%C3%90%C2%B7%C3%90%C2%B8%C3 %90%C2%C2%C3%C3%C2%B0%29%29%29&Paintact_Status = Address_Status = Serviced&First_Name = John&Last_Name = Smith&Payer_Email = Buyer%40paypalsandbox.com&payer_id = testbuyerid01&address_name = john + smith&address_country = United + Sermand _country_code = Us&address_zip = 95131&address_zip = ca&conderud_city =三+何塞&address_street = 123 +任何+街道和商业=卖家%40paypalsandbox.com&RECEIVER_EMAIL =卖家%40paypalsandbox.com&receiver_id =卖家%40paypalsandbox.com&residence_country = US&item_name1 =东西&item_number1 = AK-1234税额= 2.02&mc_currency = USD&mc_fee = 0.44 mc_gross = 12.34&mc_gross_1 = 12.34&mc_handling = 2.06&MC_HANDLING1 = 1.67&MC_SHIPPPIET = 3.02&MC_SHISPPY = 1.02&TXN_TYPE = 1.02&TXN_TYPE = 1.02&TXN_TYPE =&TXN_ID = 901876583&NOTIFY_VERSION = 2.1&CUSTOM_VERSION = 2.1&CUSTOM = XYZ123和INTER_IPN = 1&VERIFY_SIGN = A2AOTZPINFH-.CRF2FDADAP45Z4XAMRYJ2I2LYN0-BIRKSCSGQZJL1BU 贝宝回复:

【问题讨论】:

【参考方案1】:

在您的 IPN PHP 脚本中,尝试将所有 urlencode 更改为 rawurlencodeurldecode 更改为 rawurldecode

【讨论】:

【参考方案2】:

尝试使用 sandbox.paypal 中的两个假帐户(1 个个人帐户,1 个企业帐户)来检查已验证/无效响应,而不是 IPN 模拟器。

您可以通过https://developer.paypal.com/developer/accounts/ 获得这些,并给他们假积分来玩。

我从未从 IPN 模拟器获得验证,但在通过沙盒测试时总是得到一个。

【讨论】:

【参考方案3】:

我终于找到了对此查询的更新(2016 年 8 月 5 日)有效答案。您可以将此代码用作 Sandbox 或 Live 的最终 IPN。考虑到以下几点:

    请务必将您的 IPN 监听器放置到 ->我的销售工具 -> 即时付款通知部分。 不要在沙盒中使用 IPN 模拟器,它总是会返回 INVALID。 创建并使用一个实际的沙盒按钮,但不要将您的 IPN 侦听器置于显示“在客户完成结帐时将其带到此 URL”的 RETURN PAGE。

就是这样。我希望这会有所帮助。

这是工作代码:

<?php
$post_data = file_get_contents('php://input');
$post_array = explode('&', $post_data);
$dataFromPayPal = array();
foreach ($post_array as $keyval) 
    $keyval = explode ('=', $keyval);
    if (count($keyval) == 2)
        $dataFromPayPal[$keyval[0]] = urldecode($keyval[1]);


$req = 'cmd=_notify-validate';
if(function_exists('get_magic_quotes_gpc')) 
    $get_magic_quotes_exists = true;

foreach ($dataFromPayPal as $key => $value) 
    if($get_magic_quotes_exists == true && get_magic_quotes_gpc() == 1) 
        $value = urlencode(stripslashes($value));
     else 
        $value = urlencode($value);
    
    $req .= "&$key=$value";


$ch = curl_init('https://www.sandbox.paypal.com/cgi-bin/webscr');
//use https://www.paypal.com/cgi-bin/webscr in live environment.
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $req);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_FORBID_REUSE, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Connection: Close'));

if( !($res = curl_exec($ch)) ) 
    curl_close($ch);
    exit;

curl_close($ch);



if (strcmp ($res, "INVALID") == 0) 
        echo "INVALID";

else if (strcmp ($res, "VERIFIED") == 0) 
        echo "VALID";


?>

【讨论】:

以上是关于IPN 验证 ipnSimulator INVALID的主要内容,如果未能解决你的问题,请参考以下文章

IPN 模拟器:“IPN 未发送,握手未验证。请查看您的信息”

PayPal IPN 模拟器工作正常,但 IPN 不响应沙盒支付

Rails 监听器 Paypal IPN 总是返回 INVALID

PayPal IPN 已验证握手但 IPN 无效

IPN 验证在应该失败时不会失败

PayPal IPN 模拟器:IPN 未发送,握手未验证。请查看您的信息