Экспресс-проверка PayPal с возвратом ответа в формате html в MVC .net - PullRequest
6 голосов
/ 21 апреля 2011

У меня было тестовое приложение, интегрированное с экспресс-проверкой Paypal, и оно работало нормально.Но сейчас, похоже, возникает проблема.После успешной оплаты на PayPal, когда мой обработчик IPN проверяет ответ, PayPal возвращает ответ в виде HTML-страницы вместо «ПРОВЕРЕНО» ИЛИ «НЕДОПУСТИМО», и из-за этого я не могу подтвердить платеж.Есть ли какие-либо изменения в Paypal в последнее время для экспресс-оплаты?Ниже приведен полный код

<form id="Paypal" name="Paypal" action="https://www.sandbox.paypal.com/cgi-bin/webscr"
    method="post">
    @Html.Hidden("cmd", "_xclick")
    @Html.Hidden("business", "myemail@test.com")
    @Html.Hidden("item_name", "Payment for course registration")
    @Html.Hidden("amount", 100 )
    @Html.Hidden("no_shipping", "1")
    @Html.Hidden("return", "http://localhost:49319/cart/IPN")
    @Html.Hidden("rm", "2")
    @Html.Hidden("notify_url", "http://localhost:49319/cart/IPN")
    @Html.Hidden("cancel_return", "http://localhost:49319/cart/PaymentFailure")
    @Html.Hidden("currency_code", "CAD")
    @Html.Hidden("tax_cart", "1")
    @Html.Hidden("custom", "12")
    <div class="checkout-button">
        <input type="image" src="https://www.paypal.com/en_US/i/btn/btn_xpressCheckout.gif"
            align="left" style="margin-right: 7px;" />
    </div>
    </form>

Код обработчика IPN:

 string paypalUrl = useSandbox ? "https://www.sandbox.paypal.com/cgi-bin/webscr"
            : "https://www.paypal.com/cgi-bin/webscr";


        HttpWebRequest req = (HttpWebRequest)WebRequest.Create(paypalUrl);

        // Set values for the request back
        req.Method = "POST";
        req.ContentType = "application/x-www-form-urlencoded";

        byte[] param = Request.BinaryRead(Request.ContentLength);
        string strRequest = Encoding.ASCII.GetString(param);

        StringBuilder sb = new StringBuilder();
        sb.Append(strRequest);

        foreach (string key in formVals.Keys)
        {
            sb.AppendFormat("&{0}={1}", key, formVals[key]);
        }
        strRequest += sb.ToString();
        req.ContentLength = strRequest.Length;

        //for proxy
        //WebProxy proxy = new WebProxy(new Uri("http://urlort#");
        //req.Proxy = proxy;
        //Send the request to PayPal and get the response
        string response = "";
        using (StreamWriter streamOut = new StreamWriter(req.GetRequestStream(), System.Text.Encoding.ASCII))
        {

            streamOut.Write(strRequest);
            streamOut.Close();
            using (StreamReader streamIn = new StreamReader(req.GetResponse().GetResponseStream()))
            {
                response = streamIn.ReadToEnd();
            }
        }

        return response;

Редактировать: Вот строка запроса, отправленная Paypal

CONTEXT = wtgSziM4C5x0SI-9CmKcv2vkSeTLK5P_g6HqzC__YTYkcqziFNcB84p79Ja & myAllTextSubmitID = & CMD = _flow & transaction_subject = 12 & txn_type = web_accept & PAYMENT_DATE = 01% 3A59% 3A21 + мая + 02% 2C + 2011 + PDT & last_name = User & residence_country = CA & pending_reason = paymentreview & item_name = Платежное + для + конечно + регистрация & payment_gross = & mc_currency = CAD и бизнес = pramod_1298956597_biz% 40sumerusolutions.com & payment_type= мгновенная & protection_eligibility = Ineligible & payer_status = проверено и verify_sign = Ag7LtkvrF1u9.1ScLJwRM4btR1G1A16qsCs-xUl6EpI1rE1UWpodXJsc & txn_id = 15Y20623GD922445F & payer_email = pramod_1298961722_per% 40sumerusolutions.com и налог = 0,00 & test_ipn = 1 & first_name = Test & receiver_email = pramod_1298956597_biz% 40sumerusolutions.com и количество = 1 & payer_id = Z2MRT3Q9L6E28 & receiver_id = RT3M59WESZHEE & ITEM_NUMBER = & payment_status = Pending & handling_amount = 0,00 & доставка = 0,00 & mc_gross =850,00 и пользовательские = 12 & кодировка = окна-1252¬ify_version = 3,1 & merchant_return_link = нажмите + здесь и form_charset = UTF-8CONTEXT = wtgSziM4C5x0SI-9CmKcv2vkSeTLK5P_g6HqzC__YTYkcqziFNcB84p79Ja & myAllTextSubmitID = & CMD = _flow & transaction_subject = 12 & txn_type = web_accept & PAYMENT_DATE = 01% 3A59% 3A21 + мая + 02% 2C + 2011 + PDT & last_name = User & residence_country = CA & pending_reason= paymentreview & item_name = Платежное + для + конечно + регистрация & payment_gross = & mc_currency = CAD и бизнес = pramod_1298956597_biz% 40sumerusolutions.com & payment_type = мгновенная & protection_eligibility = Ineligible & payer_status = проверено и verify_sign = Ag7LtkvrF1u9.1ScLJwRM4btR1G1A16qsCs-xUl6EpI1rE1UWpodXJsc & txn_id = 15Y20623GD922445F & payer_email = pramod_1298961722_per% 40sumerusolutions.com и налог = 0,00 & test_ipn = 1 & first_name = Test & receiver_email = pramod_1298956597_biz%40sumerusolutions.com и количество = 1 & payer_id = Z2MRT3Q9L6E28 & receiver_id = RT3M59WESZHEE & ITEM_NUMBER = & payment_status = Pending & handling_amount = 0,00 & доставка = 0,00 & mc_gross = 850,00 & заказ = 12 & кодировок = окна-1252¬ify_version = 3,1 & merchant_return_lчернила = нажмите + здесь и form_charset = UTF-8 & CMD = _notify-Validate

