Cliente en Elixir para la API de Whatsapp Empresarial

En Resuelve llevamos usando Whatsapp empresarial desde sus primeras versiones. Decidimos desarrollar un cliente para poder comunicarnos con esta API y hacerla pública el día 24 de Enero del 2020, este cliente lo usamos actualmente para entregar en promedio más de ~20,000 mensajes y recibir ~15,000 mensajes, esto por día en 4 países.

Después de registrar el número en Facebook Business y levantar los contenedores requeridos en la documentación https://developers.facebook.com/docs/whatsapp, podrás usar el cliente desde algún proyecto de phoenix o simplemente desde la consola de Elixir.

El cliente cuenta con un GenServer (proceso) que se ejecuta cada 24 hrs para actualizar el header de autenticación.

defmodule MyApp.Application do
  use Application

  alias Whatsapp.Models.WhatsappProvider

  def start(_type, _args) do
    import Supervisor.Spec

    children = [
      worker(Whatsapp.Auth.Server, [[
        %WhatsappProvider{
          name: "resuelve-mx",
          url: "https://my-wa-instance.io:9090/v1",
          username: "username",
          password: "password"
        }
      ]])
    ]

    opts = [strategy: :one_for_one, name: MyApp.Supervisor]
    Supervisor.start_link(children, opts)
  end
end


Después de definir uno ó más whatsapp´s se podrá comunicar con la api

iex> %{"contacts" => [%{"wa_id" => wa_id}] = WhatsappApi.check("5566295500", "My company")
iex> message = Whatsapp.Models.MessageOutbound.new(to: wa_id, body: "Hi!")
iex> WhatsappApi.send(message, "My company")


El uso de este GenServer es opcional, ya que se puede obtener el token y enviarlo en cada request independientemente, realizando el login primero.

iex> %{"users" => [%{"token" => token}]} = Whatsapp.Api.Users.login({"https://my-wa-instance.io:9090/v1", {"Authorization", "Basic #{base64UsernamePassword}"}})
iex> message = Whatsapp.Models.MessageOutbound.new(to: "wa_id", body: "Hi!")
iex> auth_header = [{"Authorization", "Bearer #{token}"}]
iex> Whatsapp.Api.Messages.send({"https://my-wa-instance.io:9090/v1", auth_header}, message)

Cualquier aportación es bienvenida con su respectivo Pull Request.
https://github.com/resuelve/wax

Facebook
Twitter
YouTube