【发布时间】: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
【问题讨论】: