Проблема с IPN Magento EE PayPal:Неустранимая ошибка PHP:Вызов функции-члена save() для объекта, не являющегося объектом, в app/code/core/Mage/Paypal/Model/Ipn.php в строке 532.
-
12-12-2019 - |
Вопрос
Мы получили электронное письмо от PayPal, в котором сообщается, что наша страница IPN возвращает множество ошибок (500).Мы изучили различные журналы ошибок и обнаружили следующую ошибку в каталоге /var/log/nginx.Полный путь к каталогу был удален по понятным причинам.
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"
Мы используем Magento Enterprise 1.13.0.2, и метод, содержащий строку 532, находится в следующей функции.
/**
* 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();
}
}
Строка 532 — это метод save(), вызываемый в $this->_order->sendNewOrderEmail()....ближе к низу функции.Поскольку тестирование IPN в локальной среде невероятно сложно, мне было интересно, сталкивался ли кто-нибудь с этой ошибкой раньше?или смогут ли они указать мне правильное направление проблемы.
Решение
Поскольку ошибка появляется в ->save
линия, это означает, что setIsCustomerNotified(true)
не возвращается $this
(текущий объект).
Единственное явление, setIsCustomerNotified
Я нашел это в классе Mage_Sales_Model_Order_Status_History
который возвращает return $this->setData('is_customer_notified', $flag);
.
Этот setData
метод должен возвращать текущий объект.
Поэтому что-то должно быть перезаписано в вашем экземпляре специальным модулем.
Либо setIsCustomerNotified
метод или setData
метод Mage_Sales_Model_Order_Status_History
сорт.
Вот простой скрипт это может помочь вам найти переопределения в вашем экземпляре.Посмотрите в выводе что-то, связанное с Order
или History
.
Другие советы
Ваша проблема может быть в sendNewOrderEmail()
метод.Обычно это перезаписывается сторонними расширениями, обрабатывающими транзакционные электронные письма.Проверьте, есть ли у вас какие-либо расширения, делающие это, и посмотрите, сможете ли вы отключить их для тестирования.