【问题标题】:Customizing the JMSPaymentCoreBundle form in Symfony在 Symfony 中自定义 JMSPaymentCoreBundle 表单
【发布时间】:2013-11-21 23:06:50
【问题描述】:

我已经集成了捆绑包JMSPaymentCoreBundle 及其插件JMSPaymentPaypalBundle。然而,第一个捆绑包给出的表格迫使用户选择他/她希望使用的支付方式。就我而言,我没有多种选择,只有 Paypal。遗憾的是,用户仍然需要单击单选按钮以确认他希望使用 Paypal,然后才能被重定向到 Paypal 的站点。我想从流程中删除这一步。

这是我使用的表格:

$form = $this->getFormFactory()->create('jms_choose_payment_method', null, array(
            'amount'   => $orderPrice,
            'currency' => 'CAD',
            'default_method' => 'payment_paypal', // Optional
            'predefined_data' => array(
                'paypal_express_checkout' => array(
                    'return_url' => $this->router->generate('paiement_complete', array(
                        'id' =>$order->getId()
                    ), true),
                    'cancel_url' => $this->router->generate('paiement_annule', array(), true)
                ),
            ),
        ));

有什么办法可以修改这个表单来去掉选择,还是我需要实现一个新的表单?

谢谢。

【问题讨论】:

    标签: php symfony paypal


    【解决方案1】:

    您可以绕过支付方式选择如果您愿意,直接进行快速结帐(或您想要的方式)。

    而不是在类似这样的操作中显示和接收表单数据:

    public function detailsAction(Order $order)
    {
        // Your form
    
        if ('POST' === $this->request->getMethod())
        {
            $form->bindRequest($this->request);
    
            if ($form->isValid())
            {
                $this->ppc->createPaymentInstruction($instruction = $form->getData());
    
                $extendedData = $instruction->getExtendedData();
    
                $extendedData->set(
                    'checkout_params', array(
                        'L_PAYMENTREQUEST_0_NAME0' => 'My cool article',
                        'L_PAYMENTREQUEST_0_DESC0' => 'this is a description for my article',
                    )
                );
    
                $order->setPaymentInstruction($instruction);
                $this->em->persist($order);
                $this->em->flush($order);
    
                return new RedirectResponse($this->router->generate('payment_frontpage'));
             }
          }
    }
    

    您可以直接构造支付指令,并在action中进行Paypal:

    /**
     * Paypal Express Checkout
     *
     * @Route("/{orderNumber}/checkout", name="payment_checkout")
     * @Template
     */
    public function checkoutAction(Order $order)
    {
        $em = $this->get('doctrine.orm.entity_manager');
        $router = $this->get('router');
    
        // Create the extended data object
        $extendedData = new ExtendedData();
    
        // Complete payment return URL
        $extendedData->set('return_url',
            $router->generate('payment_complete', array(
                'orderNumber' => $order->getOrderNumber(),
            ), true)
        );
    
        // Cancel payment return URL
        $extendedData->set('cancel_url',
            $router->generate('payment_cancel', array(
                'orderNumber' => $order->getOrderNumber(),
            ), true)
        );
    
        // Checkout parameters
        $checkout_params = $this->generateCheckoutParameters($order);
        $this->get('logger')->info(print_r($checkout_params, 1));
    
        // Add checkout information to the exended data
        $extendedData->set('checkout_params', $checkout_params);
    
        // Create the payment instruction object
        $instruction = new PaymentInstruction(
            $order->getAmount(), 'EUR', 'paypal_express_checkout', $extendedData
        );
    
        // Validate and persist the payment instruction
        $this->get('payment.plugin_controller')->createPaymentInstruction($instruction);
    
        // Update the order object
        $order->setPaymentInstruction($instruction);
        $em->persist($order);
        $em->flush($order);
    
        // Continue with payment
        return new RedirectResponse($router->generate('payment_complete', array(
            'orderNumber' => $order->getOrderNumber(),
        )));
    }
    

    __

    protected function generateCheckoutParameters(Order $order)
    {
        // Checkout parameters
        $checkout_params = array();
    
        // Include items data in the order
        foreach ($order->getItems() as $in=>$item)
        {
            $checkout_params = array_merge(
                $checkout_params,
                array(
                    sprintf('L_PAYMENTREQUEST_0_NAME%d', $in)   => $item->getName(),
                    sprintf('L_PAYMENTREQUEST_0_DESC%d', $in)   => $item->getDescription(),
                    sprintf('L_PAYMENTREQUEST_0_AMT%d', $in)    => $item->getPrice(),
                    sprintf('L_PAYMENTREQUEST_0_QTY%d', $in)    => 1,
                )
            );
        }
    
        // Include payments data in the order
        $checkout_params = array_merge(
            $checkout_params,
            array(
                'PAYMENTREQUEST_0_DESC'     => "Order #".$order->getOrderNumber(),
                'PAYMENTREQUEST_0_INVNUM'   => $order->getOrderNumber(),
            )
        );
    
        return $checkout_params;
    }
    

    【讨论】:

    • 非常感谢。我只是想指出我确实需要将$em->flush(); 更改为$em->flush($order);
    • 快速提问。如果我在订单上打了折扣,则结帐参数似乎有问题。在这种情况下我应该使用特定的参数吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-29
    • 1970-01-01
    • 1970-01-01
    • 2018-03-10
    • 1970-01-01
    • 1970-01-01
    • 2013-09-05
    相关资源
    最近更新 更多