gpt4 book ai didi

c# - 使用 Paypal 的 IPN、C# 连接数据库时出现问题

转载 作者:太空宇宙 更新时间:2023-11-03 16:00:54 25 4
gpt4 key购买 nike

public partial class ipn : System.Web.UI.Page
{
string connectionString = ConfigurationManager.ConnectionStrings["LocalSqlServer"].ToString();
String fname, lname, mc_gross, Pmtcurrency, Payer_email;
string receiver_email, payment_date, payment_status;
string txn_type, amount;
string payer_id, txn_id;
string Verify_sign;
string result;


protected void Page_Load(object sender, EventArgs e)
{
//Post back to either sandbox or live
string strSandbox = "https://www.sandbox.paypal.com/cgi-bin/webscr";
string strLive = "https://www.paypal.com/cgi-bin/webscr";
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(strSandbox);

//Set values for the request back
req.Method = "POST";
req.ContentType = "application/x-www-form-urlencoded";
byte[] param = Request.BinaryRead(HttpContext.Current.Request.ContentLength);
string strRequest = Encoding.ASCII.GetString(param);
string ipnPost = strRequest;
strRequest += "&cmd=_notify-validate";
req.ContentLength = strRequest.Length;

//Send the request to PayPal and get the response
StreamWriter streamOut = new StreamWriter(req.GetRequestStream(), System.Text.Encoding.ASCII);
streamOut.Write(strRequest);
streamOut.Close();
StreamReader streamIn = new StreamReader(req.GetResponse().GetResponseStream());
string strResponse = streamIn.ReadToEnd();
streamIn.Close();

// logging ipn messages... be sure that you give write
// permission to process executing this code
string logPathDir = ResolveUrl("Messages");
string logPath = string.Format("{0}\\{1}.txt",
Server.MapPath(logPathDir), DateTime.Now.Ticks);
File.WriteAllText(logPath, ipnPost);

if (strResponse == "VERIFIED")
{
result = "VERIFIED";

fname = Convert.ToString(HttpContext.Current.Request.Form["first_name"]);
lname = Convert.ToString(HttpContext.Current.Request.Form["last_name"]);
mc_gross = Convert.ToString(HttpContext.Current.Request.Form["mc_gross"]);

Pmtcurrency = Convert.ToString(HttpContext.Current.Request.Form["mc_currency"]);

Payer_email = Convert.ToString(HttpContext.Current.Request.Form["payer_email"]);
Payer_email = Payer_email.Replace("%40", "@");

txn_id = Convert.ToString(HttpContext.Current.Request.Form["txn_id"]);
payer_id = Convert.ToString(HttpContext.Current.Request.Form["payer_id"]);
amount = Convert.ToString(HttpContext.Current.Request.Form["payment_gross"]); ;

payment_date = Convert.ToString(HttpContext.Current.Request.Form["payment_date"]); ;
payment_date = payment_date.Replace("%3A", ":");
payment_date = payment_date.Replace("+", " ");
payment_date = payment_date.Replace("%2C", " ");

txn_type = Convert.ToString(HttpContext.Current.Request.Form["txn_type"]); // 'cart'

Verify_sign = "ipn";

payment_status = Convert.ToString(HttpContext.Current.Request.Form["payment_status"]); ;

receiver_email = Convert.ToString(HttpContext.Current.Request.Form["receiver_email"]);
receiver_email = receiver_email.Replace("%40", "@");

if (payment_status.Equals("Completed"))
{
/*
using (SqlConnection connection = new SqlConnection(connectionString))
using (SqlCommand command = connection.CreateCommand())
{
command.CommandText = "UPDATE table SET memPhone = @memPhone WHERE uName='testName'";
command.Parameters.AddWithValue("@memPhone", payment_status);

connection.Open();
command.ExecuteNonQuery();
connection.Dispose();
}
*/

}
else if (payment_status.Equals("Denied") || payment_status.Equals("Failed") || payment_status.Equals("Refunded") || payment_status.Equals("Reversed") || payment_status.Equals("Voided"))
{

}
else if (payment_status.Equals("In-Progress") || payment_status.Equals("Pending") || payment_status.Equals("Processed"))
{

}
else if (payment_status.Equals("Canceled_Reversal"))
{

}
else
{

}
}
else if (strResponse == "INVALID")
{
//log for manual investigation
}
else
{
//log response/ipn data for manual investigation
}

}
}

当它出现在 payment_status.Equals("Completed") 分支中时,IPN 处理程序(或任何其他 IPN 实现)不起作用:

using (SqlConnection connection = new SqlConnection(connectionString))
using (SqlCommand command = connection.CreateCommand())
{
command.CommandText = "UPDATE table SET memPhone = @memPhone WHERE uName='testname'";
command.Parameters.AddWithValue("@memPhone", payment_status);

connection.Open();
command.ExecuteNonQuery();
connection.Dispose();
}

当此 sql 命令代码不存在时,IPN 处理程序和实现可以正常工作,但我显然需要它来更新数据库。

我已将此代码放入所有其他 if 分支(“拒绝”、“进行中”、“取消_Reversal”),但它没有任何效果,所以我知道 IPN 正在寻找正确的“已完成”分支,而不是这些其他人。

有没有人知道发生这种情况的特定 Paypal 原因或在这里看到代码有任何问题?

顺便说一句,我知道我正在尝试将“已完成”传递到 memPhone(它是一个 varchar)中,但这没有意义。我只是用它来测试 SQL 是否正常工作,因为它们都是字符串。

最佳答案

I can't debug it in Visual Studio unfortunately

是的,你可以。您可以根据需要模拟请求的简单程度或完整程度,以便您可以在内部单步执行代码。您可以将原始有效负载“保存”在某处(或者甚至只是将其通过电子邮件发送给您自己),然后对其进行模拟。还有其他工具 - 例如

  • 使用 PayPal's IPN simulator - 虽然这不如处理您收到的实际数据那么好...

  • 您可以使用 Requestb.in 替代上述过程或类似服务,以便您可以获取原始数据的快照以使用和模拟请求。

获得原始数据后,您可以选择任何方式模拟 POST(例如,curl 到以 Debug模式运行的本地 box 应用程序)。

示例 IPN 模拟器 POST 到 Requestb.in .如果示例链接已过期(在本文发布 48 小时后),请在下方截图:

Request.bin sample


一般来说,仅根据以上帖子/评论,您的问题集中在您的 SQL 进程上。正如建议的那样,您应该 try/catch 因为您对建议的回答似乎只是您的假设。您的 catch 可以简单地通过电子邮件向您发送异常消息,然后您可以获得更多详细信息(并且可能不必经历上述所有模拟)。

嗯...

关于c# - 使用 Paypal 的 IPN、C# 连接数据库时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28701857/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com