我的 Magento 网站中有一些超过 30 天的订单,因此 authorize.net 预授权已过期。当我去取消订单时,它尝试提交 pre-auth void 但由于原始交易不再存在而失败。有没有办法手动覆盖这个无效程序并在这种状态下简单地取消订单?
3 回答
在需要时一次性完成这些取消的一种简单方法是:
1) 从 Magento 的订单中获取 Auth.net 交易 ID。它应该在订单底部的评论历史中显示。
2) 在 sales_payment_transaction 表 > txn_id 字段中搜索该交易 ID
3) 一旦你在 mySQL 中找到了记录(如果你有 phpMyAdmin 会很有帮助),那么只需将该记录的 txn_id 清空即可。
4) 回到 Magento 管理员,您现在可以取消订单,因为它知道不要尝试返回 Auth.net 取消订单。
** 或者,您可以通过 URL 中的订单 ID 轻松找到记录,并在同一个表中找到它。例如:
https://www.yourdomain.com/store/index.php/backend/sales_order/view/order_id/6957/key/4c16ff2bfed4b496670be4747sdjhdfd6/
它是 order_id: 6957 在数据库中。
看一看 @
/app/code/core/Mage/Paygate/Model/Authorizenet.php
为您的支付模块打开调试以查看$result->getResponseCode()
过期交易的结果。一旦你弄清楚结果(代码/错误代码)是什么,你就可以创建一个新的“案例”来模仿case self::RESPONSE_CODE_APPROVED:
还要看看@ $this->_isTransactionExpired($realAuthTransactionId) 看看为什么它没有捕捉到你的过期交易。
protected function _voidCardTransaction($payment, $card)
{
$authTransactionId = $card->getLastTransId();
$authTransaction = $payment->getTransaction($authTransactionId);
$realAuthTransactionId = $authTransaction->getAdditionalInformation($this->_realTransactionIdKey);
$payment->setAnetTransType(self::REQUEST_TYPE_VOID);
$payment->setXTransId($realAuthTransactionId);
$request= $this->_buildRequest($payment);
$result = $this->_postRequest($request);
switch ($result->getResponseCode()) {
case self::RESPONSE_CODE_APPROVED:
if ($result->getResponseReasonCode() == self::RESPONSE_REASON_CODE_APPROVED) {
$voidTransactionId = $result->getTransactionId() . '-void';
$card->setLastTransId($voidTransactionId);
return $this->_addTransaction(
$payment,
$voidTransactionId,
Mage_Sales_Model_Order_Payment_Transaction::TYPE_VOID,
array(
'is_transaction_closed' => 1,
'should_close_parent_transaction' => 1,
'parent_transaction_id' => $authTransactionId
),
array($this->_realTransactionIdKey => $result->getTransactionId()),
Mage::helper('paygate')->getTransactionMessage(
$payment, self::REQUEST_TYPE_VOID, $result->getTransactionId(), $card
)
);
}
$exceptionMessage = $this->_wrapGatewayError($result->getResponseReasonText());
break;
case self::RESPONSE_CODE_DECLINED:
case self::RESPONSE_CODE_ERROR:
if ($result->getResponseReasonCode() == self::RESPONSE_REASON_CODE_NOT_FOUND
&& $this->_isTransactionExpired($realAuthTransactionId)
) {
.....
public function canVoid(Varien_Object $payment)
{
if ($this->_isGatewayActionsLocked($this->getInfoInstance())) {
return false;
}
return $this->_isPreauthorizeCapture($this->getInfoInstance());
}
对于仍在寻找如何取消授权已过期的订单的任何人。通过将交易的 is_cloased 值更改为 1(是)来更新 sales_payment_transaction 的数据库记录。在浏览器中查看交易时,您将需要订单 ID 和交易 ID,您都可以从 URL 中获取它们。
https//magento.com/admin/sales_transactions/view/ txn_id/11111 / order_id/55555 /
$collection = Mage::getModel('sales/order_payment_transaction')
->getCollection()
->addAttributeToFilter('order_id', '11111')
->addAttributeToFilter('txn_id', '55555');
foreach ($collection as $col) {
if ($col->getId()){
$col->setIsClosed(1)->save();
}
}
您还可以通过 phpMyAdmin 打开 sales_payment_transaction 并为您的订单查找带有 order_id 和 txn_id 的行来更新该值。
一旦 is_closed 值设置为 1,您现在应该可以取消订单,因为它告诉系统授权已关闭,并且不要尝试取消已在授权点网上过期的授权