Current section
Files
Jump to
Current section
Files
lib/wechat/token_serv.ex
defmodule ExWechat.TokenServ do
@moduledoc """
Token Service
"""
use GenServer
import ExWechat.Util
@interval 600
def start_link(opts \\ []) do
GenServer.start_link(__MODULE__, :ok, opts)
end
@doc """
The Lastest Token
"""
def token, do: GenServer.call(__MODULE__, :token)
# ------------------------------------------------------------
# Callback
# ------------------------------------------------------------
def init(:ok) do
{:ok, %{id: ExWechat.app_id(), secret: ExWechat.app_secret(), updated: nil, token: nil}, 0}
end
def handle_info(:timeout, state) do
{:noreply, %{state | updated: now, token: access_token(state.id, state.secret)}, @interval * 1000}
end
def handle_call(:token, _from, state) do
timeout = round(@interval - (now - state.updated)) * 1000
{:reply, state.token, state, timeout}
end
# ------------------------------------------------------------
# Private
# ------------------------------------------------------------
defp access_token(appId, appSecret) do
{:ok, resp} = HTTPoison.get(
~s"https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=#{appId}&secret=#{appSecret}",
%{},
["content-type": "application/json"]
)
{:ok, json} = Poison.decode(resp.body)
json |> Map.get("access_token")
end
end