diff --git a/src/Payum/YiiExtension/PaymentController.php b/src/Payum/YiiExtension/PaymentController.php index f89966e..e1bff74 100644 --- a/src/Payum/YiiExtension/PaymentController.php +++ b/src/Payum/YiiExtension/PaymentController.php @@ -2,31 +2,59 @@ namespace Payum\YiiExtension; use Payum\Core\Request\BinaryMaskStatusRequest; +use Payum\Core\Request\InteractiveRequestInterface; use Payum\Core\Request\Http\RedirectUrlInteractiveRequest; use Payum\Core\Request\SecuredCaptureRequest; +use Payum\Core\Exception\LogicException; class PaymentController extends \CController { + public function init() + { + parent::init(); + + \Yii::app()->attachEventHandler('onException', array($this, 'handleException')); + } + public function actionCapture() { $token = $this->getPayum()->getHttpRequestVerifier()->verify($_REQUEST); $payment = $this->getPayum()->getRegistry()->getPayment($token->getPaymentName()); - $payment->execute($status = new BinaryMaskStatusRequest($token)); + $status = new BinaryMaskStatusRequest($token); + $payment->execute($status); - if ($interactiveRequest = $payment->execute(new SecuredCaptureRequest($token), true)) { - if ($interactiveRequest instanceof RedirectUrlInteractiveRequest) { - $this->redirect($interactiveRequest->getUrl(), true); - } - - throw new \LogicException('Unsupported interactive request', null, $interactiveRequest); - } + $capture = new SecuredCaptureRequest($token); + $payment->execute($capture); $this->getPayum()->getHttpRequestVerifier()->invalidate($token); $this->redirect($token->getAfterUrl()); } + public function handleException(\CExceptionEvent $event) + { + if (false == $event->exception instanceof InteractiveRequestInterface) { + return; + } + + $interactiveRequest = $event->exception; + + if ($interactiveRequest instanceof RedirectUrlInteractiveRequest) { + $this->redirect($interactiveRequest->getUrl(), true); + $event->handled = true; + return; + } + + $ro = new \ReflectionObject($interactiveRequest); + + $event->exception = new LogicException( + sprintf('Cannot convert interactive request %s to Yii response.', $ro->getShortName()), + null, + $interactiveRequest + ); + } + /** * @return \Payum\YiiExtension\PayumComponent */