Problema de IPN de Magento EE PayPal:Error grave de PHP:Llamada a una función miembro save() en un no objeto en app/code/core/Mage/Paypal/Model/Ipn.php en la línea 532

magento.stackexchange https://magento.stackexchange.com//questions/48343

Pregunta

Recibimos un correo electrónico de PayPal alertándonos que nuestra página IPN devuelve muchos errores 500.Investigamos los diversos registros de errores y encontramos el siguiente error dentro del directorio /var/log/nginx.La ruta completa del directorio se ha eliminado por razones obvias.

PHP Fatal error:  Call to a member function save() on a non-object in app/code/core/Mage/Paypal/Model/Ipn.php on line 532"

Estamos ejecutando Magento Enterprise 1.13.0.2 y el método que contiene la línea 532 se encuentra dentro de la siguiente función.

/**
 * Process completed payment (either full or partial)
 *
 * @param bool $skipFraudDetection
 */
protected function _registerPaymentCapture($skipFraudDetection = false)
{
    if ($this->getRequestData('transaction_entity') == 'auth') {
        return;
    }
    $parentTransactionId = $this->getRequestData('parent_txn_id');
    $this->_importPaymentInformation();
    $payment = $this->_order->getPayment();
    $payment->setTransactionId($this->getRequestData('txn_id'))
        ->setPreparedMessage($this->_createIpnComment(''))
        ->setParentTransactionId($parentTransactionId)
        ->setShouldCloseParentTransaction('Completed' === $this->getRequestData('auth_status'))
        ->setIsTransactionClosed(0)
        ->registerCaptureNotification(
            $this->getRequestData('mc_gross'),
            $skipFraudDetection && $parentTransactionId
        );
    $this->_order->save();

    // notify customer
    $invoice = $payment->getCreatedInvoice();
    if ($invoice && !$this->_order->getEmailSent()) {
        $this->_order->sendNewOrderEmail()->addStatusHistoryComment(
            Mage::helper('paypal')->__('Notified customer about invoice #%s.', $invoice->getIncrementId())
        )
        ->setIsCustomerNotified(true)
        ->save();
    }
}

La línea 532 es el método save() llamado en $this->_order->sendNewOrderEmail()....hacia la parte inferior de la función.Como probar la IPN es ridículamente difícil en un entorno local, me preguntaba si alguien se había encontrado con este error antes.o si pueden indicarme la dirección correcta del problema.

¿Fue útil?

Solución

Dado que el error aparece en el ->save línea, significa que setIsCustomerNotified(true) no regresa $this (el objeto actual).
La única ocurrencia de setIsCustomerNotified lo encontré en la clase Mage_Sales_Model_Order_Status_History que regresa return $this->setData('is_customer_notified', $flag);.

Este setData El método debe devolver el objeto actual.
Por lo tanto, un módulo personalizado debe sobrescribir algo en su instancia.
O el setIsCustomerNotified método o el setData método de la Mage_Sales_Model_Order_Status_History clase.

Aquí hay un guión simple. eso puede ayudarlo a encontrar las anulaciones en su instancia.Busque en el resultado algo relacionado con Order o History.

Otros consejos

Su problema podría estar en el sendNewOrderEmail() método.Esto suele ser sobrescrito por extensiones de terceros que manejan correos electrónicos transaccionales.Verifique si tiene alguna extensión que haga eso y vea si puede deshabilitarla para realizar pruebas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a magento.stackexchange
scroll top