使用Symfony2设置Payum Bundle会出错

时间:2015-01-26 11:02:58

标签: php symfony paypal payment-gateway payum

我正在使用Symfony 2.6并尝试设置PayumBundle(paypal express checkout)并且我收到错误

InvalidConfigurationException in BaseNode.php line 313: Invalid configuration for path "payum.security.token_storage": The storage entry must be a valid model class. It is set Acme\featuresBundle\Entity\PaymentToken

我正在按照documetation

中提到的步骤进行操作

这就是我的config.yml看起来像

的方式
    doctrine:
        orm:
            auto_generate_proxy_classes: "%kernel.debug%"
            entity_managers:
                default:
                    auto_mapping: true
                    mappings:
                        payum:
                            is_bundle: false
                            type: xml
                            dir: %kernel.root_dir%/../vendor/payum/core/Payum/Core/Bridge/Doctrine/Resources/mapping
                            prefix: Payum\Core\Model

    payum:
        security:
            token_storage:
                Acme\featuresBundle\Entity\PaymentToken: { doctrine: orm }

        storages:
            Acme\featuresBundle\Entity\PaymentDetails: { doctrine: orm }

        contexts:
            paypal:
                paypal_express_checkout_nvp:
                    username: 'asdasd'
                    password: 'adsasd'
                    signature: 'asdasdasd'
                    sandbox: true

这是我的实体PaymentToken

namespace Acme\featuresBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Payum\Core\Model\Token;

/**
 * @ORM\Table
 * @ORM\Entity
 */
class PaymentToken extends Token
{

}

这是实体PaymentDetails

namespace Acme\featuresBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Payum\Core\Model\Order as BaseOrder;

/**
 * @ORM\Table
 * @ORM\Entity
 */
class PaymentDetails extends BaseOrder
{
    /**
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     *
     * @var integer $id
     */
    protected $id;
}

我在网上和其他帖子(如this)上浏览过很多文档,但我不明白为什么会收到此错误。

The storage entry must be a valid model class. It is set Acme\featuresBundle\Entity\PaymentToken

我甚至无法访问控制器,所以有些东西告诉我,Payum的config.yml配置设置不正确。我一遍又一遍地浏览文档,我似乎无法找到我做错了什么。

我将非常感谢您在传递此错误方面提供的任何帮助。

1 个答案:

答案 0 :(得分:2)

我终于设法完成了它。

