2015-06-01 22 views
5

Tôi đã giải đáp câu hỏi này và đã thử tất cả đề xuất nhưng không có tác dụng nào.Hộp cát PayPal Xác thực IPN luôn trả về INVALID

Tôi đã thử mã này: https://developer.paypal.com/docs/classic/ipn/ht_ipn/ nhưng không hoạt động. Chỉ cần sao chép và dán các phần mềm magick_quotes cũ.

Tôi đã thử mã này: http://samples.geekality.net/view-source.php?file=ipn/ipn_handler.class.php và nó cũng không hoạt động.

Trong mọi trường hợp tôi đã cố gắng để làm như sau:

$req = 'cmd=_notify-validate&' . file_get_contents('php://input'); 

Để đảm bảo tôi gửi đến IPN chính xác những gì nó gửi đến cho tôi. Ngoài ra, tôi đã sử dụng proxy gỡ lỗi (Fiddler) và lưu IPN được gửi cho tôi và những gì tôi đã gửi tới IPN. Các đối tượng yêu cầu giống hệt byte-byte, ngoại trừ yêu cầu của tôi được bắt đầu bằng chuỗi cmd=_notify-validate&.

Có, tôi đã chọn Tôi sử dụng URL hộp cát thích hợp. Dưới đây là toàn bộ các cơ quan yêu cầu:

gì IPN gửi đến cho tôi: (Tôi chỉ thay thế dữ liệu cá nhân với XXX)

POST http://localhost.loc/en/payment/success/1 HTTP/1.1 
Host: localhost.loc 
Connection: keep-alive 
Content-Length: 921 
Cache-Control: max-age=0 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 
Origin: null 
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.81 Safari/537.36 
Content-Type: application/x-www-form-urlencoded 
Accept-Encoding: gzip, deflate 
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4 

mc_gross=1.00&protection_eligibility=Ineligible&payer_id=5XNKM66NSDKC4&tax=0.00&payment_date=05%3A34%3A11+Jun+01%2C+2015+PDT&payment_status=Completed&charset=utf-8&first_name=XXX&mc_fee=0.33&notify_version=3.8&custom=topup%3A262262%3A1%3A1433162020&payer_status=verified&business=XXX&quantity=1&payer_email=XXX&verify_sign=AG58dBsn5g2z8O8NEjotbuJGP14PAIpZ4k26VL8IyhaDPkcDRj002Keq&memo=hmgvjgjhgfjhfggjhfjtfgjh&txn_id=4CN141026K278934Y&payment_type=instant&last_name=XXX&receiver_email=XXX&payment_fee=0.33&receiver_id=DCMXPXGX4QX6J&txn_type=web_accept&item_name=Account+top+up&mc_currency=USD&item_number=Account+262262+top+up&residence_country=US&test_ipn=1&handling_amount=0.00&transaction_subject=topup%3A262262%3A1%3A1433162020&payment_gross=1.00&shipping=0.00&auth=ANSTBwT3znll-gJQZO2cLoV5QJFW9v8W.FqyWxffdtI0L-9mfsoe2xRL44M86Sn2XtYGtcqG4Fjjel1kdYZyxpQ 

Những gì tôi gửi đến IPN:

POST https://www.sandbox.paypal.com/cgi-bin/webscr HTTP/1.1 
Host: www.sandbox.paypal.com 
Accept: */* 
Content-Length: 942 
Content-Type: application/x-www-form-urlencoded 

cmd=_notify-validate&mc_gross=1.00&protection_eligibility=Ineligible&payer_id=5XNKM66NSDKC4&tax=0.00&payment_date=05%3A34%3A11+Jun+01%2C+2015+PDT&payment_status=Completed&charset=utf-8&first_name=XXX&mc_fee=0.33&notify_version=3.8&custom=topup%3A262262%3A1%3A1433162020&payer_status=verified&business=XXX&quantity=1&payer_email=XXX&verify_sign=AG58dBsn5g2z8O8NEjotbuJGP14PAIpZ4k26VL8IyhaDPkcDRj002Keq&memo=hmgvjgjhgfjhfggjhfjtfgjh&txn_id=4CN141026K278934Y&payment_type=instant&last_name=XXX&receiver_email=XXX&payment_fee=0.33&receiver_id=DCMXPXGX4QX6J&txn_type=web_accept&item_name=Account+top+up&mc_currency=USD&item_number=Account+262262+top+up&residence_country=US&test_ipn=1&handling_amount=0.00&transaction_subject=topup%3A262262%3A1%3A1433162020&payment_gross=1.00&shipping=0.00&auth=ANSTBwT3znll-gJQZO2cLoV5QJFW9v8W.FqyWxffdtI0L-9mfsoe2xRL44M86Sn2XtYGtcqG4Fjjel1kdYZyxpQ 

bất cứ ai có thể giúp tôi những gì Tôi làm sai? Cảm ơn.

+0

Bạn nên di chuyển bản chỉnh sửa của mình thành câu trả lời cho câu hỏi của riêng bạn :-) – Marty

Trả lời

3

AARRRRGH !!!!!!!! Tôi chỉ có những từ bẩn đến PayPal !!!!!!! Vấn đề là ... (drumroll ... tadam!) Trong trường charset! Không, giá trị của nó phải giống như IPN đã gửi cho bạn, nhưng ... trong UPPERCASE! IPN gửi nó bằng chữ thường! Vì vậy, bạn PHẢI sửa đổi dữ liệu IPN để xác minh nó thành công bất kể hướng dẫn sử dụng cho chúng tôi để trả lại dữ liệu "as-is". Lỗi PayPal?

Vì vậy, mã làm việc cuối cùng của tôi là: (sử dụng HTTP_Request2)

protected function verifyPostData() { 
    $this->request->setBody('cmd=_notify-validate&' . str_replace('=utf-8', '=UTF-8', file_get_contents('php://input'))); 
    $response = $this->request->send(); 
    if ($response->getStatus() != 200) { 
     throw new \RuntimeException("Transaction data verification request failed with code {$response->getStatus()}"); 
    } 
    $content = trim($response->getBody()); 
    return ($content == 'VERIFIED'); 
} 

Làm thế nào tôi đã làm nó: tôi đã gửi yêu cầu PDT cho giao dịch này và dữ liệu giao dịch thu được. Sau đó, tôi đã thực hiện so sánh trường với dữ liệu PDT và IPN. PDT không có một số trường IPN như auth, verify_signtest_ipn. Nhưng tất cả các lĩnh vực khác dường như phải giống nhau. Và sự khác biệt duy nhất là trong trường hợp ký tự của trường charset. Sau đó, tôi đã cố gắng để xác minh dữ liệu sửa đổi và bất ngờ nó trở nên thành công!

0

Đây là lỗi PayPal gần đây, khi khách hàng hoàn tất thanh toán và nhấp vào "Nhấp vào đây để trả lại .." thay vì chờ vài giây, thông số được chuyển đến tập lệnh PDT trên trang web của bạn được gửi bằng chữ thường.

Điều này cũng làm hỏng những thứ như thông số cm/tùy chỉnh nhạy cảm hoặc được mã hóa.

Dường như PayPal nhận thức được điều đó.

Các vấn đề liên quan