IPN PayPal: некоторые заказы приводят к сбою IPN (неопределенный индекс: счет-фактура)
Я протестировал заказ PayPal (используя стандартную проверку на одной странице и стандарт основных платежей Paypal), когда IPN включен, и статусы обновляются нормально, поэтому IPN, похоже, функционирует.
Однако PayPal периодически отправляет по этому электронному адресу:
Дорогой хххх,
Пожалуйста, проверьте ваш сервер, который обрабатывает мгновенные платежи PayPal Уведомления (IPN). Уведомления о мгновенных платежах, отправленные на следующие URL-адреса, не работают:
Http:// хххх /paypal/ipn/
Если вы не распознаете этот URL-адрес, возможно, вы используете поставщика услуг , который использует IPN от вашего имени. Пожалуйста, свяжитесь с вашим поставщиком услуг с вышеуказанной информацией. Если эта проблема сохранится, IP-адреса для вашей учетной записи могут быть отключены.
Благодарим вас за оперативное внимание к этому вопросу.
Искренне ваш, PayPal
А затем примерно через неделю автоматически отключает IPN, что останавливает обновление заказов PayPal должным образом.
Проверка системы.журнал показывает кучу уведомлений
2014-02-12T20:29:54+00:00 ERR (3): Notice: Undefined index: invoice in /var/www/windswept/app/code/core/Mage/Paypal/Model/Ipn.php on line 171
Существует около 50 таких ошибок (по одной каждые 15/20 мин), в то время как в последнее время у нас было небольшое количество заказов Paypal.
У кого-нибудь есть какое-либо представление об этой проблеме?
4 answers
Если ваш URL-адрес правильный, то это то, что Кейур Шах уже прокомментировал, но, вероятно, было недостаточно ясно. Если у вас включен IPN и вы получаете платежи из разных источников (ebay, Magento и другие) на один и тот же аккаунт PayPal, PayPal, к сожалению, продолжает пытаться отправлять уведомления, связанные с этими заказами, в магазин Magento, где этих заказов не существует.
Возможным решением является создание централизованного получателя IPN, см. Этот URL-адрес для очень полезного скрипта, который поможет вам начатый. http://codeseekah.com/2012/02/11/how-to-setup-multiple-ipn-receivers-in-paypal/
Как указал @Keyur Shah, эти заказы не были размещены в Magento. (так что, вероятно, в моем случае они импортируются M2E)
Magento ничего о них не знает и ожидает, что поле invoice
будет заполнено, поэтому происходит что-то вроде этого:
- Ipn получает запрос от Paypal без поля
invoice
. -
Mage_Paypal_Model_Ipn::_getOrder()
ожидайте поляinvoice
и создайте исключение -
Mage_Paypal_IpnController
отправил ответ503 Service Unavailable
в Paypal - Вы получили электронное письмо Paypal ... Paypal продолжает повторять попытки в течение некоторого времени для невыполненных заказов
Решение
Переписать Mage_Paypal_Model_Ipn::processIpnRequest()
Я не объясняю всю процедуру полностью, так как существует множество учебных пособий, показывающих, как создать модуль, который переписывает основной файл.
Этот мод:
- Не вызывает исключения, если поле
invoice
отсутствует, и регистрируйте эти идентификаторы заказов - Ответит Paypal успешно, поэтому Paypal не отправит никакого электронного письма и перестанет отправлять эту информацию о заказе на IPN снова.
Вот файл класса:
class MyModule_Fix_Model_Paypal_Ipn extends Mage_Paypal_Model_Ipn
{
public function processIpnRequest(array $request, Zend_Http_Client_Adapter_Interface $httpAdapter = null)
{
$this->_request = $request;
$this->_debugData = array('ipn' => $request);
ksort($this->_debugData['ipn']);
try {
if (!isset($this->_request['invoice'])) {
if ($httpAdapter) {
$this->_config = Mage::getModel('paypal/config', array('', ''));
$this->_postBack($httpAdapter); // send reply to paypal
}
$this->_debugData['exception'] = 'Missing Invoice/Order Id (maybe Ebay/Amazon order ?)';
return;
}
if (isset($this->_request['txn_type']) && 'recurring_payment' == $this->_request['txn_type']) {
$this->_getRecurringProfile();
if ($httpAdapter) {
$this->_postBack($httpAdapter);
}
$this->_processRecurringProfile();
} else {
$this->_getOrder();
if ($httpAdapter) {
$this->_postBack($httpAdapter);
}
$this->_processOrder();
}
} catch (Exception $e) {
$this->_debugData['exception'] = $e->getMessage();
$this->_debug();
throw $e;
}
$this->_debug();
}
}
Вам нужно подключиться к своей учетной записи PayPal, нажать на профиль и установить IP-адрес следующим образомYOUR_BASE_URL/index.php/paypal/ipn/index/
Или, если это не сработает
YOUR_BASE_URL/paypal/ipn/
Смотрите эту ссылку
Вы можете попробовать URL-адрес как
Если вы используете переписывание URL-адресов (удобные для поисковых систем URL-адреса), наш IP-адрес будет: YOUR_BASE_URL/paypal/standard/ipn/
Если вы не используете URL-адрес, ваш адрес должен быть: (Я думаю, что это правильно, я не пробовал его полностью) YOUR_BASE_URL/index.php/paypal/standard/ipn/
Для получения дополнительной информации смотрите здесь