Symfony2中的PayPal

时间:2013-03-03 22:57:08

标签: symfony paypal paypal-sandbox

我正在尝试将JMSPaymentCoreBundleJMSPaymentPaypalBundle一起使用,我无法在任何地方找到明确的示例。

我已完成文档中指定的所有步骤,但我无法使其正常运行。请有人帮帮我吗?

2 个答案:

答案 0 :(得分:19)

Payum bundle通过bridge支持jms付款。这些链接描述了如何开始。

捆绑包的使用带来了几个好处:

  • 安全捕获行动。
  • 有信用卡表格,可以要求用户提供信用卡
  • 轻松设置IPN的能力。通知行动也是安全的。
  • 内置支持所有omnipay网关(25 +),jms插件(+ 10)和payum本机库。
  • Payum paypal lib支持定期付款和数字商品。
  • 存储已集成到付款流程中,因此您无需担心可能丢失的数据。
  • 域友好。事实上,Payum提供了一些模型,但并不限制您使用它们。
  • 它已经支持PSR-0记录器。在dev中,它记录执行的payum操作,以便轻松调试(访问symfony配置文件日志选项卡)。
  • 可以设置多笔付款(例如欧盟的一个paypal帐户和美国的一个帐户)
  • 极易定制。添加自定义payum操作,扩展或存储。
  • 有一个symfony沙箱(code | web)可以帮助您入手。

P.S。它不是完整的功能列表。

答案 1 :(得分:8)

创建付款指令的默认方式是通过jms_choose_payment_method表单:

$form = $this->getFormFactory()->create('jms_choose_payment_method', null, array(
        'amount'   => 12.99,
        'currency' => 'EUR',
        'default_method' => 'payment_paypal', // Optional
        'predefined_data' => array(
            'paypal_express_checkout' => array(
                'return_url' => $this->get('router')->generate('payment_complete', array(
                    'number' => $order->getOrderNumber(),
                ), true),
                'cancel_url' => $this->get('router')->generate('payment_cancel', array(
                    'number' => $order->getOrderNumber(),
                ), true)
            ),
        ),
    ));

您也可以手动创建付款说明:

        use JMS\Payment\CoreBundle\Entity\ExtendedData;
        use JMS\Payment\CoreBundle\Entity\Payment;
        use JMS\Payment\CoreBundle\PluginController\Result;
        use JMS\Payment\CoreBundle\Plugin\Exception\ActionRequiredException;
        use JMS\Payment\CoreBundle\Plugin\Exception\Action\VisitUrl;
        use JMS\Payment\CoreBundle\Entity\PaymentInstruction;


        $extendedData = new ExtendedData();
        $extendedData->set('return_url', $this->get('router')->generate('payment_complete', array(
                'number' => $order->getOrderNumber(),
            ), true));

        $extendedData->set('cancel_url', $this->get('router')->generate('payment_cancel', array(
                'number' => $order->getOrderNumber(),
            ), true));

        $instruction = new PaymentInstruction((float)$order->getCharge() > 0 ? $order->getCharge() : $order->getAmount(), 'EUR', 'paypal_express_checkout', $extendedData);
        $this->get('payment.plugin_controller')->createPaymentInstruction($instruction);

        $order->setPaymentInstruction($instruction);
        $em = $this->get('doctrine.orm.entity_manager');
        $em->persist($order);
        $em->flush();

我的payment_complete路线如下:

public function completeAction(Booking $order)
{
    $instruction = $order->getPaymentInstruction();
    if (($instruction->getAmount() - $instruction->getDepositedAmount()) > 0) {
        if (null === $pendingTransaction = $instruction->getPendingTransaction()) {
            $payment = $this->get('payment.plugin_controller')->createPayment($instruction->getId(), $instruction->getAmount() - $instruction->getDepositedAmount());
        } else {
            $payment = $pendingTransaction->getPayment();
        }

        $result = $this->get('payment.plugin_controller')->approveAndDeposit($payment->getId(), $payment->getTargetAmount());
        if (Result::STATUS_PENDING === $result->getStatus()) {
            $ex = $result->getPluginException();

            if ($ex instanceof ActionRequiredException) {
                $action = $ex->getAction();

                if ($action instanceof VisitUrl) {
                    return new RedirectResponse($action->getUrl());
                }

                throw $ex;
            }
        } else if (Result::STATUS_SUCCESS !== $result->getStatus()) {
            throw new \RuntimeException('Transaction was not successful: '.$result->getReasonCode());
        }
    }

    $order->setTransactionAmount((float)$order->getAmount());
    $creditPurchased = (float)$order->getCharge() > (float)$order->getAmount() ? (float)$order->getCharge() - (float)$order->getAmount() : 0;
    $em->persist($order);
    $em->flush();

我已经通过http://jmsyst.com/bundles/JMSPaymentCoreBundle/master/usage

运行了