如何调试PayPalCoreSDK IPN验证失败

本文关键字:PayPalCoreSDK IPN 验证 失败 调试 何调试 | 更新日期: 2023-09-27 18:21:38

我正在使用PayPal自己的.NET库来验证IPN,特别是通过NuGet(2014-09-09发布)提供的PayPalCoreSDK 1.5.0中的IPNMessage.cs。

以下是我如何使用它:

[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一定不会回复"已验证"。没有抛出异常,如何调试?

如何调试PayPalCoreSDK IPN验证失败

发现我的应用程序甚至没有与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

扩展您自己的答案-是的,他们在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);

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


想知道为什么你没有得到一个错误

实际上,我进入了IPNMessage的源代码,看看发生了什么。下面的调用检索validate()方法中的URL。它在您的配置中查找它,并在失败时抛出异常(这正是我们想要的)。

不幸的是,它被封装在try块中,该块实际上应该只捕获运行时错误,但它却屏蔽了配置错误,只为validate()返回了一个无用的false

string ipnEndpoint = GetIPNEndpoint();