Magento 2在发送到Controller中的支付网关之前获取订单ID?

时间:2017-03-24 02:17:08

标签: controller magento2

我想知道如何在重定向到控制器后获取当前下订单的订单ID 在将浏览器发送到支付网关后,我需要知道我需要知道哪个订单ID设置为已完成

由于

1 个答案:

答案 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。