【发布时间】: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,我一次又一次地被重定向到支付站点。
当前问题:
如何避免在
vendor文件夹下添加配置选项——即提到的services.xml和Omnipay的composer.json?在哪里处理付款响应?我需要检查
returnUrl查询字符串参数(在我的网关的completePurchase中实现)。
谢谢!
编辑:我错过了在我的转换操作中使用$details = $payment->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