【发布时间】:2020-08-07 12:09:09
【问题描述】:
我正在努力验证 Paypal webhook 数据,但我遇到了一个问题,它总是返回 FAILURE 作为验证状态。我想知道这是否是因为这一切都发生在沙盒环境中,而 Paypal 不允许验证沙盒 webhook 事件?我按照这个 API 文档来实现调用:https://developer.paypal.com/docs/api/webhooks/v1/#verify-webhook-signature
相关代码(来自单独的 elixir 模块):
def call(conn, _opts) do
conn
|> extract_webhook_signature(conn.params)
|> webhook_signature_valid?()
|> # handle the result
end
defp extract_webhook_signature(conn, params) do
%{
auth_algo: get_req_header(conn, "paypal-auth-algo") |> Enum.at(0, ""),
cert_url: get_req_header(conn, "paypal-cert-url") |> Enum.at(0, ""),
transmission_id: get_req_header(conn, "paypal-transmission-id") |> Enum.at(0, ""),
transmission_sig: get_req_header(conn, "paypal-transmission-sig") |> Enum.at(0, ""),
transmission_time: get_req_header(conn, "paypal-transmission-time") |> Enum.at(0, ""),
webhook_id: get_webhook_id(),
webhook_event: params
}
end
def webhook_signature_valid?(signature) do
body = Jason.encode!(signature)
case Request.post("/v1/notifications/verify-webhook-signature", body) do
{:ok, %{verification_status: "SUCCESS"}} -> true
_ -> false
end
end
我从 Paypal 收到 200,这意味着 Paypal 收到了我的请求,并且能够正确解析并通过验证运行它,但它始终返回验证状态的 FAILURE,这意味着请求的真实性无法验证。我查看了我发布到他们端点的数据,一切看起来都是正确的,但由于某种原因它没有得到验证。我将我发布到 API(来自extract_webhook_signature)的 JSON 放到了 Pastebin 中,因为它非常大:https://pastebin.com/SYBT7muv
如果有人有这方面的经验并且知道它为什么会失败,我很想听听。
【问题讨论】:
-
既然您收到 200 响应,那么您的管道正在工作,您可能缺少 Paypal 特定有效负载的某些内容。您正在将 ref'd JSON 有效负载发布到 PayPal 的
/v1/notifications/verify-webhook-signatureURL - 但我看不到您在哪里设置他们的文档中提到的自定义标头:``` curl -v -X POST api.sandbox.paypal.com/v1/notifications/… \ -H “ Content-Type: application/json" \ -H "Authorization: Bearer Access-Token" \ ``` 如果你包含我认为的代码会很有帮助。 -
我没有在我的帖子中包含这些内容,因为它们包含我的身份验证数据。不过,我将它们发布到 Paypal。它们会自动添加到我的
Request.post()函数中,我在其他地方使用该函数,所以我知道它可以正常工作。我尝试在我的 POST json 中删除一个字段,Paypal 返回一个 400,所以我认为我拥有所有字段(否则我不会看到 200) -
清除您的身份验证数据——我要求查看该代码,因为自定义标头被破坏是很常见的,尤其是承载令牌的计算。如果不出意外,拥有示例代码(带有 X 的)对其他人来说将是一个有用的参考。如果您收到 200 条回复,并且您觉得您的请求格式正确,我会通过调用
IO.inspect来地毯式轰炸您的代码,看看您是否发现任何意外... -
这里是请求头:[{"Authorization", "Basic XXXXXX"}, {"Content-Type", "application/json"}]
-
将实际代码添加到您的原始帖子中会更有帮助。但仅从developer.paypal.com/docs/api/webhooks/v1/… 的 PayPal 示例来看,他们在 curl 示例中使用不记名令牌作为其授权标头,而不是基本授权。你确定这不会导致问题吗?
标签: paypal elixir phoenix-framework webhooks paypal-webhooks