Rapyd.Services.Webhook (rapyd v1.0.0)

Copy Markdown View Source

Rapyd Webhooks — verify inbound events and route to handlers.

Verification

Every inbound webhook from Rapyd is signed with HMAC-SHA256. Always call parse_and_verify/2 before trusting any event data:

def handle_webhook(conn, client) do
  raw_body = conn.assigns[:raw_body]   # must be the raw, unparsed body
  headers = %{
    salt:      get_req_header(conn, "salt")      |> List.first(),
    timestamp: get_req_header(conn, "timestamp") |> List.first(),
    signature: get_req_header(conn, "signature") |> List.first()
  }

  case Rapyd.Services.Webhook.parse_and_verify(client, raw_body, headers) do
    {:ok, event} ->
      dispatch(event)
      send_resp(conn, 200, "ok")

    {:error, %Rapyd.Error{type: :webhook_signature}} ->
      send_resp(conn, 401, "invalid signature")
  end
end

Routing

Use Rapyd.Types.WebhookEvent.dispatch/2 to branch by event type, or pattern-match on event.type directly.

Summary

Functions

Register a Rapyd webhook endpoint via the API.

Delete a registered webhook endpoint.

Retrieve a registered webhook endpoint.

List registered webhook endpoints.

Parse and cryptographically verify an inbound Rapyd webhook event.

Update a registered webhook endpoint.

Functions

create_webhook(client, params)

@spec create_webhook(Rapyd.Client.t(), map()) ::
  {:ok, map()} | {:error, Rapyd.Error.t()}

Register a Rapyd webhook endpoint via the API.

delete_webhook(client, webhook_id)

@spec delete_webhook(Rapyd.Client.t(), String.t()) ::
  {:ok, map()} | {:error, Rapyd.Error.t()}

Delete a registered webhook endpoint.

get_webhook(client, webhook_id)

@spec get_webhook(Rapyd.Client.t(), String.t()) ::
  {:ok, map()} | {:error, Rapyd.Error.t()}

Retrieve a registered webhook endpoint.

list_webhooks(client)

@spec list_webhooks(Rapyd.Client.t()) :: {:ok, list()} | {:error, Rapyd.Error.t()}

List registered webhook endpoints.

parse_and_verify(client, raw_body, map)

@spec parse_and_verify(Rapyd.Client.t(), iodata(), map()) ::
  {:ok, Rapyd.Types.WebhookEvent.t()} | {:error, Rapyd.Error.t()}

Parse and cryptographically verify an inbound Rapyd webhook event.

raw_body must be the exact wire bytes sent by Rapyd — do not pre-decode. headers is a map with keys :salt, :timestamp, and :signature.

Returns {:ok, %Rapyd.Types.WebhookEvent{}} or {:error, %Rapyd.Error{type: :webhook_signature}}.

update_webhook(client, webhook_id, params)

@spec update_webhook(Rapyd.Client.t(), String.t(), map()) ::
  {:ok, map()} | {:error, Rapyd.Error.t()}

Update a registered webhook endpoint.