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
-
12-12-2019 - |
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.
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.