我需要4个文件

  1. PaymentController
  2. 订单(实体)
  3. PaymentToken(实体)
  4. 订单(型号)
  5. 这是我的PaymentController看起来像

    <?php
    
    namespace ClickTeck\featuresBundle\Controller;
    
    use ClickTeck\featuresBundle\Entity\Orders;
    use Symfony\Bundle\FrameworkBundle\Controller\Controller;
    use Payum\Paypal\ExpressCheckout\Nvp\Api;
    use Payum\Core\Registry\RegistryInterface;
    use Payum\Core\Request\GetHumanStatus;
    use Payum\Core\Security\GenericTokenFactoryInterface;
    use Symfony\Component\HttpFoundation\Request;
    use Symfony\Component\HttpFoundation\JsonResponse;
    use Sensio\Bundle\FrameworkExtraBundle\Configuration as Extra;
    
    
        class PaymentController extends Controller
        {
            public function preparePaypalExpressCheckoutPaymentAction(Request $request)
            {
                $paymentName = 'paypal';
                $eBook = array(
                    'author' => 'Jules Verne',
                    'name' => 'The Mysterious Island',
                    'description' => 'The Mysterious Island is a novel by Jules Verne, published in 1874.',
                    'price' => 8.64,
                    'currency_symbol' => '$',
                    'currency' => 'USD',
                    'clientId' => '222',
                    'clientemail' => 'xyz@abc.com'
                );
    
    
    
                $storage = $this->get('payum')->getStorage('ClickTeck\featuresBundle\Entity\Orders');
                /** @var $paymentDetails Orders */
                $paymentDetails = $storage->create();
    
                $paymentDetails->setNumber(uniqid());
                $paymentDetails->setCurrencyCode($eBook['currency']);
                $paymentDetails->setTotalAmount($eBook['price']);
                $paymentDetails->setDescription($eBook['description']);
                $paymentDetails->setClientId($eBook['clientId']);
                $paymentDetails->setClientEmail($eBook['clientemail']);
    
    
                $paymentDetails['PAYMENTREQUEST_0_CURRENCYCODE'] = $eBook['currency'];
                $paymentDetails['PAYMENTREQUEST_0_AMT'] = $eBook['price'];
                $paymentDetails['NOSHIPPING'] = Api::NOSHIPPING_NOT_DISPLAY_ADDRESS;
                $paymentDetails['REQCONFIRMSHIPPING'] = Api::REQCONFIRMSHIPPING_NOT_REQUIRED;
                $paymentDetails['L_PAYMENTREQUEST_0_ITEMCATEGORY0'] = Api::PAYMENTREQUEST_ITERMCATEGORY_DIGITAL;
                $paymentDetails['L_PAYMENTREQUEST_0_AMT0'] = $eBook['price'];
                $paymentDetails['L_PAYMENTREQUEST_0_NAME0'] = $eBook['author'].'. '.$eBook['name'];
                $paymentDetails['L_PAYMENTREQUEST_0_DESC0'] = $eBook['description'];
                $storage->update($paymentDetails);
                $captureToken = $this->getTokenFactory()->createCaptureToken(
                    $paymentName,
                    $paymentDetails,
                    'payment_done'
                );
                $paymentDetails['INVNUM'] = $paymentDetails->getId();
                $storage->update($paymentDetails);
                return $this->redirect($captureToken->getTargetUrl());
    
    
            }
    
            public function doneAction(Request $request)
            {
    
                $token = $this->get('payum.security.http_request_verifier')->verify($request);
    
                $payment = $this->get('payum')->getPayment($token->getPaymentName());
    
                // you can invalidate the token. The url could not be requested any more.
                // $this->get('payum.security.http_request_verifier')->invalidate($token);
    
                // Once you have token you can get the model from the storage directly.
                //$identity = $token->getDetails();
                //$order = $payum->getStorage($identity->getClass())->find($identity);
    
                // or Payum can fetch the model for you while executing a request (Preferred).
                $payment->execute($status = new GetHumanStatus($token));
                $order = $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(),
                    'response' => array(
                        'order' => $order->getTotalAmount(),
                        'currency_code' => $order->getCurrencyCode(),
                        'details' => $order->getDetails(),
                    ),
                ));
    
            }
    
            /**
             * @return RegistryInterface
             */
            protected function getPayum()
            {
                return $this->get('payum');
            }
            /**
             * @return GenericTokenFactoryInterface
             */
            protected function getTokenFactory()
            {
                return $this->get('payum.security.token_factory');
            }
    
        }
    

    这是我的Orders实体

    <?php
    
    namespace ClickTeck\featuresBundle\Entity;
    
    use Doctrine\ORM\Mapping as ORM;
    use ClickTeck\featuresBundle\Model\Orders as BasePaymentDetails;
    
    /**
     * Orders
     */
    class Orders extends BasePaymentDetails
    {
        /**
         * @var integer
         */
        protected $id;
    
        private $number;
    
        private $description;
    
        private $client_email;
    
        private $client_id;
    
        private $total_amount;
    
        private $currency_code;
    
        protected $details;
    
    
    
        /**
         * Get id
         *
         * @return integer 
         */
        public function getId()
        {
            return $this->id;
        }
    
        /**
         * Set number
         *
         * @param integer $number
         * @return Orders
         */
        public function setNumber($number)
        {
            $this->number = $number;
    
            return $this;
        }
    
        /**
         * Get number
         *
         * @return integer 
         */
        public function getNumber()
        {
            return $this->number;
        }
    
        /**
         * Set description
         *
         * @param string $description
         * @return Orders
         */
        public function setDescription($description)
        {
            $this->description = $description;
    
            return $this;
        }
    
        /**
         * Get description
         *
         * @return string 
         */
        public function getDescription()
        {
            return $this->description;
        }
    
        /**
         * Set client_email
         *
         * @param string $clientEmail
         * @return Orders
         */
        public function setClientEmail($clientEmail)
        {
            $this->client_email = $clientEmail;
    
            return $this;
        }
    
        /**
         * Get client_email
         *
         * @return string 
         */
        public function getClientEmail()
        {
            return $this->client_email;
        }
    
        /**
         * Set client_id
         *
         * @param string $clientId
         * @return Orders
         */
        public function setClientId($clientId)
        {
            $this->client_id = $clientId;
    
            return $this;
        }
    
        /**
         * Get client_id
         *
         * @return string 
         */
        public function getClientId()
        {
            return $this->client_id;
        }
    
        /**
         * Set total_amount
         *
         * @param float $totalAmount
         * @return Orders
         */
        public function setTotalAmount($totalAmount)
        {
    
            $this->total_amount = $totalAmount;
            return $this;
        }
    
        /**
         * Get total_amount
         *
         * @return float
         */
        public function getTotalAmount()
        {
            return $this->total_amount;
        }
    
        /**
         * Set currency_code
         *
         * @param string $currencyCode
         * @return Orders
         */
        public function setCurrencyCode($currencyCode)
        {
            $this->currency_code = $currencyCode;
    
            return $this;
        }
    
        /**
         * Get currency_code
         *
         * @return string 
         */
        public function getCurrencyCode()
        {
            return $this->currency_code;
        }
    
        /**
         * Set details
         *
         * @param string $details
         * @return Orders
         */
        public function setDetails($details)
        {
            $this->details = $details;
    
            return $this;
        }
    
        /**
         * Get details
         *
         * @return string 
         */
        public function getDetails()
        {
            return $this->details;
        }
    }
    

    这是我的PaymentToken实体

    <?php
    
    namespace ClickTeck\featuresBundle\Entity;
    
    use Doctrine\ORM\Mapping as ORM;
    use Payum\Core\Model\Token;
    
    /**
     * PaymentToken
     */
    class PaymentToken extends Token
    {
    
    }
    

    这是我的Orders型号

    <?php
    
    namespace ClickTeck\featuresBundle\Model;
    
    use Payum\Core\Model\ArrayObject;
    
        class Orders extends ArrayObject
        {
            protected $id;
            /**
             * @return int
             */
            public function getId()
            {
                return $this->id;
            }
        }
    
    1. 现在我打电话给Action preparePaypalExpressCheckoutPaymentAction途径
    2. 我被重定向进行付款
    3. 我可以在doneAction
    4. 中看到回复

      非常整洁的图书馆。花了一些时间来弄清楚它,我很高兴它现在有效。我相信我有更多关于Payum的了解,我希望有人可以确认这是否是正确的方法:)