2011-01-31 6 views
8

指定したnotifyURLへのPayPal IPN POST要求が実際にPayPalから送信されていることを確認するにはどうすればよいですか?IPNコールがPayPalからのものであることを検証しますか?

以前に送信したものとデータを比較することを意味するものではありませんが、このPayPalリクエストのサーバー/ IPアドレスが本当に有効なものであることを確認するにはどうすればよいですか?

+0

方法が万全ではありませんし、本当にあなたがすでにあるよりも、あなたがはるかに安全なことはありません。 PayPalの推奨するベストプラクティスを実装します。彼らが安全でない場合、PayPalは、ブランド全体がユーザーの信頼に基づいて構築されているため、より大きな問題を抱えています。 – Brad

答えて

16

IPNプロトコルは3つの のステップで構成されています

  1. PayPalはあなたのIPNリスナーイベントを通知 メッセージを送信
  2. あなたのリスナーがPayPalに戻って完全な 変更されていないメッセージを送信します。 メッセージは、同じ順序で同じフィールド が含まれている必要があり、元のメッセージ
  3. PayPalは メッセージ がペイパル又は誤っているときで発信された場合のいずれかで確認され、バック単一ワードを送信するよう に同じ方法で符号化されます 私の記憶が正しければ は、もともと

https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&content_ID=developer/e_howto_admin_IPNIntro

+0

ありがとう、私はそれを認識していると私は正確にそれをやっている...しかし、私は二倍に自分のIPNリスナーを呼び出すそのPayPalを確認することができますか? (コピーして貼り付けたステップ1)? – siliconpi

+0

必要がある理由はありますか?結局のところ、上記で概説した3ステップのプロセスの全体的なポイントは、誰かがあなたのIPNリスナーに電話し、依然としてVERIFIED応答を得ることは不可能だということです。 – Amber

+0

私はman-in-the-middleタイプの攻撃に100%慣れていませんが、PayPalからのリクエストがより慎重になると確信しています。 – siliconpi

1

に送られたものとの矛盾、目がありますe PayPalは、IPNコールに静的IPを使用します。

したがって、正しいIPが存在するかどうかを確認する必要があります。

または、gethostbyaddrまたはgethostbynameを使用できます。

+0

+1は静的であるかもしれないことを思い出させるためです。 IPNプログラミングをしてから何年も経ちました。 –

-1

これはwhat I useです:

if (preg_match('~^(?:.+[.])?paypal[.]com$~', gethostbyaddr($_SERVER['REMOTE_ADDR'])) > 0) 
{ 
    // came from paypal.com (unless your server got r00ted) 
} 
+0

ドメインblablablarandomstuffpaypal.comを購入したらどうなりますか?この正規表現と一致しないでしょうか? '' paypalの前の '。 ''がこれを修正すべきです。 – aularon

+0

@aularon: '^'のために一致しません。 –

+0

完全に正しい!私の悪い:) – aularon

11

は、これは私がPayPalが示唆あたりとしても、それを行うに発見した最も簡単な方法です。私はhttp_build_query()を使用して、paypalからサイトに送信された投稿からURLを構築します。 Paypalのドキュメントには、これを検証のために送り返す必要があることが記載されています。これは、file_get_contentsで行うことです。あなたは

$verify_url = 'https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_notify-validate&' . http_build_query($_POST); 

if(!strstr(file_get_contents($verify_url), 'VERIFIED')) return false; 
+1

を参照してください。実際にpaypalは、身体をPOSTする必要があります:https://developer.paypal.com/webapps/developer/docs/classic/ipn/integration-guide/IPNIntro/ – acidtv

+0

HTTPヘッダUser-Agentが必要です! –

2

https://gist.github.com/mrded/a596b0d005e84bc27bad

function paypal_is_transaction_valid($data) { 
    $context = stream_context_create(array(
    'http' => array(
     'header' => "Content-type: application/x-www-form-urlencoded\r\n", 
     'method' => 'POST', 
     'content' => http_build_query($data), 
    ), 
)); 
    $content = file_get_contents('https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_notify-validate', false, $context); 

    return (bool) strstr($content, 'VERIFIED'); 
} 
3

...私は単語「VERIFIED」が存在であり、我々はfalseを返していない場合ので、我々は、関数内で継続かどうかをチェックするためにはstrstrを使用することに注意しますHTTP header User-Agentは今必要です! IPNポストが戻ってどこから来たのか検証するためにここに記載されている

$vrf = file_get_contents('https://www.paypal.com/cgi-bin/webscr?cmd=_notify-validate', false, stream_context_create(array(
    'http' => array(
     'header' => "Content-type: application/x-www-form-urlencoded\r\nUser-Agent: MyAPP 1.0\r\n", 
     'method' => 'POST', 
     'content' => http_build_query($_POST) 
    ) 
))); 

if ($vrf == 'VERIFIED') { 
    // Check that the payment_status is Completed 
    // Check that txn_id has not been previously processed 
    // Check that receiver_email is your Primary PayPal email 
    // Check that payment_amount/payment_currency are correct 
    // process payment 
} 
+0

素晴らしい!これは私のために働いた –

+0

私がサンドボックスでテストしている場合、URLはwww.sandbox.paypal.comで認証されるか、www.paypal.comになりますか? – Volomike

関連する問題