2014-09-22 38 views
0

我正在使用Omnipay允許用戶使用Cardsave進行支付。Omnipay 3Dsecure重定向

我有以下幾點:

\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); 
    } 

而是通過聯盟/ omnipay-cardsave代碼看,我看到以下內容:

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

所以我的問題是(我意識到這可能是愚蠢的,但我似乎無法理解這一點,佛如果我剛剛實例化了網關,那麼請求來自哪裏?

我覺得我做錯了。

編輯:

我發現,從3DSecure東西返回調用自帶的MD和價格調整匯率值作爲POST參數。這使我可以在網關上設置它們。我怎麼做?當我實例化網關時它會自動完成嗎?

回答

0

我說得對,問題很愚蠢。

在閱讀代碼並試用後,我發現AbstractGateway使用Symfony的請求類自動提取POST變量,其中包括'MD'和'PaRes'。

事實上,它是這麼說的CompletePurchase類:

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

httpRequest是建立在AbstractGateway

基本上,它只是工作。