2017-02-15 4 views
1

Je suis nouveau à Laravel. J'ai eu du mal à mettre en œuvre Paypal Express Checkout sur mon site Web pendant quelques jours afin de permettre des dons à une organisation à but non lucratif. Merci à these explanations J'ai pu installer Omnipay, laisser l'utilisateur entrer le montant qu'il veut donner et aller à Paypal. Mais, lorsque j'essaie de mettre fin à la transaction (Payer), je ne suis pas redirigé vers mon message de réussite. Mon compte bac à sable ne montre aucune transaction non plus, il semble donc que le paiement n'est pas terminé correctement. Je devine qu'il ya quelque chose de mal avec ma fonction « getSuccessPayment », mais je ne peux pas comprendre ce qu'il est ...Laravel 5.3 - Omnipay Paypal Express ne pas retourner le message de succès

Voici mon contrôleur jusqu'à présent:

<?php namespace App\Http\Controllers; 
use Omnipay\Omnipay; 
use Session; 
use App\Http\Requests\PaymentRequest; 

class PaymentController extends Controller { 

    public function postPayment(PaymentRequest $request) 
    { 
     $price = $request->get('price'); 

     $items[] = array('name' => 'Don', 'quantity' => 1, 'price' => $price); 

     $params = array(
      'cancelUrl'=>url('/donner'), 
      'returnUrl'=>url('/payment_success'), 
      'amount' => $price, 
      'currency' => 'EUR' 
     ); 

     Session::put('params', $params); 
     Session::save(); 

     $gateway = Omnipay::create('PayPal_Express'); 
     $gateway->setUsername('my sandbox email'); 
     $gateway->setPassword('my sandbox password'); 
     $gateway->setSignature('my sandbox signature'); 
     $gateway->setTestMode(true); 

     $response = $gateway->purchase($params)->setItems($items)->send(); 

     if ($response->isSuccessful()) { 
      print_r($response); 
     } elseif ($response->isRedirect()) { 
      $response->redirect(); 
     } else { 
      echo $response->getMessage(); 
     } 
    } 

    public function getSuccessPayment() 
    { 

     $gateway = Omnipay::create('PayPal_Express'); 
     $gateway->setUsername('my sandbox email'); 
     $gateway->setPassword('my sandbox password'); 
     $gateway->setSignature('my sandbox signature'); 
     $gateway->setTestMode(true); 

     $params = Session::get('params'); 
     $response = $gateway->completePurchase($params)->send(); 
     $paypalResponse = $response->getData(); 

     if(isset($paypalResponse['PAYMENTINFO_0_ACK']) && $paypalResponse['PAYMENTINFO_0_ACK'] === 'Success') { 
      return redirect('/payment_success'); 

     } else { 
      //payment fails 
     return redirect('/payment_failure'); 

     } 
    } 
} 
?> 

Et mes routes:

Route::post('donner', 
    ['as' => 'payment', 'uses' => '[email protected]']); 

Route::get('payment_success', '[email protected]'); 

Route::get('payment_failure', '[email protected]'); 
+0

Bonjour @mefimefi merci pour cela. J'ai passé toute la journée à essayer de faire quelque chose qu'ils ont dit qu'il était difficile d'installer omnipay/paypal sur ma version de laravel 5.3.30. J'ai finalement réussi à le craquer aujourd'hui. D'abord dans votre terminal: 'composer require symfony/event-dispatcher:^2.8'. après cette exécution dans le terminal: 'composer require omnipay/paypal:" 2.6.3 "'. Bien sûr, ma version de paypal est la version actuelle (vous pouvez aussi mettre composeur require omnipay/paypal: *). J'espère que cela aide quelqu'un. :) – Matija

+0

J'ai oublié un dernier: 'composer require ignited/laravel-omnipay:" 2.3.0 "' et cela devrait le faire. Après cela, vous devez fournisseur de services: «Ignited \ LaravelOmnipay \ LaravelOmnipayServiceProvider», et Alias: «Omnipay» => «Allumé \ LaravelOmnipay \ Facades \ OmnipayFacade», 'dans * config/app.php * – Matija

Répondre

0

Lorsque vous créez vos paramètres de la passerelle que vous en passant /donner comme returnUrl, c'est là vos utilisateurs sont retournés après avoir terminé la connexion et PayPal express confirmation de paiement afin Laravel regarderait Route::get('donner'... itinéraire w que vous n'avez pas, changer cela à 'returnUrl'=>url('/payment_success'), ramènera vos utilisateurs à votre route de succès et vous permettre de déposer l'appel completePurchase.

Modifier pour plus de détails sur la base questions et commentaires Modifié:

Les clients sont retournés à votre returnUrl si le compléter avec succès les écrans de connexion et paiement PayPal, ils vont à la cancelUrl si, pour une raison quelconque, ils ont quitté le processus.

Dans votre [email protected] méthode paypal renverra un token et payerID dans la chaîne de requête (www.example.com/payment_success?token=EC-12345 & PayerID = ABC123, Omnipay-paypal automatiquement chercher à ce sujet dans la completePurchase appel qui est l'endroit où vous êtes efficace confirmation avec PayPal que le client a terminé correctement la caisse et que l'opération a réussi.

pour éviter toute confusion, je renommer votre itinéraire Route::get('payment_success', '[email protected]'); actuel à quelque chose comme Route::get('complete_payment', '[email protected]'); et de créer une nouvelle route payment_success que un utilisateur est envoyé après que vous avez confirmé l'état du paiement avec PayPa l.

+0

Merci pour votre répondre. Je pensais que returnUrl était seulement utilisé quand un problème est survenu pendant le paiement. Mon erreur. Il y a quand même quelque chose que je ne comprends pas: si returnUrl est défini comme un paramètre fixe, comment puis-je savoir si le paiement a réussi? Mon intention initiale était de rediriger vers une URL en cas de succès (payment_success) et une autre en cas d'échec (payment_failure). Comment puis-je y parvenir avec un seul retourUrl? – Mefimefi

+0

@Mefimefi vérifier le modifier à ma question (histoire courte, vous êtes déjà en train de vérifier si le paiement est réussi une fois que le client vous revient sur le '' if (isset ($ paypalResponse ['PAYMENTINFO_0_ACK']) && ... '' line). – cfreear

+0

Un autre conseil: Google [préfère] (https://support.google.com/webmasters/answer/76329?hl=fr) nous utilisons '' -'' au lieu de '' _'' dans les URL – cfreear