如何使用 symfony2.8 为 Payum Payment Bundle 的第一次测试生成 url
How to generate a url for the first test of Payum Payment Bundle with symfony2.8
我正在尝试将 payum 支付包集成到 symfony 2.8
我的最终目标是处理 paypal 订阅申请。
我已经按照 here 所述完成了第一次设置。
但是我不知道如何测试或从哪里开始。
有public function prepareAction()
,我想一开始我应该访问这里。
所以我输入 route.yml
acme_payment:
resource: "@AcmePaymentBundle/Resources/config/routing.yml"
prefix: /payment
在我的 Acme/PaymentBundle/Resources/config.routing.yml
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
有关
我认为此错误出现在 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(),
),
));
}
}
}
在您的 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 }
然后在 PaymentController.php
中的 prepareAction
方法中更改 done 路由:
$captureToken = $this->get('payum')->getTokenFactory()->createCaptureToken(
$gatewayName,
$payment,
'acme_payment_done' // NOTE: I replaced `done` with `acme_payment_done`
);
我从未使用过 payum 捆绑包,但希望对您有所帮助。
我正在尝试将 payum 支付包集成到 symfony 2.8
我的最终目标是处理 paypal 订阅申请。
我已经按照 here 所述完成了第一次设置。
但是我不知道如何测试或从哪里开始。
有public function prepareAction()
,我想一开始我应该访问这里。
所以我输入 route.yml
acme_payment:
resource: "@AcmePaymentBundle/Resources/config/routing.yml"
prefix: /payment
在我的 Acme/PaymentBundle/Resources/config.routing.yml
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
有关我认为此错误出现在 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(),
),
));
}
}
}
在您的 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 }
然后在 PaymentController.php
中的 prepareAction
方法中更改 done 路由:
$captureToken = $this->get('payum')->getTokenFactory()->createCaptureToken(
$gatewayName,
$payment,
'acme_payment_done' // NOTE: I replaced `done` with `acme_payment_done`
);
我从未使用过 payum 捆绑包,但希望对您有所帮助。