我的Magento网站有一些超过30天的订单,因此authorize.net pre-auth已过期。当我去取消订单时,它会尝试提交pre-auth void,但由于原始事务不再存在而失败。有没有办法手动覆盖这个void程序,只是在这种状态下取消订单?
答案 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后,您现在应该可以取消订单,因为它告诉系统授权已关闭,并且不要尝试使已在授权点网上过期的授权无效