PayPal IPN: một số đơn hàng tạo ra lỗi IPN (Chỉ mục không xác định: hóa đơn)


7

Tôi đã kiểm tra đơn đặt hàng PayPal (sử dụng Thanh toán một trang tiêu chuẩn và Tiêu chuẩn thanh toán Paypal cốt lõi) khi IPN được bật và trạng thái cập nhật tốt để IPN dường như hoạt động.

Tuy nhiên, PayPal gửi qua email này định kỳ:

Gửi xxxx

Vui lòng kiểm tra máy chủ của bạn xử lý Thông báo thanh toán ngay lập tức PayPal (IPN). Thông báo thanh toán tức thì được gửi tới (các) URL sau không thành công:

http: // xxxx / paypal / ipn /

Nếu bạn không nhận ra URL này, bạn có thể đang sử dụng nhà cung cấp dịch vụ đang sử dụng IPN thay mặt bạn. Vui lòng liên hệ với nhà cung cấp dịch vụ của bạn với các thông tin trên. Nếu sự cố này tiếp diễn, IPN có thể bị vô hiệu hóa cho tài khoản của bạn.

Cảm ơn bạn đã quan tâm kịp thời về vấn đề này.

Trân trọng, PayPal

và sau đó khoảng một tuần sẽ tự động vô hiệu hóa IPN, ngăn các đơn đặt hàng PayPal cập nhật đúng cách.

Kiểm tra system.log cho thấy một loạt các thông báo

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

Có khoảng 50 trong số các lỗi này (cứ sau 15/20 phút) trong khi chúng tôi có một lượng nhỏ đơn đặt hàng Paypal gần đây.

Có ai có cái nhìn sâu sắc về vấn đề này?


2
Tôi nghĩ bởi vì đơn đặt hàng của bạn sử dụng trang web khác như [ebay, amazon] và đơn hàng này không được đặt trong magento nên nó phát hiện chỉ số không xác định vì magentop dosent biết về đơn đặt hàng của bên thứ ba thực sự tôi gặp vấn đề tương tự trước đây
Keyur Shah

Câu trả lời:


7

Nếu URL của bạn là chính xác thì đó là những gì Keyur Shah đã nhận xét, nhưng có lẽ không đủ rõ ràng. Nếu bạn đã bật IPN và nhận thanh toán từ các nguồn khác nhau (ebay, Magento và các nguồn khác) vào cùng một tài khoản PayPal, PayPal không may tiếp tục thử gửi thông báo liên quan đến các đơn đặt hàng này đến cửa hàng Magento, nơi các đơn hàng này không tồn tại.

Một giải pháp khả thi là tạo một trình thu IPN tập trung, xem URL này để biết tập lệnh rất hữu ích để bạn bắt đầu. http://codeseekah.com/2012/02/11/how-to-setup-multipl-ipn-receivers-in-paypal/


4

Như @Keyur Shah đã chỉ ra, các đơn đặt hàng này chưa được đặt với Magento. (vì vậy có lẽ chúng được nhập bởi M2E trong trường hợp của tôi)

Magento không biết gì về họ và hy vọng lĩnh vực này invoicesẽ được phổ biến, vì vậy một cái gì đó như thế này xảy ra:

  1. Ipn nhận được yêu cầu từ Paypal mà không cần invoicelĩnh vực này.
  2. Mage_Paypal_Model_Ipn::_getOrder()mong đợi invoicelĩnh vực và tạo ra một ngoại lệ
  3. Mage_Paypal_IpnControllergửi lại 503 Service Unavailablecho Paypal
  4. Bạn đã nhận được email Paypal ... Paypal tiếp tục thử lại đôi khi cho các đơn hàng không thành công


Viết lại giải phápMage_Paypal_Model_Ipn::processIpnRequest()
Tôi không giải thích quy trình đầy đủ vì có rất nhiều hướng dẫn chỉ ra cách tạo mô-đun viết lại tệp lõi.

Bản mod này:

  1. Không có ngoại lệ nếu invoicetrường không có và ghi nhật ký id đơn hàng đó
  2. Sẽ trả lời thành công cho Paypal để Paypal không gửi bất kỳ email nào và sẽ ngừng gửi thông tin đặt hàng này lại cho IPN.

Đây là tập tin lớp:

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();
    }
}

Sẽ không có ý nghĩa hơn nếu có một cách để chỉ nói với PayPal để thông báo cho các đơn đặt hàng Magento?
Haim

vâng, nếu có.
Fra

1

bạn phải kết nối với tài khoản paypal của mình, nhấp vào hồ sơ và đặt url IPS như thế này

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

hoặc, nếu nó không hoạt động

YOUR_BASE_URL/paypal/ipn/

xem liên kết này


1

Bạn có thể thử url như Nếu sử dụng URL ReWrite (URL thân thiện với công cụ tìm kiếm) Url IPN của chúng tôi sẽ là: YOUR_BASE_URL/paypal/standard/ipn/

Nếu bạn không sử dụng URL viết lại địa chỉ của bạn thì nên: (Tôi nghĩ rằng điều này là chính xác, chưa thử đầy đủ) YOUR_BASE_URL/index.php/paypal/standard/ipn/

Để biết thêm chi tiết xem tại đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.