C# paypal IPN communication

本文关键字:communication IPN paypal | 更新日期: 2023-09-27 18:15:43

我已经设置了IPN,以便在Paypal内与我的网站通信,但由于某种原因Paypal似乎没有调用它。下面是正在监听的方法,但它似乎没有得到任何东西。

谁能告诉我写字的方向?

感谢
[HttpPost]
    public void paypalipn(string receiver_email, string receiver_id, string test_ipn, string txn_id, string payer_id, string payer_status, string payment_date, string payment_status, string payment_type)
    {
        string subject = "Audit - Paypal IPN ";
        string buildemail = "receiver_email: " + receiver_email;
        buildemail += "receiver_id: "+receiver_id;
        buildemail += "<br>test_ipn: "+test_ipn;
        buildemail += "<br>txn_id: " + txn_id;
        buildemail += "<br>payer_id: " + payer_id;
        buildemail += "<br>payer_status: " + payer_status;
        buildemail += "<br>payment_date: " + payment_date;
        buildemail += "<br>payment_status: " + payment_status;
        buildemail += "<br>payment_type: " + payment_type;
        Libraries.Email.Product.SendAudit(subject, buildemail);

    }

C# paypal IPN communication

如果您在PayPal账户中设置IPN,请确保它是启用的并且URL是正确的。此外,如果您在帐户中设置了IPN,您可以检查您的IPN历史记录,看看是否正在发送IPN帖子。它们将被标记为已发送、重试或失败。如果它们处于失败或重试状态,您可以单击该消息,如果您的服务器正在发回任何错误代码,则应在此处列出。此外,检查服务器上的错误日志,以确保脚本没有出错。

我这样做了:

public class IPNData
{
    public string Response { get; set; }
    public NameValueCollection Args { get; set; }
}

然后从请求中收集数据的方法,并将数据发送给Paypal进行验证。

IPNData GetIPNData()
{
    var ipnData = new IPNData();
    var param = Request.BinaryRead(HttpContext.Request.ContentLength);
    var ipnStr = Encoding.ASCII.GetString(param);
    ipnData.Args = HttpUtility.ParseQueryString(ipnStr);
    // Return the ipn string to paypal for validation
    ipnStr += "&cmd=_notify-validate";
    var request = (HttpWebRequest)WebRequest.Create("https://www.paypal.com/cgi-bin/webscr");
    request.Method = "POST";
    request.ContentType = "application/x-www-form-urlencoded";
    request.ContentLength = strRequest.Length;
    using (var sw = new StreamWriter(request.GetRequestStream(), Encoding.ASCII))
    {
        sw.Write(ipnStr);
    }
    using (var sr = new StreamReader(request.GetResponse().GetResponseStream()))
    {
        // Response should be "VERIFIED"
        ipnData.Response = sr.ReadToEnd();
    }
    return ipnData;
}

PaymentController.cs的订阅支付的例子,或者如果用户取消订阅。

public ActionResult PaypalIPNExample()
{
    var ipn = GetIPNData();
    if (ipn.Response != "VERIFIED")
    {
        // Do some logging
        return null;
    }
    var type = ipn.Args["txn_type"];
    var email = ipn.Args["payer_email"];
    var transactionId = ipn.Args["txn_id"];
    switch (type)
    {
        case "subscr_cancel":
            UserService.CancelSubscription(email);
            break;
        case "subscr_payment":
            if (ipn.Args["payment_status"].Equals("Completed"))
            {
                LogPayment(email, transactionId);
                UserService.ExtendMembership(email);
            }
            break;
        default:
            // Do some logging?
            break;                    
    }
    return Json("ok");
}

当我调试PayPal IPN响应时,我做了这样的事情:

string keysReceived = "";
foreach (string key in Request.Params.AllKeys)
   keysReceived += "'r'nKey: " + key + ", Val: " + Request.Params[key];
string debugLogPath = HttpContext.Server.MapPath("/") + "debug_PayPalNotify.log";
System.IO.File.AppendAllText(debugLogPath, keysReceived);

注意全局对象Request的使用。您可以使用它做很多调试工作。