Ответы [ 5 ]

5 голосов
/ 05 мая 2011

Хорошо. После долгих проб и ошибок и публикации этой проблемы на форуме PayPal, я получил свой платежный шлюз. Хотя я не очень доволен решением. Решение - использовать PDT и не использовать IPN. Ответ, который я получил от поддержки PayPal, был «Проблема в том, что IPN является дополнительной системой уведомлений, и в ней есть небольшая задержка. Так что это не 100% идеальное решение для автоматического возврата страницы».

Paypal предложил мне использовать PDT, и теперь он работает. Я опишу шаги здесь, чтобы это могло помочь кому-то, кто также сталкивается с такой проблемой:

  1. Активируйте функцию «Возврат» и функцию PDT в своей учетной записи PayPal. шаги: Войдите в свою учетную запись PayPal нажмите на профиль нажмите на сайте Платежные настройки установите для автоматического возврата значение Вкл. введите действительный URL в текстовое поле Return URL установите параметр Передача платежных данных на. Запишите отображаемый токен PDT. прокрутите страницу вниз и нажмите «Сохранить»

  2. Передайте параметры ниже в paypal cmd, business, item_name, сумму, возврат, currency_code, custom.

  3. Измените код обработчика IPN с помощью кода PDT, код PDT в моем случае, как показано ниже -

    string authToken, txToken, query; строка strResponse;

        authToken = ConfigurationManager.AppSettings["PDTToken"];
    
        //read in txn token from querystring
        txToken = Request.QueryString.Get("tx");
    
    
        query = string.Format("cmd=_notify-synch&tx={0}&at={1}", txToken, authToken);
    
        // Create the request back
        string url = ConfigurationManager.AppSettings["PayPalUrl"];
        HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
    
        // Set values for the request back
        req.Method = "POST";
        req.ContentType = "application/x-www-form-urlencoded";
        req.ContentLength = query.Length;
    
        // Write the request back IPN strings
        StreamWriter stOut = new StreamWriter(req.GetRequestStream(), System.Text.Encoding.ASCII);
        stOut.Write(query);
        stOut.Close();
    
        // Do the request to PayPal and get the response
        StreamReader stIn = new StreamReader(req.GetResponse().GetResponseStream());
        strResponse = stIn.ReadToEnd();
        stIn.Close();            
    
        // If response was SUCCESS, parse response string and output details
        if (strResponse.StartsWith("SUCCESS"))
        {
    
        }
    
0 голосов
/ 01 ноября 2011

IPN работает из C #, у меня была та же проблема, что и у вас (получение HTML-страницы с просьбой войти в систему), а затем я обнаружил, что мне не хватает следующей переменной в моем сообщении обратно в PayPal

cmd=_notify-validate

как только я добавил это правильно, запрос в PayPal сработал, как и ожидалось.

Еще одна вещь, которую нужно удостовериться, это то, что вы передаете переменные обратно, как они были получены в запросе IPN, просто добавьте указанную выше команду в начало вашего сообщения обратно.

Я не использую MVC, но я делаю это с WCF, и это работает как шарм.

Надеюсь, это поможет.

0 голосов
/ 15 сентября 2011

У меня точно такая же проблема при попытке настроить IPN ... У меня это работает, когда я отправляю "echeck" из песочницы, он возвращает VERIFIED, однако, когда я пытаюсь сделать экспресс-проверку, он не возвращает подтвержденныйили недействительный ... он возвращает что-то совершенно отличное от echeck ... это очень странно.

Я собираюсь обратиться в службу технической поддержки, в чем разница между этими двумя службами.

0 голосов
/ 03 мая 2011

Во-первых, я предлагаю вам перейти на сайт поддержки разработчиков Paypal .Хотя им может потребоваться некоторое время, чтобы ответить на вашу проблему, люди с большим опытом работы с Paypal, и я уверен, смогут дать вам ответ.

По вашей конкретной проблеме, и в моем Paypalопыт, я считаю, что есть два типа счетов PayPal.

Первый тип учетной записи позволяет вашему веб-сайту выступать в качестве третьей стороны, а именно:

  • пользователь отправляет платежную информацию на ваш веб-сайт
  • ваш веб-сайт сообщаетPayPal, получив ответ
  • , вы можете отобразить этот ответ пользователю на своем веб-сайте

Это, очевидно, то, что вы пытаетесь сделать.

Однако я считаю, что существует аккаунт Paypal второго типа.Этот аккаунт может быть дешевле, иметь менее строгие требования / условия или просто интегрироваться (в противном случае я не уверен, почему его выбрали).Я считаю, что эта учетная запись требует от вашего веб-сайта перенаправления пользователя на Paypal, где ему будет дан ответ.

  • пользователь отправляет платежную информацию
  • вы перенаправляете его на Paypal
  • они видят статус платежа или какое-то другое сообщение и могут щелкнуть ссылку, чтобы вернуться на ваш сайт (поставщика).

Я могу ошибаться, но это мое воспоминание о работе с PaypalAPI.Я настоятельно рекомендую вам перейти на сайт разработчиков Paypal, ссылка на который приведена выше.

0 голосов
/ 21 апреля 2011

Вы должны показать себе HTML, который возвращается. Вполне вероятно, что ваш аккаунт был заблокирован или что-то еще, и Paypal что-то вам отвечает. Можете ли вы показать нам этот HTML?

...