PayPal IPN:一部の注文でIPNエラーが発生する(未定義のインデックス:請求書)


7

IPNが有効になっていてステータスが正常に更新され、IPNが機能しているように見える場合に、PayPal注文をテストしました(標準の1ページチェックアウトとコアPaypal決済標準を使用)。

ただし、PayPalはこのメールを定期的に送信します。

xxxx様

PayPal即時支払い通知(IPN)を処理するサーバーを確認してください。次のURLに送信された即時支払い通知に失敗しました:

http:// xxxx / paypal / ipn /

このURLを認識できない場合は、代わりにIPNを使用しているサービスプロバイダーを使用している可能性があります。上記の情報をサービスプロバイダーにお問い合わせください。この問題が続く場合は、アカウントのIPNが無効になっている可能性があります。

この問題に迅速に対応していただきありがとうございます。

今後ともよろしくお願いいたします。PayPal

そして約1週間後、自動的にIPNが無効になり、PayPalの注文が適切に更新されなくなります。

system.logを確認すると、一連の通知が表示される

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

最近、Paypalで少量の注文をしましたが、これらのエラーは約50(15/20分ごとに1つ)です。

誰かがこの問題について何か洞察を持っていますか?


2
[ebay、amazon]のような他のサイトを使用する注文場所であり、この注文はmagentoではないため、未定義のインデックスが検出されるため、Magentopはサードパーティの注文について実際に知っているため、同じ問題が発生します
Keyur Shah

回答:


7

URLが正しい場合は、Keyur Shahがすでにコメントしたものですが、おそらく十分に明確ではありませんでした。IPNを有効にしていて、異なるソース(ebay、Magentoなど)から同じPayPalアカウントに支払いを受け取っている場合、PayPalは残念ながら、これらの注文に関連する通知を、これらの注文が存在しないMagentoストアに送信しようとし続けます。

可能な解決策は、一元化されたIPN受信機を作成することです。このURLを参照して、開始するための非常に便利なスクリプトを確認してください。http://codeseekah.com/2012/02/11/how-to-setup-multiple-ipn-receivers-in-paypal/


4

@Keyur Shahが指摘しているように、これらの注文はMagentoで行われていません。(したがって、おそらく私の場合、それらはM2Eによってインポートされます)

Magentoはそれらについて何も知らず、フィールドinvoiceにデータが入力されることを期待しているため、次のようなことが起こります。

  1. IPNは、invoiceフィールドのないPaypalからリクエストを受け取ります。
  2. Mage_Paypal_Model_Ipn::_getOrder()invoiceフィールドを期待して例外を生成する
  3. Mage_Paypal_IpnController503 Service UnavailablePayPalに返送されました
  4. Paypalのメールが届きました... Paypalは失敗した注文をしばらくの間再試行し続けます

ソリューションの
書き換えMage_Paypal_Model_Ipn::processIpnRequest()
コアファイルを書き換えるモジュールの作成方法を示すチュートリアルが多数あるため、完全な手順については説明していません。

このmod:

  1. invoiceフィールドが存在せず、それらの注文IDをログに記録しても、例外は発生しません
  2. 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();
    }
}

Magentoの注文についてのみ通知するようにPayPalに指示する方法があったら、もっと意味がありませんか?
ハイム、2015年

はい。
2015年

1

あなたはあなたのpaypalアカウントに接続し、クリックしてプロファイルし、このようにIPS urlを設定する必要があります

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

または、それが機能しない場合

YOUR_BASE_URL/paypal/ipn/

このリンクを参照してください


1

URLの書き換え(検索エンジン向けのURL)を使用しているかのようにURLを試すことができます。IPNURLは次のようになります。 YOUR_BASE_URL/paypal/standard/ipn/

URL書き換えを使用していない場合、アドレスは次のようになります(これは正しいと思いますが、完全には試していません)。 YOUR_BASE_URL/index.php/paypal/standard/ipn/

詳細はこちらをご覧ください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.