我想知道如何在重定向到控制器后获取当前下订单的订单ID 在将浏览器发送到支付网关后,我需要知道我需要知道哪个订单ID设置为已完成
由于
答案 0 :(得分:1)
首先要做到这一点,你需要做很多工作。没有一种简单的方法可以做到。
当您使用自定义的gatewway付款文件时,您需要找到:
应用/代码/ Magento的/ sample_gateway /视图/支付/方法呈现器/ sample_getway.js 强>
此文件是您的js脚本,用于控制视图中的所有事务,甚至是您的ajax。
保留此文件,稍后我们将需要它。
接下来,我们需要为magento上的新人创建一个控制器。如果您不知道如何创建控制器,这是创建php文件的最简单方法。我建议你访问这个链接(http://inchoo.net/magento-2/how-to-create-a-basic-module-in-magento-2/)这个链接是针对客户模块的,我真的建议你去做,并从这里控制你所有的外部逻辑。
您的控制器应如下所示
<?php
namespace your_module\CallBacks\Controller\Payu;
use Magento\Sales\Model\Order;
class Success extends \Magento\Framework\App\Action\Action
{
protected $_pageFactory;
protected $_resultJsonFactory;
protected $_checkoutSession;
protected $orderRepository;
protected $customerSession;
public function __construct(
\Magento\Framework\App\Action\Context $context,
\Magento\Framework\Controller\Result\JsonFactory $resultJsonFactory,
\Magento\Framework\View\Result\PageFactory $pageFactory,
\Magento\Checkout\Model\Session $checkoutSession,
\Magento\Sales\Api\OrderRepositoryInterface $orderRepository,
\Magento\Customer\Model\Session $customerSession
)
{
$this->_checkoutSession = $checkoutSession;
$this->_resultJsonFactory = $resultJsonFactory;
$this->_pageFactory = $pageFactory;
$this->orderRepository = $orderRepository;
$this->customerSession = $customerSession;
return parent::__construct($context);
}
public function execute()
{
$customerId = $this->customerSession->getCustomer()->getId();
$result = $this->_resultJsonFactory->create();
$order = $this->_checkoutSession->getLastRealOrder();
//$orderId=$order->getEntityId();
$order->getIncrementId();
$this->_resources = \Magento\Framework\App\ObjectManager::getInstance()->get('Magento\Framework\App\ResourceConnection');
$connection= $this->_resources->getConnection();
$themeTable = $this->_resources->getTableName('z_payu_tx');
$sql = "INSERT INTO ". $themeTable .
" (orderid, date, state_pol,customer_number)
VALUES
('".$order->getIncrementId()."', '".date("Y-m-d H:i:s")."','NEW','".$customerId."')";
try{
$connection->query($sql);
$resultData = [
'orderId' => $order->getIncrementId(),
'msg_status' => true,
];
}catch(\Exception $e){
$resultData = [
'orderId' => $order->getIncrementId(),
'msg_status' => false,
];
}
return $result->setData($resultData);
}
}
此时,此控制器只能获取当前订单的客户ID,您可以获得订单号。如果您的控制器名为getOrderNumber.php,您可以尝试这个(您的站点/ CallBacks / Controller / Payu / getOrderNumber)。
这样你可以在magento 2逻辑中尝试所有代码,它真的很有用。
这可以通过观察者来完成,但是对于实际使用,你不能像你自己的php一样简单地调试。请记住,如果你想要开发人员mod,你需要在命令行中运行php bin / magento deploy:mode:set developer。
现在你有了控制器,你需要你的js文件在这个过程的某个阶段进行ajax调用。
我们之前发现的sample_getway.js,我们需要了解这是一个用于处理订单的主magento文件的覆盖。现在我们可以使用和覆盖magento2拥有的任何函数。
{
....
},
setOrder: function() {
// this.getOrderId();
this.placeOrder();
},
afterPlaceOrder: function (data, event) {
if (event) {
event.preventDefault();
}
this.getOrderId();
},
getOrderId: function () {
var _url = urlBuilder.build("callbacks/Payu/Success");
var merchantId = "508029";
var ApiKey = "4Vj8eK4rloUd272L48hsrarnUA";
var refCode = "";
var amount = this.getTotalAmount();
var currency = this.getCurrency();
var signatureKey = "";
var param = 'ajax=1';
jQuery.ajax({
showLoader: true,
url: _url,
data: param,
type: "POST",
dataType: 'json'
}).done(function (data) {
if(data.msg_status){
refCode = data.orderId;
var unCode = ApiKey+"~"+merchantId+"~"+refCode+"~"+amount+"~"+currency;
signatureKey= hex_md5(ApiKey+"~"+merchantId+"~"+refCode+"~"+amount+"~"+currency);
document.getElementById("refCodeInput").value = refCode
document.getElementById("signatureValue").value = signatureKey;
document.getElementById("payuForm").submit();
return;
}else{
alert("Se ha presentado un error, porfavor intentelo más tarde")
}
}).fail(function (XMLHttpRequest, textStatus, errorThrown) {
console.log(textStatus);
alert(textStatus);
alert(JSON.stringify(errorThrown));
alert(textStatus);
});
},
getResponseUrl: function(){
return urlBuilder.build("checkout/onepage/success");
},
getconfirmPageUrl: function(){
return urlBuilder.build("callbacks/Payu/confirmPage");
},
....
},
如果你看,我们有一些额外的功能和一些覆盖函数,setOrder,afterPlaceOrder,this.placeOrder()。
setOrder-&GT;这是与html
中的按钮相关联的功能应用程序/代码/ Magento的/ sample_gateway /视图/前端/网络/模板/支付/ form.html
<input type="image" border="0" alt="" src="http://www.payulatam.com/img-secure-2015/boton_pagar_mediano.png" data-bind="click: setOrder"/>
这只是一个点击动作,它是js功能。
this.placeOrder() - &GT;这是这一部分的神奇之处,这就是你让magento2创建顺序的方式(Frameworks实用程序),现在你需要知道这个进程何时结束做其他事情,在我的情况下我需要填写一个表格whit某些值,所以我需要停止de auto重定向以保留信息并重定向到支付公司,为此我们有一个很棒的功能
afterPlaceOrder - &gt;订单下达后,您可以执行任何操作,此时您可以执行任何操作,重定向到主页,付款公司等。
这很棘手redirectAfterPlaceOrder: false,
是允许你自动重定向的变量,在我的情况下我需要不同的url,所以我重定向到afterPlaceOrder调用的getOrderId。
如果你想尝试这个,你需要在成功通话后停用一个清洁汽车的功能,只需注释$ session-&gt; clearQuote(),你就可以在创建订单后调用控制器进行测试。
namespace Magento\Checkout\Controller\Onepage;
class Success extends \Magento\Checkout\Controller\Onepage
{
/**
* Order success action
*
* @return \Magento\Framework\Controller\ResultInterface
*/
public function execute()
{
$session = $this->getOnepage()->getCheckout();
if (!$this->_objectManager->get(\Magento\Checkout\Model\Session\SuccessValidator::class)->isValid()) {
return $this->resultRedirectFactory->create()->setPath('checkout/cart');
}
//$session->clearQuote(); //This stop clear the cart.
//@todo: Refactor it to match CQRS
$resultPage = $this->resultPageFactory->create();
$this->_eventManager->dispatch(
'checkout_onepage_controller_success_action',
['order_ids' => [$session->getLastOrderId()]]
);
return $resultPage;
}
}
希望这对你有所帮助!有点晚了,因为很难理解magento2。