【问题标题】:Is Sylius PayumBundle handling payment details incorrectly?Sylius PayumBundle 是否错误地处理了付款细节?
【发布时间】:2019-11-14 01:28:30
【问题描述】:

我正在测试 Bitbag/PayUPlugin,但我被网关 API 停止,并出现错误“缺少所需数据”。

经过一些调试,我意识到 Sylius 支付实体,特别是“详细信息”属性,没有用数据实现。

在第 53 行更改条件后:

https://github.com/Sylius/Sylius/blob/4e06a4dfb8dc56731470016bb97165f3025947b7/src/Sylius/Bundle/PayumBundle/Action/CapturePaymentAction.php#L53

if ($status->isNew() || $status->isUnknown()) {

支付网关似乎工作正常。

这是一个错误还是我做错了什么?

Sylius/Sylius v1.4.6 Bitbag/PayUPlugin v1.8.0

【问题讨论】:

    标签: sylius payu payum


    【解决方案1】:

    PayumBundle/CapturePaymentAction 不太可能有错误(因为使用 PayumBundle 的人比使用 PayUPlugin 的人多,所以出现 bug 的可能性较小),概念上开头的支付对象状态应该是“新”而不是“未知”,所以条件应该工作。

    所以你应该找出https://github.com/BitBagCommerce/SyliusPayUPlugin/blob/master/src/Action/StatusAction.php#L58 类,为什么它没有到达markNew() 行。

    【讨论】:

    【解决方案2】:

    我猜BitBagCommerce/SyliusPayUPlugin 已经死了,因为这个问题自 7 月以来还没有得到解决。

    为了解决这个问题,我不得不装饰 StatusAction 类:

    <?php
    
    declare(strict_types=1);
    
    namespace App\Payment\PayU;
    
    use BitBag\SyliusPayUPlugin\Action\StatusAction;
    use BitBag\SyliusPayUPlugin\Bridge\OpenPayUBridgeInterface;
    use Payum\Core\Action\ActionInterface;
    use Payum\Core\Bridge\Spl\ArrayObject;
    use Payum\Core\Exception\RequestNotSupportedException;
    use Payum\Core\Request\GetStatusInterface;
    
    final class StatusActionDecorator implements ActionInterface
    {
        private $action;
    
        public function __construct(StatusAction $action)
        {
            $this->action = $action;
        }
    
        public function setApi($api): void
        {
            $this->action->setApi($api);
        }
    
        public function execute($request): void
        {
            /** @var $request GetStatusInterface */
            RequestNotSupportedException::assertSupports($this, $request);
    
            $model = ArrayObject::ensureArrayObject($request->getModel());
            $status = $model['statusPayU'] ?? null;
    
            if (empty($status) || OpenPayUBridgeInterface::NEW_API_STATUS === $status) {
                $request->markNew();
    
                return;
            }
    
            if (OpenPayUBridgeInterface::PENDING_API_STATUS === $status) {
                $request->markPending();
    
                return;
            }
    
            if (OpenPayUBridgeInterface::CANCELED_API_STATUS === $status) {
                $request->markCanceled();
    
                return;
            }
    
            if (OpenPayUBridgeInterface::WAITING_FOR_CONFIRMATION_PAYMENT_STATUS === $status) {
                $request->markSuspended();
    
                return;
            }
    
            if (OpenPayUBridgeInterface::COMPLETED_API_STATUS === $status) {
                $request->markCaptured();
    
                return;
            }
    
            $request->markUnknown();
        }
    
        public function supports($request): bool
        {
            return $this->action->supports($request);
        }
    }
    

    然后在services.yaml:

    App\Payment\PayU\StatusActionDecorator:
        decorates: bitbag.payu_plugin.action.status
        arguments: ['@App\Payment\PayU\StatusActionDecorator.inner']
    

    【讨论】:

      猜你喜欢
      • 2014-03-03
      • 2021-10-11
      • 2015-11-25
      • 2011-07-02
      • 2015-07-26
      • 1970-01-01
      • 1970-01-01
      • 2020-02-27
      • 2012-03-18
      相关资源
      最近更新 更多