我注意到了Shopware与实际(最后)付款方式订单的奇怪行为,用户选择了这种方式并进行了付款。因此,也许有人可以向我解释它是如何工作的,因为现在我的集成插件(ERP,附属服务)有很多缺陷和瓶颈。因此,让我们开始吧(我们的目标是接收客户上次选择的last=actual支付方法):
order
。有id 0d624ffae665466db51f12eba0c1bc53
的顺序。我能从这里得到关于最后一次付款和实际付款方式的信息吗?我想没有因为我没找到。好的,我们进入下一步,,
order_transaction
。万岁!在这里,我发现所有的付款方法,客户使用时,他/她试图支付订单。好的,我们这里有,
id order_id | created_at | updated_at
83042D493DC04A4290BE8D7F523DE32F 0D624FFAE665466DB51F12EBA0C1BC53 | 2022-08-25 09:04:38.474 | 2022-09-24 11:11:19.664
911DF5D15BC542E598C2F11AECDAFD61 0D624FFAE665466DB51F12EBA0C1BC53 | 2022-08-25 09:06:27.775 | NULL
好的!根据我的逻辑,上一次在表中创建的付款方法是用户选择最后一次支付的方法。因此,我们在这里,我们找到了实际(最后)支付方法,用户选择并与此订单进行交易,它是911DF5D15BC542E598C2F11AECDAFD61
(因为它是在比83042D493DC04A4290BE8D7F523DE32F
晚2分钟创建的。
现在,我的ERP系统或我想改变支付状态,因为它是邮政支付。客户支付了它,现在我们已经准备好将状态从Open更改为Paid。好的,我已经做过了,让我们看看发生了什么,数据库。我们的旅程转移到名为state_machine_history
的新表。好的,让我们尝试使用最后一个事务id 911DF5D15BC542E598C2F11AECDAFD61
找到我们的订单,现在我们就到了。
不幸的是我们什么也没找到。好了,振作起来!让我们尝试使用另一种支付方法83042D493DC04A4290BE8D7F523DE32F
。
是的,我们找到了7行(见截图)
所以我们所拥有的支付状态在错误的支付方法上被改变了,但是应该在最后的方法上被改变!现在我有很多问题,因为我的插件不能获得正确的支付状态为oder。也许我不明白该怎么做?如果有人能解释我这点,那就太好了。我的目标:我的插件应该得到正确的支付状态和正确的支付方式。现在我收到了错误的状态,当我使用类似这样的smth时,我们提到了here
$criteria
->addFilter(
new EqualsFilter(
'orderNumber',
$orderNumber)
)
->addAssociation('stateMachineState')
->getAssociation('transactions')
->addSorting(new FieldSorting('createdAt'));
$order = $this->orderRepository->search($criteria, $context)->first();
更新:我已通过管理面板(http://url.com/admin)手动更改支付状态。
发布于 2022-09-25 16:17:10
ERP集成(Xentral shop模块)中存在的问题是:采用错误的付款方式获取订单,然后在错误的支付方式下改变付款状态。
谢谢你。您和您的comment帮助我修复它(only修复了Shopware中的Shopware)。所做的工作:
,并设置付款状态以维持用户选择的(实际)支付方法。
// module/sw-order/view/sw-order-detail-details/index.js
transaction() {
for (let i = 0; i < this.order.transactions.length; i += 1) {
if (!['cancelled', 'failed'].includes(this.order.transactions[i].stateMachineState.technicalName)) {
return this.order.transactions[i];
}
}
return this.order.transactions.last();
}
发布于 2022-09-24 15:07:40
实例化FieldSorting
时,您忽略了第二个参数。第二个参数是排序的方向,默认情况下它是上升的。因此,您现在实际上正在用最古老的创建日期来分割条目。你应该往降的方向排序:
new FieldSorting('createdAt', FieldSorting::DESCENDING)
要么这样做,要么从集合中获取最后一个条目,而不是:
$transaction = $order->getTransactions()->last();
您提到的另一件事是,当您在管理中更改事务状态时,似乎更改了错误的状态。
这是返回用于转换的事务的计算属性:
// module/sw-order/view/sw-order-detail-details/index.js
transaction() {
for (let i = 0; i < this.order.transactions.length; i += 1) {
if (!['cancelled', 'failed'].includes(this.order.transactions[i].stateMachineState.technicalName)) {
return this.order.transactions[i];
}
}
return this.order.transactions.last();
}
注意,返回的第一个事务没有状态cancelled
或failed
,除非它是唯一的事务。因为这实际上是order_transaction
中对于单个订单应该有多个条目的唯一情况。也就是说,当客户的付款失败或被取消时,他们决定使用不同的支付方法。这就是两种不同的支付方法的两个交易结束的时候,但是其中之一应该总是状态cancelled
或failed
。如果您最终得到了多个事务,但事实并非如此,那么问题就出了。
https://stackoverflow.com/questions/73837195
复制相似问题