magento 将结帐付款重定向到第三方网关

Posted

技术标签:

【中文标题】magento 将结帐付款重定向到第三方网关【英文标题】:magento redirect checkout payment to a 3rd party gateway 【发布时间】:2011-08-28 20:13:21 【问题描述】:

我正在尝试实施我的新付款方式,它工作正常。但我的要求有点不同。我需要将用户重定向到支付网关页面。这就是我试图实现的方式。

当用户点击下订单时,我的 Namespace_Bank_Model_Payment >> 授权方法被调用。我的网关说发送初始请求,根据给定网关的详细信息发送 URL 和付款 ID。在此 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 消息。但网址不存在。我的意思是$this-&gt;_redirectUrl 的值在函数调用时不存在。

还有一件事,我不打算向客户展示“您正在被重定向”之类的任何页面。

【问题讨论】:

谢谢你的问题。前几天我在 3D 安全检查上得到了堆栈,最后我从你的问题中得到了答案。谢谢 【参考方案1】:

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查看他们是如何做到的。

【讨论】:

我已经实现了你说的代码。请在代码中告诉您有什么问题。 @SAM,我想知道 Magento 是否传递了相同的支付模型实例。如果没有,那么您将调用对象的新实例化来获取getOrderPlaceRedirectUrl,它不会包含您在authorize 方法中设置的类变量。尝试按照我的建议将重定向 URL 存储在会话中,并使用会话值进行重定向。 是的,我通过存储在会话参数中使其工作。 & 然后从会话中检索。它现在工作。可能是我实现了最简单的新支付网关:) @SAM 所以 Magento 一定是在调用支付模型的一个新实例。有趣的。欢迎接受我的回答;)【参考方案2】:

大家好,这里是解决方案。

在授权功能中(请参阅上面答案中的我的代码)更改

$this->_redirectUrl = $rurl;

Mage::getSingleton('customer/session')-&gt;setRedirectUrl($rurl);

&在函数getOrderPlaceRedirectUrl()中改成like

public function getOrderPlaceRedirectUrl()

    Mage::Log('returning redirect url:: ' . Mage::getSingleton('customer/session')->getRedirectUrl() );
    return Mage::getSingleton('customer/session')->getRedirectUrl();        ;  

在该代码必须运行之后,您将被重定向到第三方网关

【讨论】:

以上是关于magento 将结帐付款重定向到第三方网关的主要内容,如果未能解决你的问题,请参考以下文章

Magento 付款重定向订单

在重定向到基于表单的支付网关之前/之后处理订单

Magento 2.3.3 - 结帐成功重定向到购物车

Magento Paypal 下订单但重定向不正确

Magento - 自动重定向到配置的支付网关之一

贝宝定期付款重定向到贝宝的主页