【问题标题】:Using Omnipay gateway in Sylius with Payum + OmnipayBridge通过 Payum + OmnipayBridge 在 Sylius 中使用 Omnipay 网关
【发布时间】:2016-12-22 23:10:04
【问题描述】:

我已经实现了一个 Omnipay 网关,现在我想在 Sylius 中使用它,它使用 payum 1.3、payum-bundle 1.0 和 omnipay-bridge 1.0。

我已经在app/config/config.yml配置了网关(它是一个显示单独支付页面的重定向网关,一旦支付完成,将调用returnUrl,不涉及信用卡):

payum:
    gateways:
        my_gateway:
            omnipay_offsite:
                type: MyOmnipayGateway
                options:
                    gatewayOption: 1
                    anotherOption: 2
              actions:
                  - sylius.payum.my_gateway.action.convert_payment

我也将网关添加到sylius_payment 部分

sylius_payment:
    gateways:
        my_gateway: My Payment Service

我添加了一个将付款转换为vendor/sylius/sylius/src/Sylius/Bundle/PayumBundle/Resources/config/services.xml的操作:

<service id="sylius.payum.my_gateway.action.convert_payment" class="Sylius\Bundle\PayumBundle\Action\ConvertPaymentToMyGatewayAction">
    <tag name="payum.action" context="my_gateway" />
</service>

并实现了ConvertPaymentToMyGatewayAction 类,该类现在将请求负载转换为预期格式(使用ConvertPaymentToPaypalExpressAction 作为参考)。

我还在vendor/omnipay/common/composer.json 的网关列表中添加了MyOmnipayGateway,以解决不支持网关的错误。

现在,当我完成订单时,我成功地重定向到我的实际支付站点,一旦支付完成,就会返回到提供的returnUrl,并在查询字符串中包含预期的参数。然而,这里的执行返回到OffsiteCaptureAction,并使用与最初调用相同的参数调用purchase,我一次又一次地被重定向到支付站点。

当前问题:

  1. 如何避免在vendor文件夹下添加配置选项——即提到的services.xml和Omnipay的composer.json

  2. 在哪里处理付款响应?我需要检查returnUrl 查询字符串参数(在我的网关的completePurchase 中实现)。

谢谢!

编辑:我错过了在我的转换操作中使用$details = $payment-&gt;getDetails(); 初始化$details,这导致_completeCaptureRequired 每次都为假,因此purchase 在循环中执行。我现在可以正确处理付款,即。上面的配置和这个处理程序几乎可以解决问题 2

<?php
namespace Sylius\Bundle\PayumBundle\Action;

use Payum\Core\Action\ActionInterface;
use Payum\Core\Exception\RequestNotSupportedException;
use Payum\Core\Request\Convert;
use Sylius\Component\Core\Model\PaymentInterface;

class ConvertPaymentToMyGatewayAction implements ActionInterface
{
    public function execute($request)
    {
        RequestNotSupportedException::assertSupports($this, $request);

        /** @var PaymentInterface $payment */
        $payment = $request->getSource();
        $order = $payment->getOrder();

        $details = $payment->getDetails();

        // Fill the correct parameters here

        $request->setResult($details);
    }

    public function supports($request)
    {
        return
            $request instanceof Convert &&
            $request->getSource() instanceof PaymentInterface &&
            $request->getTo() === 'array'
        ;
    }
}

【问题讨论】:

  • 点击此链接讨论 Payum 集成github.com/Sylius/Sylius/issues/5715
  • 感谢您的方便参考,我一直想在我的网站上添加一个额外的支付网关有一段时间了。这会有所帮助。是否有机会将所有代码上传到 git repo 或 sylius 分支?
  • @Brett 这就是我们第一次编写 Omnipay 网关以来的所有代码(显然退款不会调用 Payum)。但无论如何,代码在这里github.com/vesse/SyliusPayumCheckoutFiBundle

标签: php sylius omnipay payum


【解决方案1】:

回答问题 1。您可以将自己的服务添加到您的应用配置或您自己的捆绑包中。我喜欢把它放在我自己的包中,然后在更新 sylius 时它不会被触及。

<service id="sylius.payum.my_gateway.action.convert_payment" class="Sylius\Bundle\PayumBundle\Action\ConvertPaymentToMyGatewayAction">
    <tag name="payum.action" context="my_gateway" />
</service>

只需将其转换为 yml

sylius.payum.my_gateway.action.convert_payment:
    class: Sylius\Bundle\PayumBundle\Action\ConvertPaymentToMyGatewayAction
    tags:
        -  { name: payum.action, context: my_gateway }

【讨论】:

    猜你喜欢
    • 2015-04-10
    • 2014-07-22
    • 2016-02-28
    • 2018-05-26
    • 2014-08-15
    • 2016-07-01
    • 2016-01-06
    • 2016-05-17
    • 2014-07-25
    相关资源
    最近更新 更多