2017-09-08 3 views
0

Je suis en train d'intégrer paquet de paiement payum Symfony 2.8Comment générer une URL pour le premier test de Payum Payment Bundle avec symfony2.8

Mon but final a été traitement de la demande de souscription paypal.

J'ai terminé la configuration initiale comme décrit here.

Cependant, je ne sais pas comment tester ou par où commencer.

Il ya public function prepareAction(), je devine au début je devrais accéder ici.

Je mets dans mon route.yml

acme_payment: 
    resource: "@AcmePaymentBundle/Resources/config/routing.yml" 
    prefix: /payment 

et dans mon Acme/PaymentBundle/Ressources/config.routing.yml

acme_payment_prepare: 
    path:  /prepare 
    defaults: { _controller: AcmePaymentBundle:Payment:prepare } 

Ensuite, essayez d'accéder,

http://localhost/myapp/web/app_dev.php/payment/prepare

Cependant, il montre l'erreur comme ceci.

Unable to generate a URL for the named route "done" as such route does not exist.

Je suis sûr que cela est lié avec mon PaymentController.php

Je pense que cette erreur apparaît dans PaymentController.php, mais comment puis-je résoudre ce problème ??

'done' // the route to redirect after capture

<?php 


namespace Acme\PaymentBundle\Controller; 

use Symfony\Bundle\FrameworkBundle\Controller\Controller; 

use Payum\Core\Request\GetHumanStatus; 
use Symfony\Component\HttpFoundation\Request; 
use Symfony\Component\HttpFoundation\JsonResponse; 

class PaymentController extends Controller 
{ 
    public function prepareAction() 
    { 
     $gatewayName = 'offline'; 

     $storage = $this->get('payum')->getStorage('Acme\PaymentBundle\Entity\Payment'); 

     $payment = $storage->create(); 
     $payment->setNumber(uniqid()); 
     $payment->setCurrencyCode('EUR'); 
     $payment->setTotalAmount(123); // 1.23 EUR 
     $payment->setDescription('A description'); 
     $payment->setClientId('anId'); 
     $payment->setClientEmail('[email protected]'); 

     $storage->update($payment); 

     $captureToken = $this->get('payum')->getTokenFactory()->createCaptureToken(
      $gatewayName, 
      $payment, 
      'done' // the route to redirect after capture 
      ); 

     return $this->redirect($captureToken->getTargetUrl()); 
    } 
    public function doneAction(Request $request) 
    { 
     $token = $this->get('payum')->getHttpRequestVerifier()->verify($request); 

     $gateway = $this->get('payum')->getGateway($token->getGatewayName()); 

     // you can invalidate the token. The url could not be requested any more. 
     // $this->get('payum')->getHttpRequestVerifier()->invalidate($token); 

     // Once you have token you can get the model from the storage directly. 
     //$identity = $token->getDetails(); 
     //$payment = $this->get('payum')->getStorage($identity->getClass())->find($identity); 

     // or Payum can fetch the model for you while executing a request (Preferred). 
     $gateway->execute($status = new GetHumanStatus($token)); 
     $payment = $status->getFirstModel(); 

     // you have order and payment status 
     // so you can do whatever you want for example you can just print status and payment details. 

     return new JsonResponse(array(
      'status' => $status->getValue(), 
      'payment' => array(
       'total_amount' => $payment->getTotalAmount(), 
       'currency_code' => $payment->getCurrencyCode(), 
       'details' => $payment->getDetails(), 
      ), 
     )); 
    } 

} 



} 

Répondre

1

l'intérieur de votre Acme/PaymentBundle/Resources/config.routing.yml vous devez également définir votre itinéraire done.

Ainsi, la configuration de la route pourrait ressembler les éléments suivants:

acme_payment_prepare: 
    path:  /prepare 
    defaults: { _controller: AcmePaymentBundle:Payment:prepare } 

acme_payment_done: 
    path:  /done 
    defaults: { _controller: AcmePaymentBundle:Payment:done } 

Ensuite, à l'intérieur de votre méthode prepareAction dans le changement PaymentController.php l'itinéraire fait:

$captureToken = $this->get('payum')->getTokenFactory()->createCaptureToken(
    $gatewayName, 
    $payment, 
    'acme_payment_done' // NOTE: I replaced `done` with `acme_payment_done` 
); 

Je ne l'ai jamais utilisé le paquet de payum mais je J'espère que cela pourra aider.