我正在研究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
答案 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;
}
}