贝宝 IPN 处理
Posted
技术标签:
【中文标题】贝宝 IPN 处理【英文标题】:PayPal IPN Processing 【发布时间】:2017-04-13 11:18:18 【问题描述】:我已经在 VBScript/Classic ASP 中实现了一个 IPN 侦听器。
从我的角度来看,它似乎工作得很好。
当它被调用时,它将附加cmd=_notify-validate
的消息发送回Paypal。然后它检查objHttp.status = 200
和objHttp.responseText = "VERIFIED"
的响应,然后将订单添加到我的数据库中。
但是 Paypal 正在向我发送电子邮件;
主题:PayPal 即时付款通知警告
发送到以下 URL 的即时付款通知失败:
【问题讨论】:
PayPal 是否希望您的页面有特定的响应,也许您没有发回作为响应已处理的确认? @Lankymart 经过进一步调查,似乎某些 Paypal 文档所说的需要完成的工作之间存在差异(在收到来自 PayPal 的 IPN 消息后,您的侦听器返回一个空的 HTTP 200 响应PayPal。否则,PayPal 将重新发送 IPN 消息。)和 Paypal 提供的代码示例,其中不执行此步骤。这一步是必需的吗?如果是这样,谁能给我一个 VBScript/Classic ASP 中的代码示例来展示如何做到这一点? 这是您使用的代码示例吗? - paypal/ipn-code-samples 从 documentation 看来您确实缺少第 2 步 - “在收到来自 PayPal 的 IPN 消息后,您的侦听器会向 PayPal 返回一个空的 HTTP 200 响应。否则,PayPal 会重新发送IPN 消息。”. @Lankymart 是的,这正是我使用的代码示例。 【参考方案1】:根据IPN Testing
每个侦听器都必须包含处理“错误通知”IPN 消息的代码。
无论哪种方式,您都应该按照IPN troubleshooting tips中的步骤一步一步地操作。
这里有一些我挑选出来的应该有帮助的。
检查您的 IPN 历史记录中列出的 URL,以确保 PayPal 将每个 IPN 发布给您的听众。 检查您的 Web 服务器的访问和错误日志。 检查您的编程语言的错误日志。 验证您的 IPN 侦听器是否响应所有消息,即使是您不打算处理的消息。进一步OPs comments
Paypal 提供的代码示例,其中未执行此步骤。这一步是必需的吗?
听起来您缺少文档中工作流程中的第 2 步
2.在收到来自 PayPal 的 IPN 消息后,您的侦听器会向 PayPal 返回一个空的 HTTP 200 响应。否则,PayPal 将重新发送 IPN 消息。
从 php 示例来看,两者似乎都先发送验证,这与文档建议的工作流程不符。
在这种情况下你应该能够做到
Response.Status = "200 OK"
在其余代码之后,确保没有使用Response.Write()
写回其他内容,因此服务器响应为空白,您甚至可以使用
Call Response.Clear()
在设置Response.Status
之前确保没有从Response
缓冲区写入其他内容。这只有在 Response.Buffer
事先设置为 True
时才有效(通常在脚本的开头)。
【讨论】:
我尝试添加Response.Status = "200 OK"
,但还是不行(就PayPal而言)
如何仅使用 objHttp.Send 发送 200 的状态,以便我可以根据文档提前发送响应?
问题是@AntonyMeadley,发送“响应”与发送“请求”不同,当您使用objHttp.Send
时,它会向 PayPal 发出新的“请求”,而 PayPal 将发送“回复”。您在 PayPal 的 IPN 历史记录中看到了什么,听众是否在此处返回 200 OK
?
老实说,您不需要指定Response.Status
,因为一旦脚本完成,它应该默认为200 OK
,只要没有出现500 Internal Server
错误,这就是为什么我会首先检查 IPN 历史以确保 PayPal 收到预期的响应代码。
查看 IPN 历史记录,HTTP 响应代码似乎是 500,即使我已使用您上面的代码将状态设置为“200 OK”以上是关于贝宝 IPN 处理的主要内容,如果未能解决你的问题,请参考以下文章