2016-03-27 13 views
0

Ich versuche, ominipay mit PayPal Express Checkout in meiner Website zu integrieren. Ich habe eine Tabelle commande (Auftrag in Englisch), wo ich die Referenz, das Datum, user_id, commande => speichern [commande speichert: priceTTC, priceHT, Adresse, Menge, Token].Integration von Omnipay mit PayPal Express Checkout [symfony2]

Wenn der Benutzer klicken Sie auf den Button Pay ich diesen Fehler haben:

Controller "FLY\BookingsBundle\Controller\PayController::postPaymentAction" for URI "/payment/2" is not callable.

Das ist mein validation.html.twig

<form action="{{ path('postPayment', { 'id' : commande.id }) }}" 
    method="POST"/> 
    <input name="token" type="hidden" value="{{ commande.commande.token }}" /> 
    <input name="price" type="hidden" value="{{ commande.commande.priceTTC }}" /> 
    <input name="date" type="hidden" value="{{ commande.date|date('dmyhms') }}" /> 
    <button type="submit" class="btn btn-success pull-right">Pay</button> 
    </form> 

routing.yml

postPayment: 
    pattern: /payment/{id} 
    defaults: { _controller: FLYBookingsBundle:Pay:postPayment } 

getSuccessPayment: 
    pattern: /success/{id} 
    defaults: { _controller: FLYBookingsBundle:Pay:getSuccessPayment } 

PayController.php

class PayController extends Controller 
{ 

    public function postPayment (Commandes $commande) 
    { 
     $params = array(
      'cancelUrl' => 'here you should place the url to which the users will be redirected if they cancel the payment', 
      'returnUrl' => 'here you should place the url to which the response of PayPal will be proceeded', // in your case    // you have registered in the routes 'payment_success' 
      'amount' => $commande->get('priceTTC'), 
     ); 

     session()->put('params', $params); // here you save the params to the session so you can use them later. 
     session()->save(); 

     $gateway = Omnipay::create('PayPal_Express'); 
     $gateway->setUsername('xxxxxxxxx-facilitator_api1.gmail.com'); // here you should place the email of the business sandbox account 
     $gateway->setPassword('xxxxxxxxxxxxxx'); // here will be the password for the account 
     $gateway->setSignature('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'); // and the signature for the account 
     $gateway->setTestMode(true); // set it to true when you develop and when you go to production to false 
     $response = $gateway->purchase($params)->send(); // here you send details to PayPal 

     if ($response->isRedirect()) { 
      // redirect to offsite payment gateway 
      $response->redirect(); 
     } 
     else { 
      // payment failed: display message to customer 
      echo $response->getMessage(); 
     } 
    } 

.

public function getSuccessPayment (Auth $auth, Transaction $transaction) 
    { 
     $gateway = Omnipay::create('PayPal_Express'); 
     $gateway->setUsername('xxxxxxxxxxx-facilitator_api1.gmail.com\''); // here you should place the email of the business sandbox account 
     $gateway->setPassword('xxxxxxxxxxxxxxxx'); // here will be the password for the account 
     $gateway->setSignature('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'); // and the signature for the account 
     $gateway->setTestMode(true); 
     $params = session()->get('params'); 
     $response = $gateway->completePurchase($params)->send(); 
     $paypalResponse = $response->getData(); // this is the raw response object 

     if(isset($paypalResponse['PAYMENTINFO_0_ACK']) && $paypalResponse['PAYMENTINFO_0_ACK'] === 'Success') { 
      // here you process the response. Save to database ... 

     } 
     else { 
      // Failed transaction ... 
     } 
    } 
} 
+0

Dies sieht eher wie ein Symfony-Problem als ein Omnipay-Problem aus. Was Sie dort in Ihrer Controller-Aktion tun, sieht aus Omnipay-Sicht korrekt aus, aber die Fehlermeldung scheint darauf hinzuweisen, dass der Symfony-Router Ihren Controller nicht findet. Ich bin kein Symfony-Experte, aber vielleicht muss Ihre Controller-Aktion postPaymentAction anstelle von postPayment benannt werden? – delatbabel

