Sylius:如果捕获令牌不在 url 中,如何通知付款?

Sylius: how to notify payment if capture token is not in the url?

我正在使用 Payum 创建自己的支付包。我设法通过我的支付实体正确生成支付订单,并且我的捆绑包正确重定向到我实体的支付页面(用户在其中输入他们的卡和 PIN 码)。问题是我无法验证付款。我的支付实体只允许我配置单个支付确认异步调用url(它不允许我在每个订单中发送带有通知url的参数)。

我该如何继续获取支付令牌?有没有办法从订单id中获取支付令牌然后验证它?

好的,我想我做到了。这是 "solution":

首先,我必须创建一个 url 用于连接控制器的通知。

payum_ceca_notification_url:
path: /payum/ceca/bank-notification
methods: [GET, POST]
defaults:
    _controller: CecaPlugin:Notify:do

然后在我的doAction中:

    public function doAction(Request $request):Response
    {
        $params = $request->request->all();
        $order_id = (int) $params['Num_operacion']; 

        $payment = $this->container->get('sylius.repository.payment')->findOneBy(['id' => $order_id]);

        $details = $payment->getDetails();
        $cecaOptions = array(
            'Environment' => $details['Environment'],
            'MerchantID' => $details['MerchantID'],
            'AcquirerBIN' => $details['AcquirerBIN'],
            'TerminalID' => $details['TerminalID'],
            'ClaveCifrado' => $details['ClaveCifrado']);
        $apiCeca = new ApiCeca($cecaOptions);
        $apiCeca->setFormHiddens(array(
            'Num_operacion' => $details['Num_operacion'],
            'Importe' => $details['Amount'],
            'URL_OK' => $details['url_ok'],
            'URL_NOK' => $details['url_nok'].'?pagocancelado=1'
        ));

        // check my sign vs the sign sent to me by payment entity 
        $apiCeca->checkTransaction($params);
        $payment->setState(PaymentInterface::STATE_COMPLETED);
        $payment->getOrder()->setPaymentState(OrderPaymentStates::STATE_PAID);
        $manager = $this->container->get('sylius.manager.payment');
        $manager->persist($payment);
        $manager->flush();

        return new Response();
    }

我知道这不是最优雅的解决方案,但它是一个有效的解决方案,将订单标记为已付款。