无法成功执行Paypal Webhook验证

问题描述 投票:1回答:1

我正在尝试验证Paypal Webhook数据,但遇到一个问题,该问题总是返回验证状态失败。我想知道是否是因为这都是在沙盒环境中发生的,并且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的JSON(从extract_webhook_signature)放入Pastebin,原因是它很大:https://pastebin.com/SYBT7muv

[如果有人对此有经验,并且知道为什么会失败,我很想听听。

paypal elixir phoenix-framework webhooks paypal-webhooks
1个回答
0
投票

我解决了自己的问题。 Paypal不会规范化其Webhook验证请求。当您从Paypal收到POST时,请不要解析请求正文,然后再在验证呼叫中将其发送回给他们。如果您的webhook_event不同(即使字段的顺序不同),则该事件将被视为无效,并且您将收到失败消息。您必须阅读原始POST正文,然后将[[exact数据发回webhook_event中的Paypal。

示例:如果收到{"a":1,"b":2}并发回{..., "webhook_event":{"b":2,"a":1}, ...}(请注意json字段与我们收到的内容和我们发回的内容的顺序不同),则您将收到失败消息。您的帖子必须为{..., "webhook_event":{"a":1,"b":2}, ...}
© www.soinside.com 2019 - 2024. All rights reserved.