IPN 验证在应该失败时不会失败

Posted

技术标签:

【中文标题】IPN 验证在应该失败时不会失败【英文标题】:IPN validation doesn't fail when it should fail 【发布时间】:2018-07-24 10:11:53 【问题描述】:

我正在尝试设置 PayPal 来处理付款。一切正常,除了当我的 IPN 没有向 PayPal 发送验证消息时付款没有被取消。据我了解,如果 IPN 未验证应取消交易的付款。 代码如下:

[HttpPost]
public IActionResult Receive()

    //Store the IPN received from PayPal
    LogRequest(Request);

    Task.Run(() => VerifyTask(Request));

    //Reply back a 200 code
    return new EmptyResult();


private void VerifyTask(HttpRequest ipnRequest)

    try
    
        VerifyIpnParamsWithException(ipnRequest);
        var verificationRequest = (HttpWebRequest)WebRequest.Create("https://www.paypal.com/cgi-bin/webscr");

        //Set values for the verification request
        verificationRequest.Method = "POST";
        verificationRequest.ContentType = "application/x-www-form-urlencoded";
        var param = ReadRequestBody(ipnRequest.Body);
        var strRequest = Encoding.ASCII.GetString(param);

        //Add cmd=_notify-validate to the payload
        strRequest = "cmd=_notify-validate&" + strRequest;
        verificationRequest.ContentLength = strRequest.Length;

        //Attach payload to the verification request
        using (var streamOut = new StreamWriter(verificationRequest.GetRequestStream(), Encoding.ASCII))
        
            streamOut.Write(strRequest);
            streamOut.Close();
        
        var verificationResponse = string.Empty;

        //Send the request to PayPal and get the response
        using (var streamIn = new StreamReader(verificationRequest.GetResponse().GetResponseStream()))
        
            verificationResponse = streamIn.ReadToEnd();
            streamIn.Close();
        
        ProcessVerificationResponse(verificationResponse);
    
    catch (Exception exception)
    
        DAL.LogError(exception, ipnRequest);
    

当我测试它时,根据我的日志,在向 PayPal 发送验证消息之前引发了异常。这笔钱已转入 PayPal 账户并完成交易这一事实并没有改变。我误会了吗?为了取消交易,我还需要做些什么吗?

【问题讨论】:

【参考方案1】:

IPN 功能是通知商家有关付款动作,其中包括:

收到的付款,包括快速结帐和自适应付款。

信用卡授权。

电子支票付款和相关的待处理、已完成或拒绝状态事件。

定期付款和订阅操作。

拒付、争议、撤销和退款

如果您没有验证发送给您的听众的文本,IPN 不会取消付款。

来自 PayPal 的更多文章:https://developer.paypal.com/docs/classic/products/instant-payment-notification/

【讨论】:

有趣。在那种情况下,除了使用功能非常有限的已保存按钮之外,还有其他方法可以验证客户没有更改付款吗? PayPal API(非常烦人)是唯一的出路吗? IPN 基本上是两种通信方式,PayPal 向您发送消息,而您的听众将使用未更改的文本回发消息。这将确保交易最初来自 PayPal。

以上是关于IPN 验证在应该失败时不会失败的主要内容,如果未能解决你的问题,请参考以下文章

Paypal IPN:证书验证失败

IPN 传递失败:500 内部服务器错误(沙盒)

Perl PayPal IPN 侦听器返回“500 SSL 握手失败”消息

使用 fsockopen 的警报握手失败 paypal IPN 集成

Paypal IPN 和 wordpress 失败

即使可以从 Internet 访问 URL,Paypal IPN 触发也会失败?