IPN验证失败

4

我正在将PayPal与IPN集成(我已经在许多网站上完成了此操作,以前从未出现过此问题)。 我使用的是PHP PayPal IPN Integration Class-Micah Carrick。

我正在沙盒帐户上进行测试。我从PayPal收到的所有数据都很好。 但是始终无法通过IPN验证。

我在许多项目中都使用了相同的类,但从未遇到此问题,请指导我,可能是什么原因引起了此问题。

这是我在日志文件中得到的:

[10/29/2012 5:02 AM] - FAIL: IPN Validation Failed.
IPN POST Vars from Paypal:
mc_gross=10.00, protection_eligibility=Eligible, address_status=confirmed, payer_id=LZ3J5RXT7ZRSW, tax=0.00, address_street=1 Main St, payment_date=03:02:41 Oct 29, 2012 PDT, payment_status=Completed, charset=windows-1252, address_zip=95131, first_name=AProfessionals, mc_fee=0.59, address_country_code=US, address_name=AProfessionals Inc, notify_version=3.7, custom=, payer_status=verified, business=brian_1351496665_biz@a1professionals.com, address_country=United States, address_city=San Jose, quantity=1, verify_sign=AV0bkFkV43dlmXuqlWjyHTfWE.SBANTBgLiHNABcsVQsMvyhdLQg8mTi, payer_email=harry_1351496900_per@a1professionals.com, txn_id=9ES74523RB953760X, payment_type=instant, last_name=Inc, address_state=CA, receiver_email=brian_1351496665_biz@a1professionals.com, payment_fee=0.59, receiver_id=NEV59MNUMBET6, txn_type=web_accept, item_name=Paypal Test Transaction, mc_currency=USD, item_number=, residence_country=US, test_ipn=1, handling_amount=0.00, transaction_subject=Paypal Test Transaction, payment_gross=10.00, shipping=0.00, ipn_track_id=74d5b2446aded,

IPN Response from Paypal Server:
HTTP/1.0 302 Found
Location: https://www.sandbox.paypal.com
Server: BigIP
Connection: close
Content-Length: 0

我尝试使用IPN模拟器来检查问题,但是在我的日志文件中出现了以下错误:[29-Oct-2012 11:24:51 UTC] cURL错误:[77] SSL CA证书有问题(路径?访问权限?) - Ankush Kalia
1
你的请求中是否使用了“Host”头?你看过PayPal的这个通知吗?https://www.x.com/developers/community/blogs/pp_mts_robertg/action-required-update-your-ipn-pdt-scripts - dbellizzi
今天我也遇到了同样的问题。按照这篇帖子解决了:https://dev59.com/z2gt5IYBdhLWcg3w3xTC#37630831 - Naguissa
2个回答

3

根据我的经验,IPN验证失败的常见原因有以下三个:

1)cmd=_notify-validate被添加到末尾而不是开头……这可能会导致问题。因此,不要这样做:

  $post_string = '';    
  foreach ($_POST as $field=>$value) { 
     $this->ipn_data["$field"] = $value;
     $post_string .= $field.'='.urlencode(stripslashes($value)).'&'; 
  }
  $post_string.="cmd=_notify-validate"; // append ipn command

请按照此页面上的代码操作:https://www.x.com/developers/PayPal/documentation-tools/code-sample/216623

// read the post from PayPal system and add 'cmd'
$req = 'cmd=_notify-validate';
if(function_exists('get_magic_quotes_gpc')) {
   $get_magic_quotes_exists = true;
} 
foreach ($myPost 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";
}

2) 地址可以是多行的。

// read post data from PayPal and add 'cmd'
$req = 'cmd=_notify-validate';
foreach ($_POST as $key => $value)
{
    // put line feeds back to CR+LF as that's how PayPal sends them out
    // otherwise multi-line data will be rejected as INVALID
     $value = str_replace("\n", "\r\n", $value);
        $this->ipn_data_arr[$key] = $value;
        $req .= '&'.$key.'='.urlencode(stripslashes($value)); 
    }

你可以通过登录你的PayPal账户并将1行更改为2行来自行测试,然后使用你的账户进行交易。如果没有 $value = str_replace("\n", "\r\n", $value); 这一行代码,2行将会失败。我们都想知道为什么PayPal的示例代码中没有这一行...

3) 用户在其姓名、地址等信息中使用了非英文字符(可能与您无关,但既然提到了就说一下)

参见:http://blog.tentaclesoftware.com/archive/2010/04/09/87.aspx 主要观点是:

Log into PayPal
Click the ‘Profile’ link in the menu bar under ‘My Account’
Click the ‘Language Encoding’ link under the ‘Selling Preferences’ column
Click ‘More Options’
Set ‘Encoding’ to ‘UTF-8’
Click ‘Save’

如果你注意到这三个方面的共同主题:数据的顺序、数据的编码等,如果只有一个小细节稍有不同,它就会失败。因此,如果不是这三个原因,请沿着这些思路寻找并检查其数据可能引起问题的字段...非标准字符、隐藏元数据等。

代码示例已移至http://paypal.github.io/sdk/sample-apps/ 请特别查看https://github.com/paypal/ipn-code-samples - staabm

2

更改了 PayPal 库中的一项内容

// 打开与 PayPal 的连接

 $fp = fsockopen(‘ssl://’.$url_parsed[host],“443”,$err_num,$err_str,30);

//$fp = fsockopen($url_parsed[host],“80”,$err_num,$err_str,30); 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接