Оплата прошла успешно, и наши данные совпадают с данными строки запроса, но все равно попадают в INVALID - PullRequest
1 голос
/ 11 июля 2011

Почему мой скрипт ipn, который я написал, всегда терпит неудачу? Он всегда переходит в INVALID, даже если он совпадает со всем в строке запроса, которую мне отправляет PayPal?

notification.cshtml? Тх = b78v54b5b55rby92S & й = Завершена & амт = 3,04 & куб.см = USD & см = & ITEM_NUMBER = & merchant_return_link = Return + до + Интернет + сайт + имя и form_charset = UTF-8

И часть, которая проверяет это:

string LiveURL = "https://www.paypal.com/cgi-bin/webscr";

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(LiveURL);

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

byte[] parameters = Request.BinaryRead(HttpContext.Current.Request.ContentLength);
string RequestString = System.Text.Encoding.ASCII.GetString(parameters);

RequestString += "&cmd=_notify-validate";
request.ContentLength = RequestString.Length;

// Send request to PP and get response.
StreamWriter Sout = new StreamWriter(request.GetRequestStream(), System.Text.Encoding.ASCII);
Sout.Write(RequestString);
Sout.Close();

StreamReader Sin = new StreamReader(request.GetResponse().GetResponseStream());
string response = Sin.ReadToEnd();

Sin.Close();
if(result != null && result.OrderStatus == "Confirmed")
{
    switch(response)
    {
        case "VERIFIED":
            if(Request["st"] == "Completed")
            {
                var PPQuery = "SELECT TransactionId, OrderTotal FROM Orders WHERE OrderId = '" + Session["OSFOID"] + "' AND UserId = '" + WebSecurity.CurrentUserId + "'";
                var ppQueryResult = database.Query(PPQuery);
                foreach(var item in ppQueryResult)
                {
                    decimal fff = 3.04M;
                    if(item["TransactionId"] != Request["tx"])
                    {
                        if(item["OrderTotal"] == TotalPrice)
                        {
                            // Payment was a success. Convey that to the user.
                            output = "Thanks. Order complete.";
                        }
                        else
                        {
                            // Possible fraud. Log it.
                        }
                    }
                    else
                    {
                        // This is a duplicate transaction. Log it and Redirect to homepage.
                    }
                }
            }
            break;
        case "INVALID":
            output = "Invalid was returned. Investigate further.";
            break;
        default:
            output = "Other exception has occured. Investigate further and log.";
            break;
    }
}

Ответы [ 4 ]

2 голосов
/ 11 июля 2011

Код выглядит хорошо.Проблема должна быть в том, что response не соответствует "VERIFIED".

Вы не в Турции случайно, и перед сравнением измените response на прописные?*

*) Если языковым стандартом является Turkey, верхний регистр строки превращает i в İ, а не I (только одна из множества ловушек с манипуляцией строкой)

1 голос
/ 12 июля 2011

В блоке "VERIFIED" проверьте:

if (Request.Params["payment_status"] == "Completed")
{
        ...

}

Запрос ["st"] неверен.

Убедитесь, что URL-адрес IPN установлен в одном месте в администраторе PayPal и выполнитене использовать другую форму проверки возвращаемого URL-адреса (не могу вспомнить его название вручную) и IPN одновременно.

Нет параметра "merchant_return_link";Я думаю, что это должно быть "notify_url" ... строка URL и список параметров выглядят не так, как мне;например: & cm = & item_number

Я знаю, что ваш список параметров будет уникальным для вашей ситуации, но вот пример кода, где я создаю URL для передачи в PayPal:

protected string GetPayPalURL(string SERVER_URL, string business, string[] itemNames,
            int[] quantities, decimal[] amounts, double[] weight, string invoiceID, string transID, string NOTIFY_URL)
        {
            // Customer will be required to specify delivery address to PayPal - VERY IMPORTANT
            const string NO_SHIPPING = "2";

            StringBuilder url = new StringBuilder();
            url.Append(SERVER_URL + "?cmd=_cart&upload=1");
            url.Append("&business=" + HttpUtility.UrlEncode(business));

            for (int i = 0; i < itemNames.Length; i++)
            {
                url.Append("&item_name" + "_" + (i + 1).ToString() + "=" + HttpUtility.UrlEncode(itemNames[i]));
                url.Append("&quantity" + "_" + (i + 1).ToString() + "=" + quantities[i].ToString().Replace(",", "."));
                url.Append("&amount" + "_" + (i + 1).ToString() + "=" + amounts[i].ToString().Replace(",", "."));
                url.Append("&weight" + "_" + (i + 1).ToString() + "=" + weight[i].ToString().Replace(",", "."));
            }

            url.Append("&no_shipping=" + HttpUtility.UrlEncode(NO_SHIPPING));
            url.Append("&custom=" + HttpUtility.UrlEncode(invoiceID));
            url.Append("&txn_id=" + HttpUtility.UrlEncode(transID));
            url.Append("&notify_url=" + HttpUtility.UrlEncode(NOTIFY_URL));

            return url.ToString();
        }
1 голос
/ 11 июля 2011

Я думаю, что метод Paypal, который вы пытаетесь сделать, заключается в следующем: код проекта , и если вы получите payment_status = INVALID, то проверьте причину в payment_reason

0 голосов
/ 11 июля 2011

Я не вижу в коде, где вы определяете результат, который проверяется в if, также в переключателе, который вы проверяете по запросу, конечно, это должно быть против ответа?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...