WhatsappElixir
View SourceWhatsappElixir is an Elixir library for interacting with the WhatsApp API. It allows you to handle incoming messages and send responses efficiently using a clean and simple API.
Installation
To use WhatsappElixir in your project, add it to your mix.exs dependencies:
def deps do
[
{:whatsapp_elixir, "0.1.10"}
]
end## Configuration
Configure your WhatsApp credentials in config/config.exs:
config :whatsapp_elixir,WhatsappElixir.HTTP,
token: System.get_env("WHATSAPP_TOKEN"),
phone_number_id: System.get_env("WHATSAPP_PHONE_NUMBER_ID"),
verify_token: System.get_env("VERIFY_TOKEN")"""
Config can be left blank if you wish to pass the config at the app.
## Usage sending whatsapp message example this only works with users with existing sessions to send message first time use templated message on user reply session will be created.
### messages & templated message
defmodule MyModule do
alias WhatsappElixir.Messages
def send_message(mobile_number) do
Messages.send_message(mobile_number, "Hello World")
end
def send_templated(mobile_number) do
Messages.send_template("hello_world", mobile_number, [] )
end
endSends an image message to a WhatsApp user.
Args
- image: Image id or link of the image
- recipient_id: Phone number of the user with country code without +
- recipient_type: Type of the recipient, either individual or group (default is "individual")
- caption: Caption of the image (default is "")
- link: Whether to send an image id or an image link, True means that the image is a link, False means that the image is an id (default is true)
iex> WhatsappElixir.send_image("https://i.imgur.com/Fh7XVYY.jpeg", "5511999999999")
Send Template Message
defmodule MyModule do
alias WhatsappElixir.Messages
def send_templated(mobile_number) do
Messages.send_template("hello_world", mobile_number, [])
end
endHandling inbound webhooks (phone numbers, BSUIDs and usernames)
Users who adopt a WhatsApp username may arrive without a phone number. In that case
contacts[0].wa_id and messages[0].from are missing, and the user is identified by a
business-scoped user ID (BSUID) such as "KE.984051547420197". Use get_sender/1:
alias WhatsappElixir.{Messages, Static}
def handle_webhook(params) do
%{wa_id: wa_id, user_id: user_id, username: username, name: name} = Static.get_sender(params)
# Every field can be nil. Store user_id as the stable key for username users.
recipient = wa_id || user_id
Messages.send_message(recipient, "Hi #{name || username}!")
endEvery send function takes either a phone number (sent as "to") or a BSUID (sent as
"recipient"); see WhatsappElixir.Recipient. For status webhooks, use
Static.get_status_recipient/1, which returns %{recipient_id: ..., recipient_user_id: ...}.
Send a WhatsApp Flow
Send a Flow as an interactive message inside the 24-hour customer service window:
flow = %{
flow_id: "1234567890",
flow_token: "booking-42", # returned to you in the user's reply
flow_cta: "Book now", # max 20 characters
header: "Appointments", # optional
body: "Pick a time that suits you.",
footer: "Takes 1 minute", # optional
screen: "BOOKING", # optional first screen
data: %{"branch" => "nairobi"} # optional, sent with the screen
# mode: "draft" # to test an unpublished flow
}
{:ok, response} = WhatsappElixir.Flows.send_flow("254700000000", flow)When the user submits the Flow, parse the reply webhook:
case WhatsappElixir.Static.get_flow_response(params) do
{:ok, flow_token, answers} -> handle_answers(flow_token, answers)
:error -> :not_a_flow_reply
end