платеж с помощью magento redirect для стороннего шлюза - PullRequest
3 голосов
/ 19 мая 2011

Привет, ребята. Я пытаюсь внедрить мой новый способ оплаты, он работает нормально.Но мое требование немного отличается.Мне нужно перенаправить пользователя на страницу платежного шлюза.Вот как я пытаюсь реализовать

Когда пользователь нажимает на Разместить заказ, вызывается мой метод namespace_Bank_Model_Payment >> authorize.Мой шлюз говорит, что отправил первоначальный запрос, на основе данных, указанных шлюзом, отправьте URL и идентификатор платежа.На этом URL-адресе пользователь должен быть перенаправлен туда, где клиент фактически производит оплату.У меня есть два действия в успехе и ошибке контроллера для обработки окончательного ответа.

Поскольку этот код вызывается в запросе ajax, я не могу перенаправить пользователя на другой веб-сайт.Кто-нибудь может подсказать мне, как этого добиться?

Заранее большое спасибо


Привет, Ник, спасибо, вот мой код, и я реализовал getOrderPlaceRedirectUrl() метод.

вот мой класс ::

<?php


class Namespace_Hdfc_Model_Payment extends Mage_Payment_Model_Method_Abstract
{
  protected $_isGateway = true;
  protected $_canAuthorize = true;
  protected $_canUseCheckout = true;

  protected $_code = "hdfc";


/**
     * Order instance
    */
  protected $_order;
  protected $_config;
  protected $_payment;
  protected $_redirectUrl;

/**
    * @return Mage_Checkout_Model_Session
   */
  protected function _getCheckout()
  {
    return Mage::getSingleton('checkout/session');
  }

/**
  * Return order instance loaded by increment id'
  *
  * @return Mage_Sales_Model_Order
  */
  protected function _getOrder()
  {   
    return $this->_order;
  }


/**
   * Return HDFC config instance
   *
   */
   public function getConfig()
   {
    if(empty($this->_config))
        $this->_config = Mage::getModel('hdfc/config');

    return $this->_config;
  }


  public function authorize(Varien_Object $payment, $amount)
  {
    if (empty($this->_order)) 
        $this->_order = $payment->getOrder();

    if (empty($this->_payment))
        $this->_payment = $payment;

    $orderId = $payment->getOrder()->getIncrementId();
    $order = $this->_getOrder();
    $billingAddress = $order->getBillingAddress();

    $tm = Mage::getModel('hdfc/hdfc');



    $qstr = $this->getQueryString();
    // adding amount
    $qstr .= '&amt='.$amount;
    //echo 'obj details:';
    //print_r(get_class_methods(get_class($billingAddress)));
    // adding UDFs
    $qstr .= '&udf1='.$order->getCustomerEmail();
    $qstr .= '&udf2='.str_replace(".", '', $billingAddress->getName() );
    $qstr .= '&udf3='.str_replace("\n", ' ', $billingAddress->getStreetFull());
    $qstr .= '&udf4='.$billingAddress->getCity();
    $qstr .= '&udf5='.$billingAddress->getCountry();
    $qstr .= '&trackid='.$orderId;

    // saving transaction into database;

    $tm->setOrderId($orderId);
    $tm->setAction(1);
    $tm->setAmount($amount);
    $tm->setTransactionAt( now() );
    $tm->setCustomerEmail($order->getCustomerEmail());
    $tm->setCustomerName($billingAddress->getName());
    $tm->setCustomerAddress($billingAddress->getStreetFull());
    $tm->setCustomerCity($billingAddress->getCity());
    $tm->setCustomerCountry($billingAddress->getCountry());
    $tm->setTempStatus('INITIAL REQUEST SENT');
    $tm->save();

    Mage::Log("\n\n queryString = $qstr");

    // posting to server

    try{
        $response = $this->_initiateRequest($qstr);
        // if response has error;
        if($er = strpos($response,"!ERROR!") )
        {
            $tm->setErrorDesc( $response );
            $tm->setTempStatus('TRANSACTION FAILED WHILE INITIAL REQUEST RESPONSE');
            $tm->save();
            $this->_getCheckout()->addError( $response );
            return false;
        }


        $i =  strpos($response,":");
        $paymentId = substr($response, 0, $i);
        $paymentPage = substr( $response, $i + 1);

        $tm->setPaymentId($paymentId);
        $tm->setPaymentPage($paymentPage);
        $tm->setTempStatus('REDIRECTING TO PAYMENT GATEWAY');
        $tm->save();

        // prepare url for redirection & redirect it to gateway

        $rurl = $paymentPage . '?PaymentID=' . $paymentId;

        Mage::Log("url to redicts:: $rurl");

        $this->_redirectUrl = $rurl;        // saving redirect rl in object

        // header("Location: $rurl");   // this is where I am trying to redirect as it is an ajax call so it won't work
        //exit;
    }
    catch (Exception $e) 
    {  
         Mage::throwException($e->getMessage());
    }

  }

  public function getOrderPlaceRedirectUrl()
  {
    Mage::Log('returning redirect url:: ' . $this->_redirectUrl );   // not in log
    return $this->_redirectUrl;
  }

}

Теперь getOrderPlaceRedirectUrl() его вызывают.Я вижу сообщение Mage :: log.но URL не существует.Я имею в виду, что значение $this->_redirectUrl отсутствует во время вызова функции.

И еще одна вещь, я не планирую показывать клиенту какую-либо страницу типа "Вы перенаправлены".

Ответы [ 2 ]

8 голосов
/ 19 мая 2011

Magento стандартно поддерживает этот тип платежного шлюза и напрямую поддерживает перенаправление пользователя на сторонний сайт для оплаты.

В вашей модели оплаты, которая расширяет Mage_Payment_Model_Method_Abstract, вам необходимо реализовать метод:

function getOrderPlaceRedirectUrl() {
    return 'http://www.where.should.we.pay.com/pay';

Обычно вы перенаправляете пользователя на страницу своего сайта, например, /mymodule/payment/redirect, а затем обрабатываете логику перенаправления в действии контроллера. Это обеспечивает чистоту вашей модели оплаты и без сохранения состояния , позволяя при этом отображать какое-то сообщение «Теперь вас переводят в шлюз для оплаты».

Сохраните все, что вам нужно, чтобы решить, куда перенаправить, в переменной сеанса, опять же , обычно Mage::getSingleton('checkout/session').

Magento имеет довольно солидную, хотя и грязную, реализацию этого для стандарта Paypal. Вы можете проверить, как они это делают в app/code/core/Mage/Paypal/{Model/Standard.php,controllers/StandardController.php}.

0 голосов
/ 20 мая 2011

Привет, ребята, вот решение.

В функции авторизации (см. Мой код в ответе выше) измените

$this->_redirectUrl = $rurl;

на Mage::getSingleton('customer/session')->setRedirectUrl($rurl);

& в функции getOrderPlaceRedirectUrl() измените его на

public function getOrderPlaceRedirectUrl()
{
    Mage::Log('returning redirect url:: ' . Mage::getSingleton('customer/session')->getRedirectUrl() );
    return Mage::getSingleton('customer/session')->getRedirectUrl();        ;  
}

после того, как этот код должен быть запущен, и вы будете перенаправлены на сторонний шлюз

...