通过 magento 2 中的 rest api 更新订单状态
Order status updates via rest api in magento 2
我正在开发 magento 2.3.3。在执行通过 magento web api 从自定义支付网关接收回调的方法时,我一直停留在一个地方。主要想法是将客户重定向到我的自定义网关(我已经完成)并且在支付订单后这个自定义网关必须发送 callback 到 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 中设置的界面。下面的代码显示了实现此接口并具有必须更新订单状态的方法的 class。
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;
}
}
问题是,当我尝试通过邮递员发送一些状态时,它 returns 我“400 错误请求”和 "message":"Please provide payment for the order."。如有任何帮助,我们将不胜感激。here is Postman's request
我试图在你的函数中实现我的代码
我在这里考虑 $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;
}
}
试试这个。
我还是不明白为什么要我为订单付款。但现在它不见了。而且我还遇到了另一个问题。当我尝试将状态更新为 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;
}
}
我正在开发 magento 2.3.3。在执行通过 magento web api 从自定义支付网关接收回调的方法时,我一直停留在一个地方。主要想法是将客户重定向到我的自定义网关(我已经完成)并且在支付订单后这个自定义网关必须发送 callback 到 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 中设置的界面。下面的代码显示了实现此接口并具有必须更新订单状态的方法的 class。
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;
}
}
问题是,当我尝试通过邮递员发送一些状态时,它 returns 我“400 错误请求”和 "message":"Please provide payment for the order."。如有任何帮助,我们将不胜感激。here is Postman's request
我试图在你的函数中实现我的代码
我在这里考虑 $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;
}
}
试试这个。
我还是不明白为什么要我为订单付款。但现在它不见了。而且我还遇到了另一个问题。当我尝试将状态更新为 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;
}
}