“Suspected Fraud” status after compeleting the payment in magento?

后端 未结 2 1588
孤独总比滥情好
孤独总比滥情好 2021-01-16 17:00

I have made my custom module in magento, in which I have set discount in dynamically. I am using following code for this. But when I have completed the payment procedure, th

2条回答
  •  春和景丽
    2021-01-16 17:44

    It's not easy to tell from your question. This can depend on which Magento payment gateway / method you are using (Paypal, Authorize.net, Saved Card etc) as each can implement different methods for transaction authorization, capturing etc.

    Take a look at the default Mage_Sales_Model_Order_Payment class. This has several calls to a method called $this->getIsFraudDetected() when attempting to capture funds for a transaction and set the order status to Suspected Fraud if true like so:

    if ($this->getIsFraudDetected()) {
        $status = Mage_Sales_Model_Order::STATUS_FRAUD;
    }
    

    In the default Payment class the fraud flag is set in the registerCaptureNotification() method when the _isCaptureFinal() method returns false:

    if ($this->_isCaptureFinal($amount)) {
        $invoice = $order->prepareInvoice()->register();
        $order->addRelatedObject($invoice);
        $this->setCreatedInvoice($invoice);
    } else {
        $this->setIsFraudDetected(true);
        $this->_updateTotals(array('base_amount_paid_online' => $amount));
    }
    

    The _isCaptureFinal() methods returns false when the amount you are trying to capture does not equal exactly the remaining order balance.

    /**
     * Decide whether authorization transaction may close (if the amount to capture will cover entire order)
     * @param float $amountToCapture
     * @return bool
     */
    protected function _isCaptureFinal($amountToCapture)
    {
        $amountToCapture = $this->_formatAmount($amountToCapture, true);
        $orderGrandTotal = $this->_formatAmount($this->getOrder()->getBaseGrandTotal(), true);
        if ($orderGrandTotal == $this->_formatAmount($this->getBaseAmountPaid(), true) + $amountToCapture) {
            if (false !== $this->getShouldCloseParentTransaction()) {
                $this->setShouldCloseParentTransaction(true);
            }
            return true;
        }
        return false;
    }
    

    Check your totals (requested capture vs. outstanding balance) if using the default payment method or look at your payment methods implementation and use the above information to debug your code...

提交回复
热议问题