+0

Ich löschte die Route in routing.yml und ich erstellte eine Route oben auf meinem Controller wie folgt: '/ ** * * @Route ("/", name =" bezahlen ") * @Method (" GET ") * /' dann in validation.html.twig habe ich den Pfad um 'pay' geändert. Es scheint zu funktionieren, aber wenn ich auf den Knopf Bezahlen klicke, leite ich auf eine leere Seite um. 'http: //127.0.0.1/symfony/web/app_dev.php/? id = 34'.Ich denke, dass ich zu paypal umleiten sollte, also kann der Benutzer die Zahlung machen ...? – Sirius

+0

Ich habe auch postPayment zu postPaymentAction geändert. Jetzt habe ich diesen Fehler: 'Versuchte, Funktion" Sitzung "von Namespace" FLY \ BookingsBundle \ Controller "' 'session() aufzurufen -> put ('params', $ params);' Ich glaube, ich weiß, warum ich viele Fehler habe , weil der Controller, den ich habe, mit Laravel und nicht mit Symfony2 arbeitet. – Sirius

Antwort

1

Eine aufrufbare Symfony-Controller-Methode sollte mit dem Action-Wort enden.

public function postPayment(...) ->public function postPaymentAction(...)

Dann sind einige Ihrer Controller-Methoden nicht symfony-gültig, sie scheinen Laravel Basis statt.

// Laravel 
session()->put('params', $params); // here you save the params to the session so you can use them later. 
session()->save(); 

--> 
// Symfony 

use Symfony\Component\HttpFoundation\Request; 

public function postPaymentAction(Commandes $commande, Request $request) 

$request->getSession(); // The request should be incldued as an action parameter 
$session->set('params', $params); 

Dann über die Verwendung von Omnipay selbst, würde ich sagen, dass eine 3rd-Party-Bibliothek in einem Symfony Controller eine schreckliche Praxis.

Ich empfehle Ihnen, stattdessen einen Dienst zu verwenden und Ihre Anmeldeinformationen aus der Konfiguration (möglicherweise Parameter) zu übergeben.

http://symfony.com/doc/current/service_container.html

// Direct, bad practice 
$gateway = Omnipay::create('PayPal_Express'); 
$gateway->setUsername('xxxxxxxxx-facilitator_api1.gmail.com'); // here you should place the email of the business sandbox account 
$gateway->setPassword('xxxxxxxxxxxxxx'); // here will be the password for the account 
$gateway->setSignature('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'); // and the signature for the account 
$gateway->setTestMode(true); // set it to true when you develop and when you go to production to false 

$response = $gateway->purchase($params)->send(); // here you send details to PayPal 

Sie sogar bereits ein Bündel 3rd-Party haben, das zu tun:

https://github.com/colinodell/omnipay-bundle

// Using a Service to get a full-configured gateway 
$gateway = $this->get('omnipay')->getDefaultGateway(); 

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

Sie auch die HTTP-Methoden in Ihrem Router Datei sperren könnte, auch Wenn es optional ist:

postPayment: 
    pattern: /payment/{id} 
    method: POST 
    defaults: { _controller: FLYBookingsBundle:Pay:postPayment } 

getSuccessPayment: 
    pattern: /success/{id} 
    method: GET 
    defaults: { _controller: FLYBookingsBundle:Pay:getSuccessPayment } 
+0

Vielen Dank für Ihre Antwort. Ich finde bereits eine Lösung für mein Problem, ich habe mich entschieden, PayPal Express Checkout mit Payum zu verwenden. In meinem nächsten Projekt werde ich versuchen, Omnipay zu benutzen und Ihre Antwort wird hilfreich sein. :) – Sirius