C# 付款成功,我们的数据与查询字符串数据匹配,但无论如何都会变成无效!
为什么我写的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 检查它的部分是: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.
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("¬ify_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("¬ify_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
嗯,不,我不是土耳其人