【问题标题】:Order status updates via rest api in magento 2通过 magento 2 中的 rest api 更新订单状态
【发布时间】:2019-12-15 08:14:48
【问题描述】:

我正在开发 magento 2.3.3。我在做通过magento web api从自定义支付网关接收回调的方法时卡在一个地方。主要思想是将客户重定向到我的自定义网关(我已经完成),在支付订单后,这个自定义网关必须发送 callback 到 magento 的 web api 并 更新订单状态强>。 webapi.xml:

<?xml version="1.0"?>
<routes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Webapi:etc/webapi.xsd">
    <route url="/V1/orders/:id/statuses" method="POST">
          <service class="TarlanPay\TarlanPay\Api\Setorderstatus"
          method="status"/>  
    <resources>
        <resource ref="anonymous"/>
    </resources>
     <data>
        <parameter name="orderId" force="true">%reference_id%</parameter>
    </data>
</route>    

主要想法是将客户重定向到我的自定义网关(我已经完成),并且在支付订单后,这个自定义网关必须发送 callback 到 magento 的 web api 并更新订单状态。现在我已经设置了 web api 并编写了适当的方法来接收来自网关的回调。

namespace TarlanPay\TarlanPay\Api;
Interface Setorderstatus{
/**
* @api
* @param int $id
* @return string
*/
 public function status($id);
} 

上面的代码显示了我在 webapi.xml 中设置的界面。下面的代码显示了实现该接口的类,并具有更新订单状态的方法。

namespace TarlanPay\TarlanPay\Model;
use TarlanPay\TarlanPay\Api\Setorderstatus;
use \Magento\Sales\Model\Order;
use \Magento\Sales\Api\OrderRepositoryInterface;
/**
* @api
*/
Class SetorderstatusModel implements Setorderstatus, OrderRepositoryInterface{
    public function getList(\Magento\Framework\Api\SearchCriteriaInterface $searchCriteria){}
    public function get($id){}
    public function delete(\Magento\Sales\Api\Data\OrderInterface $entity){}
    public function save(\Magento\Sales\Api\Data\OrderInterface $entity){}
    /**
    * @return Model\SetorderstatusModel
    */
public function status($id){
    $tarlanResponse = file_get_contents('php://input');
    $tarlanData = json_decode($tarlanResponse, true);
    if(!empty($tarlanResponse)){
        $objectManager = \Magento\Framework\App\ObjectManager::getInstance();
        $order = $objectManager->create('Magento\Sales\Api\Data\OrderInterface')->load($id);
        switch($tarlanData['status']){
            case 0:
            $order->setState(\Magento\Sales\Model\Order::STATE_PENDING)->setStatus(\Magento\Sales\Model\Order::STATE_PENDING);
            $order->save();
            break;
            case 1:
            $order->setState(\Magento\Sales\Model\Order::STATE_COMPLETE)->setStatus(\Magento\Sales\Model\Order::STATE_COMPLETE);
            $order->save();
            break;
            case 3:
            $order->setState(\Magento\Sales\Model\Order::STATE_PROCESSING)->setStatus(\Magento\Sales\Model\Order::STATE_PROCESSING);
            $this->_orderRepository->save($order);
            break;
            case 4:
            $order->setState(\Magento\Sales\Model\Order::STATE_CANCEL)->setStatus(\Magento\Sales\Model\Order::STATE_CANCEL);
            $this->_orderRepository->save($order);
            break;
            case 5:
            $order->setState(\Magento\Sales\Model\Order::STATE_CLOSED)->setStatus(\Magento\Sales\Model\Order::STATE_CLOSED);
            $this->_orderRepository->save($order);
            break;
            case 6:
            $order->setState(\Magento\Sales\Model\Order::STATE_FAIL)->setStatus(\Magento\Sales\Model\Order::STATE_FAIL);
            $this->_orderRepository->save($order);
            break;
            default:
            echo 'something';
            break;
        }
    }
    return true;
}
} 

问题是,当我尝试通过邮递员发送一些状态时,它返回给我“400 Bad Request”和“message”:“请为订单付款。”。任何帮助将不胜感激。here is Postman's request

