【问题标题】:How can I debug PayPalCoreSDK IPN validation failures?如何调试 PayPalCoreSDK IPN 验证失败?
【发布时间】:2014-11-05 22:18:51
【问题描述】:

我正在使用 PayPal 自己的 .NET 库来验证 IPN,特别是 PayPalCoreSDK 1.5.0 中的 IPNMessage.cs 可通过 NuGet 获得(2014 年 9 月 9 日发布)。

这是我的使用方法:

[HttpPost]
public ActionResult Ipn()
{
    try
    {
        byte[] bytes = Request.BinaryRead(Request.ContentLength);
        IPNMessage message = new IPNMessage(bytes);

        string description = string.Format("PayPal IPN {0} {1} {2}",
            message.IpnValue("txn_id"),
            message.IpnValue("payment_type"),
            message.IpnValue("payment_status"));

        Trace.TraceInformation(description + " Received");

        if (message.Validate())
        {
            Trace.TraceInformation(description + " Valid");
            // do work here
        }
        else
        {
            Trace.TraceError(description + " Invalid");
        }
    }
    catch (Exception e)
    {
        Trace.TraceError("PayPal IPN Exception: " + e.Message);
    }

    return null;
}

我的日志告诉我(txnId 已更改):

Application: 2014-09-11T19:52:40  PID[11584] Information PayPal IPN ABC536DEFP96XYZ3U instant Completed Received
Application: 2014-09-11T19:52:40  PID[11584] Error       PayPal IPN ABC536DEFP96XYZ3U instant Completed Invalid

IPN 本身充满了我所期待的所有键/值。当我登录 PayPal 并查看即时付款通知 (IPN) 历史记录部分时,我看到了具有匹配交易 ID 的 IPN,并且其状态为“已发送”。我刚从Validate() 回复false,所以PayPal 不能回复“已验证”。没有抛出异常,如何调试?

【问题讨论】:

    标签: c# asp.net asp.net-mvc paypal paypal-ipn


    【解决方案1】:

    原来我的应用甚至没有与 PayPal 通信。

    PayPalCoreSDK 在 app.config/web.config 中需要以下内容:

    <configuration>
      <configSections>
        <section name="paypal" type="PayPal.Manager.SDKConfigHandler, PayPalCoreSDK" />
      </configSections>
      <paypal>
        <settings>
          <add name="mode" value="sandbox" /> <!-- "live" or "sandbox" -->
        </settings>
      </paypal>
    </configuration>
    

    感谢James Dibble

    【讨论】:

      【解决方案2】:

      扩展您自己的答案 - 是的,他们在 API 中完全是白痴。

      IPN 消息实际上包含一个标志,无论该消息是否为沙盒 - 因此它应该能够自行解决此问题,而无需显式设置。或者至少它应该给出一个错误。

      或者,您可以提供这样的配置(我有一个 config 对象,它只是一个简单的结构)

      var message = new PayPal.IPNMessage(new Dictionary<string, string>()
                  {
                      { "account1.apiUsername", config.APIUsername },
                      { "account1.apiPassword", config.APIPassword },
                      { "account1.apiSignature", config.APISignature },
      
                      { "mode", config.IsLiveMode ? "live" : "sandbox" }
                  }, bytes);
      

      (我很确定这里实际上不需要帐户用户信息)


      想知道为什么没有收到错误消息?...

      我实际上进入了source code for IPNMessage 看看发生了什么。以下调用检索 validate() 方法内的 URL。它会在您的配置中查找并在失败时抛出异常(这是我们想要的)。

      不幸的是,它被包裹在一个 try 块中,该块实际上应该只捕获运行时错误 - 但它掩盖了配置错误,只为 validate() 返回一个无用的 false

      string ipnEndpoint = GetIPNEndpoint();
      

      【讨论】:

      • 如果有人可以花时间向 github 项目报告这将是很棒的。他们需要做的就是将这个GetIPNEndpoint 调用移动到try 块之外的两行
      • @simon-weaver,感谢您指出所需的更改(以及友好的刺拳;))。我已经打开了new issue in the SDK on GitHub that links back to this question
      • 天哪,我只记得昨晚我真的梦到有人在反对这种变化!真是一场噩梦!
      猜你喜欢
      • 2012-10-18
      • 2015-05-27
      • 1970-01-01
      • 2018-07-24
      • 2015-06-08
      • 1970-01-01
      • 2017-03-27
      • 2014-09-30
      • 2020-10-17
      相关资源
      最近更新 更多