取消已过期预授权的Magento订单

时间:2013-01-17 23:27:42

标签: magento magento-1.7 authorize.net

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

3 个答案:

答案 0 :(得分:2)

一种简单的方法可以在需要时取消一次性取消:

1)从Magento的订单中获取Auth.net交易ID。它应该在订单底部的评论历史中显示。

2)搜索sales_payment_transaction表>该事务ID的txn_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。

答案 1 :(得分: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());
}

答案 2 :(得分:0)

适用于仍在寻找如何通过授权过期取消订单的任何人。 通过将事务的is_cloased值更改为1(是)来更新sales_payment_transaction的数据库记录。 您将需要在浏览器中查看交易时都可以从URL获得的订单ID和交易ID。

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后,您现在应该可以取消订单,因为它告诉系统授权已关闭,并且不要尝试使已在授权点网上过期的授权无效