PayPal 即时付款通知 (IPN) 无法正常工作 ASP.NET C#

Posted

技术标签:

【中文标题】PayPal 即时付款通知 (IPN) 无法正常工作 ASP.NET C#【英文标题】:PayPal Instant Payment Notification (IPN) not working ASP.NET C# 【发布时间】:2015-02-18 00:09:49 【问题描述】:

我正在尝试让 IPN 为我的网站工作,但到目前为止没有任何成功。

我已将所有 PayPals 文档涂红,并设置了所有必需的配置以使 IPN 正常工作。 这是我到目前为止所做的: 1、创建开发账号; 2. 将我的网站支付偏好更新为自动退货:开启; 3. 在我的个人资料属性中开启即时付款通知; 4. 创建了一个测试支付选项事件:

protected void btCheckout_Click(object sender, EventArgs e)

    var queryString = System.Web.HttpUtility.ParseQueryString(string.Empty);

    queryString["cmd"] = "_cart";
    queryString["business"] = "xpto-facilitator@xpto.com";
    queryString["upload"] = "1";

    queryString["item_name_1"] = "My Cart Item 1";
    queryString["quantity_1"] = "1";
    queryString["amount_1"] = "100.00";

    queryString["shopping_url"] = "http://xpto.com/Client/Checkout";
    queryString["return"] = "http://xpto.com/Client/Checkout";
    queryString["notify_url"] = "http://xpto.com/CheckoutResult.aspx";

    Response.Redirect("https://www.sandbox.paypal.com/cgi-bin/webscr?" + queryString.ToString());

5.创建IPN页面:

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";
    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);
    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();

    if (strResponse == "VERIFIED")
    
        //log for debugging purposes
        LogManager.Error("CheckoutResult VERIFIED:" + strResponse);
    
    else if (strResponse == "INVALID")
    
        //log for debugging purposes
        LogManager.Error("CheckoutResult INVALID: " + strResponse);
    
    else
      
        //log for debugging purposes
        LogManager.Error("CheckoutResult something else: " + strResponse);
    

    我设法继续结帐并成功支付了物品; 我的 IPN 页面未执行,因为我没有记录任何内容; 用即时付款通知 (IPN) 模拟器测试了我的处理程序,我总是收到以下错误:

由于 HTTP 错误,我们无法发送 IPN:401:未经授权

我究竟做错了什么?我错过了什么吗?

【问题讨论】:

【参考方案1】:

您为 IPN 指定的 notify_url 设置为需要登录的端点。

queryString["notify_url"] = "http://xpto.com/CheckoutResult.aspx";

此 URL 必须设置为可以接受和处理来自 IPN 服务的 POST 请求而无需任何登录的端点(我似乎找不到任何特别提到此要求的文档)。这就是为什么您的听众收到的 IPN 必须经过验证(您看起来是正确的)的主要原因,因为在验证之前,无法完全相信收到的请求是由 PayPal 发送的。

【讨论】:

嗨@JasonZ,谢谢你的回复!我在问题中添加的网址只是一个示例,因此我不必分享真实地址(因为客户保密)。但原因真的是,我有网站密码保护,我完全忘记了这一点:-/再次感谢您的提醒:)

以上是关于PayPal 即时付款通知 (IPN) 无法正常工作 ASP.NET C#的主要内容,如果未能解决你的问题,请参考以下文章

Authorize.Net 上的 IPN(即时付款通知)就像 Paypal 一样

如何在 PHP 中使用 IPN(即时付款通知)在 Paypal 中配置定期付款

设置 PayPal 即时付款通知后,我可以追溯重新发送历史交易的 IPN 吗?

通过即时付款通知取消贝宝定期付款

PayPal 是不是支持捐赠按钮的 webhook 或即时付款通知?

Paypal 发送了 IPN 的警告电子邮件