2017-01-04 16 views
0

私はSymfony 3とPayPal APIに基づいたWebサイトで作業しています。Symfony 3のIPN Paypal

symfonyの外でIPNを使用しようとしましたが、うまくいきました。

これをコントローラに実装しようとしましたが、何も起こりません。

このコードはPaypalのGithubからのものです。

public function paypalAction(Request $request){ 
    // STEP 1: Read POST data 

    // reading posted data from directly from $_POST causes serialization 
    // issues with array data in POST 
    // reading raw POST data from input stream instead. 
    $raw_post_data = $request->getContent(); 
    $raw_post_array = explode('&', $raw_post_data); 
    $myPost = array(); 
    foreach ($raw_post_array as $keyval) { 
    $keyval = explode ('=', $keyval); 
    if (count($keyval) == 2) 
     $myPost[$keyval[0]] = urldecode($keyval[1]); 
    } 
    // 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"; 
    } 


    // STEP 2: Post IPN data back to paypal to validate 

    $ch = curl_init('https://www.sandbox.paypal.com/cgi-bin/webscr'); 
    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_VERIFYPEER, 1); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); 
    curl_setopt($ch, CURLOPT_FORBID_REUSE, 1); 
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Connection: Close')); 

    // In wamp like environments that do not come bundled with root authority certificates, 
    // please download 'cacert.pem' from "http://curl.haxx.se/docs/caextract.html" and set the directory path 
    // of the certificate as shown below. 
    // curl_setopt($ch, CURLOPT_CAINFO, dirname(__FILE__) . '/cacert.pem'); 
    if(!($res = curl_exec($ch))) { 
     // error_log("Got " . curl_error($ch) . " when processing IPN data"); 
     curl_close($ch); 
     exit; 
    } 
    curl_close($ch); 


    // STEP 3: Inspect IPN validation result and act accordingly 

    if (strcmp ($res, "VERIFIED") == 0) { 
     // check whether 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 

     // assign posted variables to local variables 

     $item_name = $_POST['item_name']; 
     $item_number = $_POST['item_number']; 
     $cart_item = $_POST['num_cart_items']; 
     $payment_status = $_POST['payment_status']; 
     $payment_amount = $_POST['mc_gross']; 
     $payment_currency = $_POST['mc_currency']; 
     $txn_id = $_POST['txn_id']; 
     $receiver_email = $_POST['receiver_email']; 
     $payer_email = $_POST['payer_email']; 

     // <---- HERE you can do your INSERT to the database 
     return new Response("Paypal worked !"); 
    } else if (strcmp ($res, "INVALID") == 0) { 
     // log for manual investigation 
     return new Response("Paypal didn't worked !"); 
    } 
} 

答えて

0

申し訳ありませんが、私はこれが本当にすべきだと感じるコメントとしてまだ投稿できません。最初にログを確認してください(symfony3:/{project}/var/log/dev.log(prod.logのprod))

秒あなたのローカルホストにipnを送ることができないことを忘れています...あなたがこれをしたいなら、あなたは次のようなものを使うべきですトンネルへngrokローカルホストと、それはあなたのローカルホスト

サードを暴露されたトンネルアドレスに送信されてきた、私はPayPalのを統合し、秩序IPNバンドルメガ時間の節約したプロジェクトを終了しました。https://github.com/orderly/symfony2-paypal-ipn 受信確かにとIPNのロギングは簡単ですが、Orderlyはそれ以上のこと - 私たちは何をしなければならないのか考えなかったのです - それは非常に簡単に統合できます。けれども、このオプションを取ることを選択した場合は、これらを参照することもできますので、整然としたIPNはもはや維持されている注意していないしてくださいリクエスト https://github.com/orderly/symfony2-paypal-ipn/pull/38/files https://github.com/orderly/symfony2-paypal-ipn/pull/42/files(多分ちょうどみんなに255を設定し、いくつかのイニシアチブを使用していないが)

を引きます

これは何らかの形で役立ちます。

