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