代码之家  ›  专栏  ›  技术社区  ›  whitebear

如何使用symfony2.8为Payum支付包的第一次测试生成url

  •  0
  • whitebear  · 技术社区  · 7 年前

    我正在尝试将payum支付包集成到symfony 2.8中

    我的最终目标是处理paypal订阅应用程序。

    here .

    public function prepareAction() ,我想首先我应该访问这里。

    所以我把我的路线。yml公司

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

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

    然后尝试访问,

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

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

    我确信这与我的PaymentController有关。php

    '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('foo@example.com');
    
            $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(),
                ),
            ));
        }
    
    }
    
    
    
    }
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   Mario    7 年前

    Acme/PaymentBundle/Resources/config.routing.yml 您还需要定义您的 done 路线

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

    然后在你的 prepareAction PaymentController.php 更改完成的路线:

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