贝宝 IPN 处理

Posted

技术标签:

【中文标题】贝宝 IPN 处理【英文标题】:PayPal IPN Processing 【发布时间】:2017-04-13 11:18:18 【问题描述】:

我已经在 VBScript/Classic ASP 中实现了一个 IPN 侦听器。 从我的角度来看,它似乎工作得很好。 当它被调用时,它将附加cmd=_notify-validate 的消息发送回Paypal。然后它检查objHttp.status = 200objHttp.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 处理的主要内容,如果未能解决你的问题,请参考以下文章

贝宝 IPN 验证

需要帮助使用贝宝 ipn,标记

贝宝 ipn 不再工作

Paypal IPN 处理来自购物车上传的篡改订单

Paypal IPN 处理来自购物车上传的篡改订单

贝宝沙盒 IPN 总是失败