Невозможно выполнить успешную проверку Paypal через веб-крючок - PullRequest
1 голос
/ 24 апреля 2020

Я работаю над проверкой данных веб-крючка Paypal, но столкнулся с проблемой, при которой всегда возвращается НЕИСПРАВНОСТЬ для статуса проверки. Мне интересно, потому что все это происходит в среде с песочницей, а Paypal не позволяет проверять события веб-крюков с песочницей? Я следовал этому API до c для реализации вызова: https://developer.paypal.com/docs/api/webhooks/v1/#verify -webhook-signature

Соответствующий код (из отдельных модулей эликсира):

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

Я получаю 200 от Paypal, что означает, что Paypal получил мой запрос и смог правильно его проанализировать и запустить, несмотря на проверку, но он всегда возвращает FAILURE для статуса проверки, что означает, что подлинность запроса не может быть проверенным. Я посмотрел на данные, которые я отправлял в их конечную точку, и все выглядит правильно, но по какой-то причине они не проверяются. Я поместил JSON, который я отправил в API (из extract_webhook_signature) в Pastebin, потому что он довольно большой: https://pastebin.com/SYBT7muv

Если кто-то имеет опыт работы с этим и знает почему это может потерпеть неудачу, я хотел бы услышать.

1 Ответ

1 голос
/ 25 апреля 2020

Я решил свою проблему. Paypal не канонизирует свои запросы проверки веб-крюка. Когда вы получаете POST от Paypal, НЕ анализируйте тело запроса перед тем, как вы go отправите его обратно в проверочном вызове. Если ваш webhook_event отличается (даже если поля расположены в другом порядке), событие будет считаться недействительным, и вы получите ОТКАЗ. Вы должны прочитать необработанное тело POST и отправить эти точные данные обратно в Paypal в своем webhook_event.

Пример: если вы получаете {"a":1,"b":2} и отправляете обратно {..., "webhook_event":{"b":2,"a":1}, ...} (уведомление разница в порядке полей json от того, что мы получили и что мы отправили обратно), вы получите отказ. Ваше сообщение должно быть {..., "webhook_event":{"a":1,"b":2}, ...}

...