C# 付款成功,我们的数据与查询字符串数据匹配,但无论如何都会变成无效!

C# 付款成功,我们的数据与查询字符串数据匹配,但无论如何都会变成无效!,c#,.net,asp.net,razor,paypal,C#,.net,Asp.net,Razor,Paypal,为什么我写的ipn脚本总是失败?即使它与paypal发送给我的查询字符串中的所有内容都匹配,它也总是变为无效 通知.cshtml?tx=b78v54b5b55rby92S&st=Completed&amt=3.04&cc=USD&cm=&item\u number=&merchant\u return\u link=return+to+web+site+name&form\u charset=UTF-8 检查它的部分是: string LiveURL = "https://www.paypal.

为什么我写的ipn脚本总是失败?即使它与paypal发送给我的查询字符串中的所有内容都匹配,它也总是变为无效

通知.cshtml?tx=b78v54b5b55rby92S&st=Completed&amt=3.04&cc=USD&cm=&item\u number=&merchant\u return\u link=return+to+web+site+name&form\u 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;
    }
}

代码看起来不错。问题一定是
响应
不匹配
“已验证”

您不是碰巧在土耳其,在比较之前将
response
更改为大写*


*)如果区域设置为土耳其,大写的字符串将
i
转换为
İ
,而不是
i
(只是字符串操作的众多陷阱之一)

代码看起来很好。问题一定是
响应
不匹配
“已验证”

您不是碰巧在土耳其,在比较之前将
response
更改为大写*


*)如果区域设置为
Turkey
,则字符串的大写字母将
i
转换为
İ
,而不是
i
(只是字符串操作的众多陷阱之一)

我认为您尝试的Paypal方法如下所示
如果您得到payment\u status=INVALID,那么请在payment\u reason中检查原因。我认为您尝试的Paypal方法如下
如果您得到付款状态=无效,那么请检查付款原因中的原因。我看不到您在代码中定义了在if中检查的结果,也看不到您在开关中检查了请求,当然这应该是在响应中检查的结果。

我看不到您在代码中定义了在if中检查的结果,此外,在交换机中,您正在根据请求进行检查,当然这应该是针对响应的?

在“已验证”块中,检查:

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

}
请求[“st”]不正确

请确保在PayPal admin中的一个位置设置IPN URL,并且不要同时使用其他形式的返回URL检查(无法立即记住其名称)和IPN

没有“商户返回链接”参数;我想应该是“通知url”。。。URL字符串和参数列表在我看来不合适;例如:&cm=&item\U编号

我知道您的参数列表对于您的情况来说是唯一的,但下面是一些示例代码,我在其中构建了要传递给PayPal的URL:

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();
        }
受保护的字符串GetPayPalURL(字符串服务器\u URL、字符串业务、字符串[]项名称、,
int[]数量、十进制[]数量、双[]重量、字符串invoiceID、字符串transID、字符串NOTIFY\u URL)
{
//客户将被要求指定送货地址贝宝-非常重要
常量字符串NO_SHIPPING=“2”;
StringBuilder url=新的StringBuilder();
Append(SERVER_url+“?cmd=_cart&upload=1”);
Append(“&business=“+HttpUtility.UrlEncode(business));
for(int i=0;i
在“已验证”块中,检查:

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

}
请求[“st”]不正确

请确保在PayPal admin中的一个位置设置IPN URL,并且不要同时使用其他形式的返回URL检查(无法立即记住其名称)和IPN

没有“商户返回链接”参数;我想应该是“通知url”。。。URL字符串和参数列表在我看来不合适;例如:&cm=&item\U编号

我知道您的参数列表对于您的情况来说是唯一的,但下面是一些示例代码,我在其中构建了要传递给PayPal的URL:

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();
        }
受保护的字符串GetPayPalURL(字符串服务器\u URL、字符串业务、字符串[]项名称、,
int[]数量、十进制[]数量、双[]重量、字符串invoiceID、字符串transID、字符串NOTIFY\u URL)
{
//客户将被要求指定送货地址贝宝-非常重要
常量字符串NO_SHIPPING=“2”;
StringBuilder url=新的StringBuilder();
Append(SERVER_url+“?cmd=_cart&upload=1”);
Append(“&business=“+HttpUtility.UrlEncode(business));
for(int i=0;i
嗯,不,我不是土耳其人