2017-01-04 2 views
0

Я работаю на веб-сайте, основанном на Symfony 3 и API PayPal.IPN Paypal в Symfony 3

Я пытался использовать IPN за пределами Symfony, и он работал хорошо.

Теперь я пытаюсь реализовать это в своем контроллере, и ничего не происходит.

Этот код исходит от Github в Paypal.

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) и сообщите нам что-нибудь, связанное с вашими запросами.

Second , отправляются ли IPN и где? Что-то, что люди пропускают, это то, что они будут запускать проект symfony локально и забыть, что paypal не может отправить его ipn на ваш локальный компьютер ... Если вы хотите сделать это, вы должны использовать что-то вроде ngrok туннель ваш локальный и затем он отправляется на адрес туннеля, который обнажая свой Localhost

в-третьих, я только что закончил проект, интегрированный Paypal и Упорядоченная IPN Bundle был мега экономия времени. https://github.com/orderly/symfony2-paypal-ipn Конечно прием и регистрация IPN проста, но намного больше, чем то, что мы должны делать, но не думали - и это очень легко интегрировать. Хотя, пожалуйста, обратите внимание Дежурный 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/

Редактировать: в symfony вы также должны передавать запрос $ request в paypalAction вместо $ _GET или $ _POST, хотя они будут работать.

0

Вы не можете использовать file_get_contents('php://input');, так как объект Request использовал его раньше.

use Symfony\Component\HttpFoundation\Request; 

... 

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

Спасибо, что помогло, так как симулятор IPN работает теперь с моим скриптом.Но, к сожалению, я все еще получаю «PayPal не работал», когда я вернулся на свой сайт. Похоже, что $ request пуст, и я не знаю, почему. –

0

Ну, я пошел дальше, и я заметил, что проблема связана с кнопками/формами PayPal, которые я использую.

Вот код из «Купить сейчас» кнопки, которая прекрасно работает с СПИ и мой контроллер:

<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> 

И это кнопка «Добавить в корзину», которая не работает и не дает мне обратный вызов от PayNal 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 отлично работает.

 Смежные вопросы

  • Нет связанных вопросов^_^