如何调试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一定不会回复"已验证"。没有抛出异常,如何调试?
发现我的应用程序甚至没有与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();