【问题讨论】:

    标签: magento magento2


    【解决方案1】:

    我试图在你的函数中实现我的代码 我这里考虑$id 表示$orderId

    $id = 1;
    
    public function status($id){
        $tarlanResponse = file_get_contents('php://input');
        $tarlanData = json_decode($tarlanResponse, true);
        if(!empty($tarlanResponse)){
            $objectManager = \Magento\Framework\App\ObjectManager::getInstance();
            $order = $objectManager->create('\Magento\Sales\Model\Order')->load($id);
            switch($tarlanData['status']){
                case 0:
                $orderState = Order::STATE_PENDING;
                $order->setState($orderState)->setStatus(Order::STATE_PENDING);
                $order->save();
                break;
                case 1:
                $orderState = Order::STATE_COMPLETE;
                $order->setState($orderState)->setStatus(Order::STATE_COMPLETE);
                $order->save();
                break;
                case 3:
                $orderState = Order::STATE_PROCESSING;
                $order->setState($orderState)->setStatus(Order::STATE_PROCESSING);
                $this->_orderRepository->save($order);
                break;
                case 4:
                $orderState = Order::STATE_CANCEL;
                $order->setState($orderState)->setStatus(Order::STATE_CANCEL);
                $this->_orderRepository->save($order);
                break;
                case 5:
                $orderState = Order::STATE_CLOSED;
                $order->setState($orderState)->setStatus(Order::STATE_CLOSED);
                $this->_orderRepository->save($order);
                break;
                case 6:
                $orderState = Order::STATE_FAIL;
                $order->setState($orderState)->setStatus(Order::STATE_FAIL);
                $this->_orderRepository->save($order);
                break;
                default:
                echo 'something';
                break;
            }
        }
        return true;
    }
    } 
    

    试试这个。

    【讨论】:

    • 它不起作用。也许我以错误的方式使用它?我应该把这段代码放在哪里?因为,我的支付网关发送从 0 到 6 的自定义状态,我应该将它们与 magento 状态连接起来。例如,当支付网关发送状态 1 时,表示成功。当它发送状态 6 表示失败。但是在您的代码中,唯一的状态是正在处理。我也尝试替换为 STATE_COMPLETE,但仍然没有...
    • 请检查我更新的解决方案,我已尝试在您的函数中实施我的解决方案。试试看。
    • 对您的另一个建议是在 try-catch 块中使用您的代码,因此如果发生任何错误,您可以了解错误。
    • 还是同样的问题。 "message": "Please provide payment for the order."
    • $payment = $order->getPayment(); $method = $payment->getMethodInstance(); $methodTitle = $method->getTitle();检查一下它是否为您提供任何付款方式?
    【解决方案2】:

    我仍然不知道为什么它要求我为订单付款。但现在它消失了。而且我还面临另一个问题。当我尝试将状态更新为complete 时,它不起作用。现在我也解决了这个问题。这是因为 magento 没有将我的订单注册为发票订单,因此它不能作为已完成的订单。这是最终代码:

    namespace TarlanPay\TarlanPay\Model;
     use TarlanPay\TarlanPay\Api\Setorderstatus;
     use \Magento\Sales\Model\Order;
     use \Magento\Sales\Api\OrderRepositoryInterface;
     use \Magento\Checkout\Model\Session;
     use \Magento\Sales\Model\Service\InvoiceService;
    
    /**
    * @api
    */
    
    Class SetorderstatusModel implements Setorderstatus, OrderRepositoryInterface{
    
    public function getList(\Magento\Framework\Api\SearchCriteriaInterface $searchCriteria){}
    public function get($id){}
    public function delete(\Magento\Sales\Api\Data\OrderInterface $entity){}
    public function save(\Magento\Sales\Api\Data\OrderInterface $entity){}
      /**
      * @return Model\SetorderstatusModel
      */
    public function status($id){
    $tarlanResponse = file_get_contents('php://input');
    $tarlanData = json_decode($tarlanResponse, true);
    if(!empty($tarlanResponse)){
        $objectManager = \Magento\Framework\App\ObjectManager::getInstance();
        $invoice = $objectManager->create('\Magento\Sales\Model\Service\InvoiceService');
        $order = $objectManager->create('\Magento\Sales\Model\Order')->load($id); // This is to correctly pass an argument that has been set in web api's url. For example my url looks like this - magento2/rest/V1/orders/12/statuses. Where 12 is order entity id.
        $invoice = $invoice->prepareInvoice($order); //this invoice is to update your status to complete
        $invoice->setRequestedCaptureCase(\Magento\Sales\Model\Order\Invoice::CAPTURE_ONLINE); //this invoice is to update your status to complete
        $invoice->register(); //this invoice is to update your status to complete
        switch($tarlanData['status']){
            case 0:
            $orderState = Order::STATE_PENDING_PAYMENT;
            $order->setState($orderState)->setStatus(Order::STATE_PENDING_PAYMENT);
            $order->save();
            break;
            case 1:
            $orderState = Order::STATE_COMPLETE;
            $order->setState($orderState)->setStatus(Order::STATE_COMPLETE);
            $order->save();
            break;
            case 2:
            $orderState = Order::STATE_PROCESSING;
            $order->setState($orderState)->setStatus(Order::STATE_PROCESSING);
            $order->save();
            break;
            case 3:
            $orderState = Order::STATE_PROCESSING;
            $order->setState($orderState)->setStatus(Order::STATE_PROCESSING);
            $order->save();
            break;
            case 4:
            $orderState = Order::STATE_CANCELED;
            $order->setState($orderState)->setStatus(Order::STATE_CANCELED);
            $order->save();
            break;
            case 5:
            $orderState = Order::STATE_CLOSED;
            $order->setState($orderState)->setStatus(Order::STATE_CLOSED);
            $this->_orderRepository->save($order);
            break;
            case 6:
            $orderState = Order::STATE_CANCELED;
            $order->setState($orderState)->setStatus(Order::STATE_CANCELED);
            $order->save();
            break;
            default:
            echo 'something';
            break;
        }
    }
      return true;
     }
     }                                                                             
    

    【讨论】:

      猜你喜欢
      • 2022-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-04
      • 2014-09-06
      • 1970-01-01
      • 1970-01-01
      • 2011-06-04
      相关资源
      最近更新 更多