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 值 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
使用 Spring 控制器处理 Paypal IPN 请求?