Вопрос

Я пытаюсь выполнить обратный вызов IPN, используя сервлет.Код, который я использую, предоставлен paypal для проверки данных ipn.Но каждый раз, когда я получаю НЕДЕЙСТВИТЕЛЬНЫЙ ответ.

Вот этот код:

Enumeration en = req.getParameterNames();
String str = "cmd=_notify-validate";

    while (en.hasMoreElements()) {        
        String paramName = (String) en.nextElement();
        String paramValue = req.getParameter(paramName);

//str = str + "&" + paramName + "=" + URLEncoder.encode(paramValue,"UTF-8"); // for UTF-8 i set the encode format in my account as UTF-8
//str = str + "&" + paramName + "=" + URLEncoder.encode(paramValue,"ISO-8859-1");// for ISO-8859-1 i set the encode format in my account as ISO-8859-1
str = str + "&" + paramName + "=" + URLEncoder.encode(paramValue); //default as provided by paypal

    }
    URL u = new URL("http://www.sandbox.paypal.com/cgi-bin/webscr");
    URLConnection uc = u.openConnection();
    uc.setDoOutput(true);
    uc.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
    PrintWriter pw = new PrintWriter(uc.getOutputStream());
    pw.println(str);
    pw.close();

    BufferedReader in = new BufferedReader(new InputStreamReader(uc.getInputStream()));
    String res = in.readLine();
    in.close();

    if (res.equals("VERIFIED") || !res.equals("VERIFIED")) {
        //Update database...
    } else if (res.equals("INVALID")) {      
       //INVALID   
    }

Я проверил все три возможности, предоставленные paypal, на случай, если paypal вернет НЕДЕЙСТВИТЕЛЬНЫЙ, следующим образом:

1) Отсутствующие параметры - Поскольку я отправляю все параметры, никаких проблем с отсутствующими параметрами не возникает

2) Недопустимый URL-адрес.- Я использую песочницу, поэтому URL-это : http://www.sandbox.paypal.com/cgi-bin/webscr

3) Кодировка символов.- Пробовал использовать кодировку символов, аналогичную кодировке параметра настройки учетной записи paypal.

запрос, который я отправляю обратно в PayPal, используя следующие параметры:

cmd=_notify-validate&last_name=User&test_ipn=1&address_name=Test+User&txn_type=web_accept&receiver_email=sellr1_1252495907_biz%40gmail.com&residence_country=US&address_city=San+Jose&payment_gross=&payment_date=01%3A55%3A04+Sep+26%2C+2009+PDT&address_zip=95131&payment_status=Completed&address_street=1+Main+St&first_name=Test&payer_email=buyer1_1252495751_per%40gmail.com&protection_eligibility=Eligible&payer_id=BXBKS22JQCUWL&verify_sign=AOMkeg7ofCL7FJfioyWA19uCxD4XAgZirsjiGh8cUy1fd2YAqBwOkkst&payment_type=instant&business=sellr1_1252495907_biz%40gmail.com&address_country_code=US&mc_fee=0.64&address_status=confirmed&transaction_subject=True+Up&quantity=1ify_version=2.8&mc_currency=EUR&custom=&address_state=CA&payment_fee=&handling_amount=0.00&payer_status=verified&shipping=0.00&item_name=True+Up&tax=0.00&username=hannonj&charset=windows-1252&item_number=567&mc_gross=10.00&txn_id=7F456350BS7942738&receiver_id=MASSU6BSR9SC2&address_country=United+States

Пожалуйста, кто-нибудь может направить меня в нужное русло?Я не понимаю, что не так с кодом, URL-адресом или чем-то еще.Я перепробовал все возможности.Пожалуйста, помогите мне.

Это было полезно?

Решение 3

Спасибо вам, ребята, за ваш ответ.оооо, наконец-то я решил эту проблему.

На самом деле в URL уведомления я также добавил параметр username .Paypal хочет, чтобы значения параметров для IPN были такими же, какими они возвращаются сервлету.(Вы можете получить это как req.getParameterNames()).Поскольку у меня есть дополнительный параметр username, который неизвестен paypal.Paypal возвращал данные НЕДЕЙСТВИТЕЛЬНО.

Другие советы

Ан “НЕДЕЙСТВИТЕЛЬНЫЙ” сообщение отправлено по следующим причинам:

  • Убедитесь, что ваши отправляйте свой ответ по правильному URL-адресу, который является https://www.sandbox.paypal.com/cgi-bin/webscr или https://www.paypal.com/cgi-bin/webscr, в зависимости от того, проводите ли вы тестирование в изолированной среде или вы находитесь в режиме реального времени, соответственно.
  • Убедитесь, что ваш ответ на тестовое IPN-сообщение содержит точно такие же переменные и значения в качестве тестового сообщения и чтобы они располагались в том же порядке, что и в тестовом сообщении.Наконец, убедитесь, что исходным переменным предшествует переменная cmd=_notify-validate.
  • Убедитесь, что вы кодирование ваша строка ответа и использует ту же кодировку символов, что и в тестовом IPN-сообщении.(например, я вижу, что он использует буквы с умлаутом и другие символы, такие как “/” и т.д.).Что касается последнего пункта, продавец может попытаться изменить язык кодировки, используемый в его учетной записи PayPal, выполнив следующие действия:

    1. Войдите в свою учетную запись PayPal
    2. Нажмите на Профиль
    3. Перейдите на вкладку “Мои предпочтения в продажах”
    4. Нажмите на “Кодировка языка кнопки PayPal” (в конце страницы).
    5. Нажмите на "Другие параметры".
    6. Выберите из выпадающего меню:UTF-8
    7. Выберите ту же кодировку и для второго варианта, который связан с IPN
    8. Нажмите “Сохранить”.

Если проблема не устранена, мы рекомендуем ознакомиться с используемым скриптом, у PayPal есть несколько примеров кода IPN, доступных по адресу: https://github.com/paypal/ipn-code-samples

Для получения дополнительной информации я включаю ссылку: https://developer.paypal.com/webapps/developer/docs/classic/ipn/integration-guide/IPNTesting/#id091GFE00WY4

Я почти уверен, что URL для отправки - это просто "www.sandbox.paypal.com", см. главу 4 Руководства пользователя Sandbox , и что ж, это то, что я ввел для своего собственного кода (кстати, для live это также просто "www.paypal.com ", для их пример кода)

Если вы тестируете Paypal IPN через SSL, вам придется использовать ssl://www.sandbox.paypal.com в порту 443

Помните, что песочница PayPal имеет совершенно другие учетные данные.Чтобы использовать sandbox, у вас должна быть учетная запись разработчика и вы должны войти в панель разработки, чтобы использовать sandbox.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top