Paypal IPN模拟器“;无法提取响应:未找到内容类型";

Paypal IPN模拟器“;无法提取响应:未找到内容类型";,paypal,paypal-ipn,paypal-sandbox,Paypal,Paypal Ipn,Paypal Sandbox,自从贝宝在过去几周对他们的开发者API进行了一些修改后,我注意到开发者中心的IPN模拟器不再像我预期的那样对测试IPN做出响应。现在,它发出了这样的信息: “IPN传递失败:无法提取响应:未找到内容类型” 测试IPN本身似乎执行得很好——我的IPN控制器(在ASP中)正在接收IPN,并将其回显,而PayPal正以我所期望的“已验证”响应 这只是一个模拟器前端错误,还是我遗漏了什么?我的代码(据我所知)肯定会发送ContentType头,就像它一直以来一样: req.Method = "POST"

自从贝宝在过去几周对他们的开发者API进行了一些修改后,我注意到开发者中心的IPN模拟器不再像我预期的那样对测试IPN做出响应。现在,它发出了这样的信息:

“IPN传递失败:无法提取响应:未找到内容类型”

测试IPN本身似乎执行得很好——我的IPN控制器(在ASP中)正在接收IPN,并将其回显,而PayPal正以我所期望的“已验证”响应

这只是一个模拟器前端错误,还是我遗漏了什么?我的代码(据我所知)肯定会发送ContentType头,就像它一直以来一样:

req.Method = "POST";
req.ContentType = "application/x-www-form-urlencoded"; <-- ## HEADER IS PRESENT ##
byte[] param = Request.BinaryRead(HttpContext.Request.ContentLength);
string strRequest = Encoding.ASCII.GetString(param);
strRequest += "&cmd=_notify-validate";
req.ContentLength = strRequest.Length;
req.Method=“POST”;

req.ContentType=“应用程序/x-www-form-urlencoded” 否-这看起来像是IPN处理程序本身在从PayPal接收IPN消息后没有返回正确的HTTP 200响应。顺序如下:

  • 贝宝发送IPN消息
  • IPN处理程序接收IPN消息并返回HTTP 200(响应中没有数据)
  • 您的IPN处理程序向PayPal发送POST消息以进行验证

  • 看来#2是它失败的地方。我建议检查您的IPN脚本,确保它在收到IPN消息后(甚至在发送IPN进行验证之前)立即返回成功响应。

    完美-非常感谢。奇怪的是,使用旧的模拟器总是使用相同的代码生成绿色记号和“成功发送IPN”。无论如何,我在返回IPN之前插入了以下代码:Response.Clear();Response.StatusCode=200;回答。写(“”);Response.End();这似乎奏效了。我想我毕竟没有正确阅读手册。@Praveen-你能引用到指定此流程的文档的链接吗?在我看来,这是一个糟糕的API设计-你如何保证HTTP 200响应在IPN处理程序发布之前到达PayPal?文档在这里:嗯,我不确定我完全理解你对糟糕的API设计的评论,但每个HTTP请求都必须有一个响应-正确吗?因此,当您从PayPal以HTTP请求的形式收到IPN消息时,您必须使用响应代码200进行响应,并说“是的,我收到了”。如果没有发生这种情况,PayPal认为您的服务器从未收到IPN消息,它将尝试再次发送该消息。此外,在步骤3中进行验证调用之前,也不要求必须返回响应代码200(在上面的步骤2中)。但是,如果第3步花费的时间太长,第2步中的请求可能会超时,使PayPal认为IPN消息从未发送到您的服务器。因此,建议您在收到200响应代码后立即返回该代码,然后执行验证步骤。您可以作为一个单独的异步线程来验证IPN消息。HTH.“Response.Write(“”);”这一部分很重要。如果仅设置200代码且无内容,模拟器将返回“未找到内容类型”错误。有关详细信息,请参见我的帖子: