Packages
shopifex
2.1.3
2.4.0
2.3.0
2.2.2
2.2.1
2.2.0
2.1.20
2.1.19
2.1.18
2.1.17
2.1.16
2.1.15
2.1.14
2.1.13
2.1.12
2.1.11
2.1.10
2.1.9
2.1.8
2.1.7
2.1.6
2.1.5
2.1.4
2.1.3
2.1.2
2.1.1
2.1.0
2.0.1
2.0.0
1.1.1
1.1.0
1.0.1
1.0.0
0.6.2
0.6.1
0.6.0
0.5.7
0.5.6
0.5.5
0.5.4
0.5.3
0.5.2
0.5.1
0.5.0
0.4.1
0.4.0
0.3.6
0.3.5
0.3.4
0.3.3
0.3.2
0.3.1
0.3.0
0.2.1
0.2.0
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
Phoenix boilerplate for Shopify Embedded App SDK
Current section
Files
Jump to
Current section
Files
lib/shopifex/plug/shopify_webhook.ex
defmodule Shopifex.Plug.ShopifyWebhook do
@moduledoc """
Ensures that the connection has a valid Shopify webhook HMAC token and
builds Shopifex session.
"""
import Plug.Conn
require Logger
def init(options) do
# initialize options
options
end
def call(conn, _) do
expected_hmac = Shopifex.Plug.build_hmac(conn)
received_hmac = Shopifex.Plug.get_hmac(conn)
if expected_hmac == received_hmac do
shop =
conn
|> get_shop_domain()
|> Shopifex.Shops.get_shop_by_url()
if shop do
host = Map.get(conn.params, "host")
locale = Map.get(conn.params, "locale")
Shopifex.Plug.build_session(conn, shop, host, locale)
else
conn
|> send_resp(404, "no store found with url")
|> halt()
end
else
Logger.info("HMAC doesn't match " <> expected_hmac)
conn
|> send_resp(401, "invalid hmac signature")
|> halt()
end
end
defp get_shop_domain(%Plug.Conn{params: %{"myshopify_domain" => shop_url}}), do: shop_url
defp get_shop_domain(%Plug.Conn{params: %{"shop" => shop_url}}), do: shop_url
defp get_shop_domain(%Plug.Conn{} = conn) do
with [shop_url] <- Plug.Conn.get_req_header(conn, "x-shopify-shop-domain") do
shop_url
else
_ -> nil
end
end
end