PayPal 从 IPN 端点删除的 QueryString 值 [关闭]

Posted

技术标签:

【中文标题】PayPal 从 IPN 端点删除的 QueryString 值 [关闭]【英文标题】:QueryString values removed from the IPN endpoint by PayPal [closed] 【发布时间】:2017-07-28 21:59:54 【问题描述】:

我们与 PayPal 进行了简单的支付集成 5 年,直到今天一直没有问题。在 IPN URL (notify_url) 中,我们在查询字符串中传递 3 个值,例如

https://www.example.com/callback/ipn?pspId=A&secCode=MnBP%2fxOwbQhXLd%2arD5xd6g%3d%3d&isPur=false

从今天开始,PayPal 去掉最后 2 个值并仅使用第一个查询字符串值调用,例如

https://www.example.com/callback/ipn?pspId=A

我们使用secCode 值作为我们在回调中验证的签名,以防止对表单进行任何修改。为什么 PayPal 会突然开始从查询字符串中删除值?我怀疑他们应该在 POST 中,但我只是不确定为什么突然发生变化?

【问题讨论】:

我们注意到custom 值存在完全相同的问题。 custom 是我们在创建支付时设置的传递值,并在回调中读取。我们将其格式化为查询字符串 - 因此键值对由 & 号分隔。截至 3 月 7 日下旬,我们注意到只有第一个值返回。 如果有任何帮助,在发布此 PayPal 的 2 小时内开始再次调用我们的完整通知 URL(保留查询字符串值)。只是等着看这是否会成立。 好的,我们现在再次看到他们删除第一个之后的所有查询字符串值的情况。我相信他们有不同的逻辑,具体取决于接收付款请求的服务器。为了安全起见,我们现在将这些值移至 POST。 结果对我们来说也是随机的 - 我认为 PayPal 硬部分推出了一项重大更改。粗略猜测,大约 75% 的回调包含截断的 custom 值。我们现在用| 替换了& 分隔符,这解决了我们的问题。这对我们有用,因为custom 不是 URL。 我们也可以确认。今天只有大约十分之一的回调有效。那些不起作用的只有第一个参数,其余的都被丢弃了。此外,IPN 历史页面上的一些“http 响应代码”为空白。 【参考方案1】:

好的,我们现在已经意识到 一些 PayPal 的服务器在第一个&符号处终止。这解释了为什么我们得到第一个查询字符串值而不是其他值。

似乎这种行为不仅限于notify_url 值,而且正如 Mike 在 cmets 中所建议的那样,CUSTOM 字段也会发生这种情况。如果您要通过一系列带有 & 号分隔符的名称值对,您需要切换到其他分隔符或 URL 编码整个值。

我们现在正在测试,以查看对整个回调 URL 进行 URL 编码是否仍会导致进行实际回调。

编辑:

是的,对整个 notify_url 值进行编码的 URL 解决了问题并保留了查询字符串。

编辑 2:

似乎 URL 编码整个值不再有效,所以我假设 PayPal 在我们遇到这些问题之前已经恢复到原始行为。希望这将在所有入站服务器中保持一致,并且现在将保持不变。

【讨论】:

但是当我 urlencode(cancel_return) 然后 &停留在 URL 中,单击它会导致错误。我以为 Paypal 会对 cancel_return 进行 urlencode?​​span> 我没有测试 cancel_return 但是编码完整的 notify_url 并没有导致任何问题,因为 PayPal 在调用该端点之前会解码这些值。

以上是关于PayPal 从 IPN 端点删除的 QueryString 值 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

PayPal IPN 突然停止流入

使用 Spring 控制器处理 Paypal IPN 请求?

PayPal 从 IPN 到 REST API 的过渡

从 PayPal 的沙盒 IPN 获得无效响应

(Laravel)无法从PayPal IPN获得响应,但模拟的响应返回已经过验证

PayPal IPN 模拟器工作正常,但 IPN 不响应沙盒支付