2015-06-01 29 views
5

Przeszukałem to pytanie i wypróbowałem wszystkie sugestie, ale nic nie działa.PayPal sandbox Sprawdzanie poprawności IPN zawsze zwracane NIEPRAWIDŁOWE

Próbowałem tego kodu: https://developer.paypal.com/docs/classic/ipn/ht_ipn/, ale to nie działa. Po prostu skopiuj-wklej i usuń stare rutyny magick_quotes.

Próbowałem tego kodu: http://samples.geekality.net/view-source.php?file=ipn/ipn_handler.class.php i również nie działają.

We wszystkich przypadkach starałem się zrobić co następuje:

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

Aby zapewnić wysłałem do IPN dokładnie co wysłał do mnie. Dodatkowo użyłem serwera proxy debugowania (Fiddler) i zapisałem, co IPN wysłał do mnie i co wysłałem do IPN. Ciała żądania są identyczne bajt-to-bajt, ale moje żądanie jest poprzedzone ciągiem cmd=_notify-validate&.

Tak, zaznaczyłem, że używam właściwego adresu URL obszaru izolowanego. Oto cała wnioski organów:

Co IPN wysłał do mnie: (I po prostu zastępowana danych osobowych 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 

Co ja wysłane do 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 

Czy ktoś może mi pomóc, co Robię źle? Dzięki.

+0

Powinieneś przenieść swoją edycję do odpowiedzi na własne pytanie :-) – Marty

Odpowiedz

3

AARRRRGH !!!!!!!! Mam tylko brudne słowa do PayPal !!!!!!! Problem polegał na ... (drumroll ... tadam!) W polu charset! Nie, jego wartość musi być taka sama, jak IPN wysłała ci ją, ale ... w UPPERCASE! IPN wysyła je małymi literami! W związku z tym MUSISZ zmodyfikowad dane IPN, aby to zweryfikować, bez względu na to, czy instrukcja powie nam, abyśmy zwrócili dane "tak jak jest". Błąd PayPal?

Więc mój ostateczny kod robocza wynosi: (używając 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'); 
} 

jak to zrobiłem: Wysłałem prośbę PDT dla tej transakcji i uzyskanych danych transakcyjnych. Następnie wykonałem polowe porównanie danych PDT i IPN. PDT nie ma niektórych pól IPN, takich jak auth, verify_sign i test_ipn. Ale wszystkie inne dziedziny wydają się być takie same. I jedyna różnica była w przypadku znaków w polu charset. Potem próbowałem zweryfikować zmodyfikowane dane i niespodziewanie się udało!

0

To jest ostatni błąd PayPal, gdy klient zakończył płatność i klika "Kliknij tutaj, aby powrócić .." zamiast czekać kilka sekund, parametry przekazane do skryptu PDT w Twojej witrynie są wysyłane małymi literami.

Powoduje to również rozróżnienie między znacznikami lub zakodowanym znacznikiem cm/niestandardowym wielkości liter.

Podobno PayPal zdaje sobie z tego sprawę.