通过Magento 2中的Rest API更新订单状态

时间:2019-12-15 08:14:48

标签: magento magento2

我正在研究magento 2.3.3。我在做一种通过magento Web API从自定义支付网关接收回调的方法时一直停留在一个地方。主要想法是将客户重定向到我的自定义网关(已经完成),在下订单后,该自定义网关必须向magento的网络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>    

主要思想是将客户重定向到我的自定义网关(已完成),在下订单后,此自定义网关必须向magento的网络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错误的请求”和“消息”:“请提供订单付款。”任何帮助将不胜感激。here is Postman's request

2 个答案:

答案 0 :(得分:0)

我试图在您的函数中实现我的代码 我在这里考虑$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;
}
} 

尝试一下。

答案 1 :(得分:0)

我仍然不知道为什么它要求我为订单付款。但是现在不见了。而且我还面临另一个问题。当我尝试将状态更新为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;
 }
 }