2016-08-25 12 views
2

私は最近、PayPals IPNを使って作業を始めました.IPN上のPayPalsページの一部を読み、ここからPHPソースを使用しました:https://developer.paypal.com/docs/classic/ipn/gs_IPN/、このコード全体が終了しました:PayPal IPN PHPハンドシェイクエラー

<?php 

header('HTTP/1.1 200 OK'); 

$req = 'cmd=_notify-validate'; 

foreach ($_POST as $key => $value) { 
    $value = urlencode(stripslashes($value)); 
    $req .= "&$key=$value"; 
} 

$header = "POST /cgi-bin/webscr HTTP/1.1\r\n"; 

$header .= "Content-Type: application/x-www-form-urlencoded\r\n"; 
$header .= "Content-Length: " . strlen($req) . "\r\n\r\n"; 

$header .= "Host: www.sandbox.paypal.com:443\r\n"; 

$fp = fsockopen ('ssl://www.sandbox.paypal.com', 443, $errno, $errstr, 30); 

fputs($fp, $header . $req); 

while (!feof($fp)) 
{ 
    $res = fgets($fp, 1024); 
    if (strcmp ($res, "VERIFIED") == 0) { 

    } else if (strcmp ($res, "INVALID") == 0) { 

    } 

    fclose ($fp); 
} 
?> 

私はPayPalのIPNシミュレータを使用する場合、それは

IPNは送信されませんでした、そしてハンドシェイクが確認されていなかったと言います。あなたの情報を確認してください。

PayPalのPHPドキュメントを正しく読み込んでいるように見えますが、このコードはうまくいくようですが、これは奇妙です。何が間違っている可能性がありますか?

+0

この回答を確認http://stackoverflow.com/questions/32586711/ipn-was-not-sent-and-the-handshake-was-not-verified-please-review-your-informa –

+0

あなたは末尾の二重 '\ r \ n'のヘッダーは最後に来ていませんか?あるいは、質問にコードをコピーする間違いですか? – bwoebi

+0

@bwoebi何を待つ?私のコードはこのページのPayPalコードに基づいて作成されましたhttps://developer.paypal.com/docs/classic/ipn/gs_IPN/ – JeffCoderr

答えて

1

バックエンドにログインしてみてください。時にはPayPals IPNリスナーは、たとえそれがあってもハンドシェイクが無効であったと言います。

+0

私に知らせてくれてありがとう:) – JeffCoderr

1

cURLを使用して同じことを実行しようとしますか?

$params = clone $_POST; 
$params['cmd'] = '_notify-validate'; 

$ch = curl_init('https://www.sandbox.paypal.com/cgi-bin/webscr'); 
curl_setopt_array($ch, array(
    CULROPT_RETURNTRANSFER=>true, 
    CURLOPT_POST=>true, 
    CURLOPT_POSTFIELDS=>$params 
)); 

$result = curl_exec($ch); 
$status = 'unknown'; 
if($result === false) { 
    $status = 'error'; 
} else { 
    if(strcmp($result, 'VERIFIED') == 0) { 
     $status = 'verified'; 
    } elseif (strcmp($result, 'INVALID') == 0) { 
     $status = 'invalid'; 
    } 
} 

echo $status; 
+0

'clone $ _POST'? $ _POSTはオブジェクトではありません... – bwoebi

1

問題は、お客様のリクエストが400 Bad Requestを返すことです。

要求は、このようにHTTP/1.1が必要とするHostヘッダを(要求は、それが遭遇する最初\r\nシーケンスによって終了し、ホストヘッダーがこの後のみ渡される)、含有しないからです要求が失敗します。

さて、最初Hostヘッダ置く:

$header = "POST /cgi-bin/webscr HTTP/1.1\r\n"; 

$header .= "Host: www.sandbox.paypal.com:443\r\n"; 

$header .= "Content-Type: application/x-www-form-urlencoded\r\n"; 
$header .= "Content-Length: " . strlen($req) . "\r\n\r\n"; 

をし、それが動作するはずです。 (少なくとも私はローカルに適切な200 OKの返事を得た)。他の問題があるかもしれませんが、これらは無関係です。

[btw。はい、paypalドキュメントのコードは間違っているようです。]