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

标签 c# asp.net paypal

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/

相关文章:

asp.net - asp :button and html's button之间的区别

paypal - 我可以使用 BlueSnap 销售 PayPal 产品并在当天晚些时候收取额外费用吗?

ajax - Paypal 循环计费的退款交易

c# - 在 LINQ to SQL 中选择 "IN"

asp.net - asp.net 中的表格格式问题

c# - 如何使用 C# .net 获取包含 HTML 标签的字符串的子字符串?

Paypal Payflow Pro :- getting error 23 "Invalid account number"

c# - c# string 如何计算它自己的值?

c# - Asp.Net Mvc - 如何在共享 View 中有一个 "controller"

c# - 转换 11/1/2012 3 :42:09 AM to November 1 , 2012