0

我的 Magento 网站中有一些超过 30 天的订单,因此 authorize.net 预授权已过期。当我去取消订单时,它尝试提交 pre-auth void 但由于原始交易不再存在而失败。有没有办法手动覆盖这个无效程序并在这种状态下简单地取消订单?

4

3 回答 3

2

在需要时一次性完成这些取消的一种简单方法是:

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 在数据库中。

于 2014-09-16T21:20:44.523 回答
1

看一看 @

/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());
}
于 2013-02-14T00:09:33.050 回答
0

对于仍在寻找如何取消授权已过期的订单的任何人。通过将交易的 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,您现在应该可以取消订单,因为它告诉系统授权已关闭,并且不要尝试取消已在授权点网上过期的授权

于 2018-10-15T15:22:08.990 回答