ああ、PS。私があなたに遭遇した何か - PayPalはデフォルトでIPNをwindows-1252として送信していましたが、私のデータベースはUTF-8でした。名前にüが付いている人が注文するまでは何の問題もなかったので、これに気を付けるのに私はしばらく時間をかけました。これを変更するにはhttps://simple-membership-plugin.com/setting-utf-8-formatting-for-your-paypal-ipn-messages/

edit:symfonyでは、$ _GETまたは$ _POSTを使用する代わりに、$ requestをpaypalActionに渡す必要があります。

0

Requestオブジェクトで以前に使用されていたため、file_get_contents('php://input');を使用することはできません。

use Symfony\Component\HttpFoundation\Request; 

... 

public function paypalAction(Request $request) 
{ 
    $raw_post_data = $request->getContent(); 
    ... 
} 
+0

IPNシミュレータがスクリプトに対応してくれてありがとうございました。しかし残念ながら、私は自分のウェブサイトに戻ったときに「PayPalは機能しませんでした。 $リクエストは空で、なぜか分からないようです。 –

0

私はさらにこれに行き、私が使用しているPayPalのボタン/フォームから問題が発生していることに気付きました。

ここでIPNと私のコントローラで完璧に動作し、「今すぐ購入」ボタンのコードです:

<form action="https://www.sandbox.paypal.com/cgi-bin/webscr" method="post"> 
    <input type='hidden' value="5" name="amount" /> 
    <input name="currency_code" type="hidden" value="EUR" /> 
    <input name="shipping" type="hidden" value="0.00" /> 
    <input name="tax" type="hidden" value="0.00" /> 
    <input name="return" type="hidden" value="http://www.YOURDOMAIN.com/valid/paiement" /> 
    <input name="cancel_return" type="hidden" value="http://www.YOURDOMAIN.com/cancel/paiement" /> 
    <input name="notify_url" type="hidden" value="http://www.YOURDOMAIN.com/validation/paiement" /> 
    <input name="cmd" type="hidden" value="_xclick" /> 
    <input name="business" type="hidden" value="[email protected]" /> 
    <input name="item_name" type="hidden" value="A kind of book" /> 
    <input name="no_note" type="hidden" value="1" /> 
    <input name="lc" type="hidden" value="FR" /> 
    <input name="bn" type="hidden" value="PP-BuyNowBF" /> 
    <input name="custom" type="hidden" value="4" /> 
    <input alt="Effectuez vos paiements via PayPal : une solution rapide, gratuite et sécurisée" name="submit" src="https://www.paypal.com/fr_FR/FR/i/btn/btn_buynow_LG.gif" type="image" /><img src="https://www.paypal.com/fr_FR/i/scr/pixel.gif" border="0" alt="" width="1" height="1" /> 
</form> 

そして、これは動作しません「カートに入れる」ボタンであると私にコールバックを与えませんPayPal IPNから。私は空の応答を得ます。

<form target="paypal" action="https://www.sandbox.paypal.com/cgi-bin/webscr" method="post"> 
    <input type="hidden" name="cmd" value="_s-xclick"> 
    <input type="hidden" name="hosted_button_id" value="YOURID"> 
    <input name="return" type="hidden" value="http://www.YOURDOMAIN.com/valid/paiement" /> 
    <input name="cancel_return" type="hidden" value="http://www.YOURDOMAIN.com/cancel/paiement" /> 
    <input name="notify_url" type="hidden" value="http://www.YOURDOMAIN.com/validation/paiement" /> 
    <input type="image" src="https://www.sandbox.paypal.com/fr_FR/FR/i/btn/btn_cart_LG.gif" border="0" name="submit" alt="PayPal, le réflexe sécurité pour payer en ligne"> 
    <img alt="" border="0" src="https://www.sandbox.paypal.com/fr_FR/i/scr/pixel.gif" width="1" height="1"> 
</form> 

私が使用するボタンによってIPNが異なる理由はわかりません。

注:これらの場合、IPNシミュレータは完全に機能します。