2014-06-06 5 views
3

방금 ​​Payum 번들을 설치하고 구성했습니다. 예외가 발생했습니다.Symfony2 Payum Bundle - SecuredCaptureRequest 요청 {model : Payment}가 지원되지 않습니다.

요청 SecuredCaptureRequest {model : Payment}는 지원되지 않습니다.

PaymentController의 preparePaypalExpressCheckoutPaymentAction에서을 리디렉션 한 후 이 발생합니다.

Payum의 설정 :

payum: 
    contexts: 
     payment_with_paypal_express: 
      storages: 
       Service\Bundle\PaymentBundle\Entity\Payment: 
        doctrine: 
         driver: orm 
      paypal_express_checkout_nvp: 
       api: 
        options: 
         username: %paypal.express.username% 
         password: %paypal.express.password% 
         signature: %paypal.express.signature% 
         sandbox: %paypal.express.sandbox% 
    security: 
     token_storage: 
      Service\Bundle\PaymentBundle\Entity\PayumSecurityToken: 
       doctrine: 
        driver: orm 

지불 컨트롤러 :

class PaymentController extends HelperController 
{ 
    public function preparePaypalExpressCheckoutPaymentAction() 
    { 
     $paymentName = 'payment_with_paypal_express'; 

     $storage = $this->get('payum')->getStorageForClass(
      'Service\Bundle\PaymentBundle\Entity\Payment', 
      $paymentName 
     ); 
     # ---- Set payment details below 

     $package = $this->getPackageRepository()->loadOneByAliasAndDuration(Package::TYPE_SUBSCRIPTION,1); 
     $accountPackages = new ArrayCollection(); 
     $accountPackages->add((new AccountPackage())->setPackage($package)->setQuantity(1)); 

     /** 
     * @var Payment $payment 
     */ 
     $payment = $storage->createModel(); 
     # Account must be set first, packages must be set before paid attribute 
     $payment->setAccount($this->getAccount()) 
       ->setPackages($accountPackages) 
       ->setPaid(false); 

     # ---- Set payment details above 

     $storage->updateModel($payment); 

     $captureToken = $this->get('payum.security.token_factory')->createCaptureToken(
      $paymentName, 
      $payment, 
      'service_payment_done' // the route to redirect after capture; 
     ); 

     $payment->setReturnUrl($captureToken->getTargetUrl()) 
       ->setCancelUrl($captureToken->getTargetUrl()); 

     $storage->updateModel($payment); 

     return $this->redirect($captureToken->getTargetUrl()); 
    } 

    public function paymentDoneAction(Request $request) 
    { 
     $token = $this->get('payum.security.http_request_verifier')->verify($request); 

     $payment = $this->get('payum')->getPayment($token->getPaymentName()); 

     # $paymentDetails = $token->getDetails(); 

     $status = new BinaryMaskStatusRequest($token); 

     $payment->execute($status); 

     if ($status->isSuccess()) { 
      $this->getUser()->addCredits(100); 
      $this->get('session')->getFlashBag()->set(
       'notice', 
       'Payment success. Credits were added' 
      ); 
     } 
     else if ($status->isPending()) { 
      $this->get('session')->getFlashBag()->set(
       'notice', 
       'Payment is still pending. Credits were not added' 
      ); 
     } 
     else { 
      $this->get('session')->getFlashBag()->set('error', 'Payment failed'); 
     } 

     return $this->redirect('service_home'); 
    } 
} 

누군가가 내가 잘못 뭐하는 거지 어떤 힌트가 있습니까? 공식 문서에서 지불 세부 사항은 객체/배열 (약간 혼란 스럽다)로 제시되었지만, 내 컨트롤러에서 객체로 만들었습니다.

답변

3

나는 그것을 해결했다. Payum에서 ArrayObject로 지불 세부 사항을 연장하는 것을 잊었습니다 :)

+0

또는 'implements \ ArrayAccess, \ IteratorAggregate'를 클래스에만 추가 할 수도 있습니다 –