PayPal IPN: Einige Bestellungen führen zu einem IPN-Fehler (undefinierter Index: Rechnung).

7

Ich habe eine PayPal-Bestellung getestet (unter Verwendung des Standard-One-Page-Checkout und des Standard-Paypal-Zahlungsstandards), wenn IPN aktiviert ist und der Status ordnungsgemäß aktualisiert wird, sodass IPN zu funktionieren scheint.

PayPal sendet jedoch regelmäßig über diese E-Mail:

Lieber xxxx,

Bitte überprüfen Sie Ihren Server, der PayPal Instant Payment Notifications (IPN) verarbeitet. Sofortige Zahlungsbenachrichtigungen, die an die folgenden URLs gesendet werden, schlagen fehl:

http: // xxxx / paypal / ipn /

Wenn Sie diese URL nicht erkennen, verwenden Sie möglicherweise einen Dienstanbieter, der IPN in Ihrem Namen verwendet. Bitte wenden Sie sich mit den oben genannten Informationen an Ihren Diensteanbieter. Wenn dieses Problem weiterhin besteht, sind IPNs möglicherweise für Ihr Konto deaktiviert.

Vielen Dank für Ihre schnelle Aufmerksamkeit für dieses Problem.

Mit freundlichen Grüßen PayPal

Nach etwa einer Woche wird IPN automatisch deaktiviert, wodurch die ordnungsgemäße Aktualisierung von PayPal-Bestellungen verhindert wird.

Wenn Sie system.log überprüfen, werden einige Hinweise angezeigt

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

Es gibt ungefähr 50 dieser Fehler (einen alle 15/20 Minuten), während wir kürzlich eine kleine Anzahl von Paypal-Bestellungen hatten.

Hat jemand einen Einblick in dieses Problem?

Josh Davenport
quelle
2
Ich denke, weil Ihre Bestellung über eine andere Website wie [ebay, amazon] erfolgt und diese Bestellung nicht in Magento platziert ist, erkennt sie einen undefinierten Index, da Magentop Dosent über Bestellungen von Drittanbietern Bescheid weiß. Ich habe das gleiche Problem zuvor
Keyur Shah

Antworten:

7

Wenn Ihre URL korrekt ist, hat Keyur Shah dies bereits kommentiert, war aber wahrscheinlich nicht klar genug. Wenn Sie IPN aktiviert haben und Zahlungen von verschiedenen Quellen (ebay, Magento und andere) an dasselbe PayPal-Konto erhalten, versucht PayPal leider weiterhin, Benachrichtigungen zu dieser Bestellung an den Magento Store zu senden, in dem diese Bestellungen nicht vorhanden sind.

Eine mögliche Lösung ist das Erstellen eines zentralisierten IPN-Empfängers. Unter dieser URL finden Sie ein sehr nützliches Skript, mit dem Sie beginnen können. http://codeseekah.com/2012/02/11/how-to-setup-multiple-ipn-receivers-in-paypal/

ivanji
quelle
4

Wie von @Keyur Shah hervorgehoben, wurden diese Bestellungen nicht bei Magento aufgegeben. (In meinem Fall werden sie wahrscheinlich von M2E importiert.)

Magento weiß nichts über sie und erwartet, dass das Feld invoicebesiedelt wird. So etwas passiert:

  1. Ipn erhalten eine Anfrage von Paypal ohne das invoiceFeld.
  2. Mage_Paypal_Model_Ipn::_getOrder()Erwarten Sie das invoiceFeld und erzeugen Sie eine Ausnahme
  3. Mage_Paypal_IpnControllerschickte ein 503 Service Unavailablean Paypal zurück
  4. Sie haben eine Paypal-E-Mail erhalten ... Paypal versucht noch einige Zeit, die fehlgeschlagenen Bestellungen zu wiederholen


Umschreiben der LösungMage_Paypal_Model_Ipn::processIpnRequest()
Ich erkläre nicht die vollständige Prozedur, da es viele Tutorials gibt, die zeigen, wie ein Modul erstellt wird, das eine Kerndatei neu schreibt.

Dieser Mod:

  1. Keine Ursache Ausnahme, wenn invoiceFeld nicht vorhanden ist und protokollieren Sie diese Auftrags-ID
  2. Wird auf Palpal erfolgreich antworten, sodass Paypal keine E-Mail sendet und diese Bestellinformationen nicht mehr an das IPN sendet.

Hier die Klassendatei:

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();
    }
}
Fra
quelle
Wäre es nicht sinnvoller, wenn PayPal nur über Magento-Bestellungen informiert werden könnte?
Haim
ja wenn es einen gab.
Fra
1

Sie müssen eine Verbindung zu Ihrem Paypal-Konto herstellen, auf das Profil klicken und die IPS-URL wie folgt festlegen

YOUR_BASE_URL/index.php/paypal/ipn/index/

oder wenn es nicht funktioniert

YOUR_BASE_URL/paypal/ipn/

siehe diesen Link

Mma87
quelle
1

Sie können die URL wie folgt ausprobieren: Wenn Sie URL ReWrite (suchmaschinenfreundliche URLs) verwenden, lautet unsere IPN-URL: YOUR_BASE_URL/paypal/standard/ipn/

Wenn Sie keine URL-Umschreibungen verwenden, sollte Ihre Adresse wie folgt lauten: (Ich denke, das ist richtig, habe es nicht vollständig ausprobiert.) YOUR_BASE_URL/index.php/paypal/standard/ipn/

Weitere Details finden Sie hier

Bikram Shrestha
quelle