2012-01-04 15 views
2

WebアプリケーションでPayPal IPNを設定しようとしていますが、hereというサンプルPHPスニペットのPayPalのドキュメントからコピーしました。PayPal IPN with fsockopen NULLを返します

しかし、PayPalのサンドボックスでテストしているときに、シミュレータでIPNを送信すると、hereと表示されます。

PayPalがIPNを送信するとき、私はfsockopenで接続を開こうとするときにvar_exportを実行するとNULLになります。

fsockopen接続がNULLの場合、コードでこれ以上進まない理由はわかりません。

私は自分のアプリケーションのためにCodeIgniterのを使っていて、これが失敗したコードの一部です:

if($this->uri->segment(3) == 'ipn') 
{ 
    $error_msg = ''; 

    $error_msg .= " initiated "; 

    $req = 'cmd=_notify-validate'; 

    $error_msg .= " \n\n req: " . var_export($req, true); 

    foreach($this->input->post() as $key => $value) 
    { 
     $value = urlencode(stripslashes($value)); 
     $req .= "&" . $key . "=" . $value; 
    } 

    $error_msg .= " \n\n req: " . var_export($req, true); 

    $header = ''; 
    $header .= "POST /cgi-bin/webscr HTTP/1.0\r\n"; 
    $header .= "Content-Type: application/x-www-form-urlencoded\r\n"; 
    $header .= "Content-Length: " . strlen($req) . "\r\n\r\n"; 

    $error_msg .= " \n\n headers: " . var_export($header, true); 

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

    $error_msg .= " \n\n fp: " . var_export($fp, true); 

私は、データをログに記録する$error_msgを使用し、これがログに記録されているものの例である:

initiated 

req: 'cmd=_notify-validate' 

req: 'cmd=_notify-validate&test_ipn=1&payment_type=echeck&payment_date=17%3A30%3A40+Jan+03%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=DX4WYSur44CQICgO2lC%2FB10NmdaiPNH3xPZXQNAlfrEqpse0xnime22zaNXDFgbRrOL4Xsz4emkhqFw4JhOSHzCtaHt9%2B0p9p8xW6R71PVbFXNyEVjkPeHNdQm32PJg&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=4014130&notify_version=2.1&custom=xyz123&invoice=abc1234&charset=windows-1252&verify_sign=An5ns1Kso7MWUdW4ErQKJJJ4qi4-AN8d2a.xggmx9Dn4AgHpvPHJHTAp' 

headers: 'POST /cgi-bin/webscr HTTP/1.0 
Content-Type: application/x-www-form-urlencoded 
Content-Length: 969 

' 

fp: NULL 

ご覧のとおり、$fpは、ログに記録されたデータの最終行にNULLを返しています。なぜこれが起こっているのか考えていますか?

私は私を確認することができOpenSSLが有効になっており、私のサーバーにインストールされている:

enter image description here

EDIT:ちょうどgoogle.comにポート80でfsockopenをテストし、私はまだありませんエラー番号またはメッセージでNULLを取得します。したがって、この問題はすべてのURLで発生します。

EDIT#2:これを行うことによって、私のサーバーでテスト:警告

メッセージ::fsockopenの():接続することができませんでし

fsockopen('ssl://www.paypal.com/cgi-bin/webscr', 443, $errno, $errstr, 30) 

A PHPエラーが

重要度を発生しました〜 ssl://www.paypal.com/cgi-bin/webscr:443(php_network_getaddresses: getaddrinfoが失敗しました:ノード名も提供されていない、または知られていません)

+0

がサーバー上で有効にOpenSSLサポートです? – subroutines

+0

うん、私のスクリーンショットを見てください。 – MacMac

+0

'var_export'の代わりに' var_dump'を使うと、 'var_export'は"変数の解析可能な文字列表現 "を返します。要するに、あなたのコードに何も問題はありません。 – subroutines

答えて

1

私はPayPal IPNでこれを持っていたので、これは外付けPOSTSをすべてブロックすることに注意してください。前回のペイパルIPNでこれを持っていました。 .PHP):私は、これは問題になる可能性が推測している

if(stripos($_SERVER["REQUEST_URI"],'/paypal') === FALSE) { 
    // disable CSRF for the /paypal 
    $config['csrf_protection'] = TRUE; 
} else { 
    $config['csrf_protection'] = FALSE; 
} 

CIは、セキュリティ上の理由から、あなたの$_POST/$_GET VARSをレビューとしてデータがキャプチャされないであろうと、あなたはnullになるだろう。

あなたの質問に間違いがあり、トラックが途絶えている場合は、コメントを介してお知らせください。

0

変数$errno$errstrには、おそらく失敗の理由があります。エラーメッセージでそれらをエコーし​​ます。

+0

'$ errno'には' 0'、 'var_export'を使うときは' $ errstr'に ''''を返します。 – MacMac

+0

それは独特です。それはエラーを示唆していません。他の奇妙なことは、エラーが発生した場合です.fsockopenは 'null'ではなく' false'を返すべきです。トラブルシューティングに役立つように、ポート80(google.comなど)への接続を開こうとするとよいでしょうか。 – SpoonNZ

+0

Hmm、 '80 'ポートの' google.com'はエラー番号とメッセージなしで 'NULL'を返します。 – MacMac

1

チェックリスト

  1. サンドボックスURL: "https://www.sandbox.paypal.com/cgi-bin/webscr"。
  2. PayPalコントローラのCSRFを無効にする必要があります。
  3. IPNはlocalhostで検証されませんが、varsを取​​り戻す必要があります。
  4. var_dump(fsockopen( 'https://www.sandbox.paypal.com/'、443、$ errno、$ errstr、30));
  5. var_dump($ _POST);
2

誰にも同じ問題を抱えている場合は、代わりにSSL

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

そしてPaypalsサンドボックスの使用上のごテスト場合のHTTPSを使用してみてくださいは:

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

これは私のために働いた。ありがとうございました。 –

関連する問題