我有这门课
class Api extends \Magento\Framework\Model\AbstractModel
{
public function __construct(
\Magento\Framework\Message\ManagerInterface $messageManager,
\Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
\Magento\Store\Model\StoreManagerInterface $storeManager,
\MyModule\Payment\Helper\Data $helper
) {
$this->messageManager = $messageManager;
$this->scopeConfig = $scopeConfig;
$this->storeManager = $storeManager;
$this->helper = $helper;
$this->contentType = $this->helper->getConfigData('content_type');
}
.
.
.
function createOnlinePurchase($authToken, $lastOrder)
{
.
.
.
//here I pass lastOrder's increment id to my payment gateway
$lastOrder->setData('test','test data');
$lastOrder->save();
//make payment gateway api call, get payment url
return url;
}
}
这个类然后被一个定制的控制器使用:
class Index extends \Magento\Framework\App\Action\Action
{
public function __construct(
\Magento\Framework\App\Action\Context $context,
\MyModule\Payment\Model\Api $moduleApi,
\Magento\Checkout\Model\Session $session
) {
parent::__construct($context);
$this->moduleApi = $moduleApi;
$this->session = $session;
}
public function execute() {
$token = $this->moduleApi->requestAuthToken();
if ($this->session->getLastRealOrder() && $token !== null) {
$url = $this->moduleApi->createOnlinePurchase($token, $this->session->getLastRealOrder());
if ($url !== null && substr($url, 0, 4) == 'http') {
$this->session->clearStorage();
return $this->resultRedirectFactory->create()->setUrl($url);
}
else {
$this->messageManager->addError(__("Url invalid: ".$url));
return $this->resultRedirectFactory->create()->setPath('checkout/onepage/failure');
}
}
}
在第二个自定义控制器Callback
上(由我的支付网关触发),我使用$order = $this->getOrderFactory->create()->loadByIncrementId($incrementId)
检索了订单对象
其中$this->getOrderFactory
是\Magento\Sales\Model\OrderFactory
I注入的示例。
我从我的支付网关拿回了increment id
。
在这个Callback
类中,当我使用$order->getData('test')
时,什么也得不到
"我的问题是"
我是不是漏掉了什么魔法的核心概念?
或者,是否有其他方法可以在Callback
中检索此测试数据,其中仅包含increment Id
的信息(因为在回调时,用户已离开magento并返回)
这对我来说很奇怪,因为我可以从Callback
编辑和保存订单,但我的额外数据没有保存/与订单对象本身关联
提前感谢!
更新
我确认通过使用从支付网关获得的order id
和从session's Last Order
获得的order id
获得了相同的订单对象(行
我在上面的Api类中调用了lastOrder
上的addStatusHistoryComment
,还在回调类中调用了addStatusHistoryComment
,这两个调用都在更新我的管理控制面板中的同一订单
我也已经确认调用getData('test')
的权利后,我设置它给我我想要的数据。
所以我不明白为什么从Callback调用getData时不起作用
2条答案
按热度按时间kpbpu0081#
你不能只是添加数据到订单对象,每个模型自动Map到数据库表列,对象将临时存储数据,不会出错,但它不会在数据库中持久。注解工作的原因是,因为它们在数据库中有一个位置,在保存和加载时,有额外的代码保存并添加到模型中。
为了在订单中保留新数据,您需要添加新的订单属性,或者只是在销售订单表中添加一个新列。保存时,关键字必须与您创建的新列的名称完全匹配。
xwmevbvl2#
我最终使用
setCustomerNote
代替了带有自定义键的setData
,这很奇怪,因为它实际上是在做:return $this->setData(OrderInterface::CUSTOMER_NOTE, $customerNote);
我只能假设在magento 2.4.x上(这是我正在使用的btw),
setData
只限于预定义的键。