【问题标题】:Omnipay 3Dsecure redirectOmnipay 3Dsecure 重定向
【发布时间】:2014-11-16 00:11:04
【问题描述】:

我正在使用 Omnipay 允许用户使用 Cardsave 进行支付。

我有以下几点:

    \Omnipay::setTestMode(true);

    $transactionId = date('YmdHis').$booking->space->id.$booking->user->id;


    $response = $gateway->purchase([
        'amount' => $booking->price,
        'currency' => 'GBP',
        'card' => $card,
        'transactionId' => $transactionId,
        'cancelUrl' => \base_url('cardsave/cancel/'.$booking->id),
        'returnUrl' => \base_url('cardsave/confirm/'.$booking->id)
    ])->send();

    if ($response->isSuccessful()) {
        $transactionReference = $response->getTransactionReference();

        //save the transaction reference in case of refund

        return ['status' => 'success', 'message' => 'Reservation process complete'];
    } elseif ($response->isRedirect()) {
        \Log::info('3DSecure redirect');

        $booking->addAdditional(['3dsecure_transaction_id' => $transactionId]);

        return [
            'status' => 'redirect',
            'form_html' => $response->getRedirectResponse()->getContent()
        ];
    }
    throw new PaymentException ($response->getMessage());

我的确认 url 转到以下方法:

    $transactionId = $booking->getAdditional('3dsecure_transaction_id');

    $response = $gateway->completePurchase([
        'amount' => $amount,
        'transactionId' => $transactionId,
        'currency' => 'GBP',
    ])->send();

    if ($response->isSuccessful()) {
        $transactionReference = $response->getTransactionReference();

        return $this->finalise($booking, $transactionReference);
    } else {
        $this->cancel($booking);
    }

但是查看 League/omnipay-cardsave 的代码,我看到以下内容:

    $md = $this->httpRequest->request->get('MD');
    $paRes = $this->httpRequest->request->get('PaRes');
    if (empty($md) || empty($paRes)) {
        throw new InvalidResponseException;
    }

所以我的问题是(我意识到这可能很愚蠢,但由于某种原因我似乎无法理解这一点),如果我只是实例化网关,该请求来自哪里?

我认为我做错了。

编辑:

我发现 3DSecure 事物的返回调用带有 MD 和 PaRes 值作为 POST 参数。这使我可以将它们设置在网关上。我怎么做?当我实例化网关时它会自动完成吗?

【问题讨论】:

    标签: php laravel payment-gateway omnipay


    【解决方案1】:

    我是对的,这个问题很愚蠢。

    在阅读代码并尝试之后,我发现AbstractGateway 使用 Symfony 的请求类来自动获取 POST 变量,在本例中是 'MD' 和 'PaRes'。

    其实在 CompletePurchase 类中是这样说的:

    $md = $this->httpRequest->request->get('MD');
    $paRes = $this->httpRequest->request->get('PaRes');
    

    httpRequest 设置在AbstractGateway 中。

    基本上,它只是工作。

    【讨论】:

      猜你喜欢
      • 2016-06-29
      • 2016-05-23
      • 1970-01-01
      • 2017-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-04
      • 2013-12-10
      相关资源
      最近更新 更多