我正在尝试实施我的新付款方式,效果很好。但我的要求有点不同。我需要将用户重定向到支付网关页面。这就是我正在努力实现的方式。
当用户单击“下订单”时,我的 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->_redirectUrl
的值在函数调用时不存在。
还有一件事,我不打算向客户展示任何类似“您正在被重定向”的页面。
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}
中查看他们是如何做到的。
大家好,这里是解决方案。
在授权功能中(请参阅上面答案中的我的代码)更改
$this->_redirectUrl = $rurl;
作者:
Mage::getSingleton('customer/session')->setRedirectUrl($rurl);
& 在函数中
getOrderPlaceRedirectUrl()
将其更改为 like
public function getOrderPlaceRedirectUrl()
{
Mage::Log('returning redirect url:: ' . Mage::getSingleton('customer/session')->getRedirectUrl() );
return Mage::getSingleton('customer/session')->getRedirectUrl(); ;
}
之后代码必须运行并且您将被重定向到第三方网关