Current section
Files
Jump to
Current section
Files
lib/wechat/tools/responder.ex
defmodule Wechat.Responder do
@moduledoc """
`Wechat.Responder` is to make respond to wechat server.
It can be used with server verify and other things.
This module will automaticlly generate needed
methods for your Phoenix controller.
For simple use:
defmodule Demo.WechatController do
# interact with user, return message to user
use Wechat.Responder
# function that parse and render wechat message
import Wechat.Message
end
More complex example(when receives text message from user,
it will return a text message with reverse text):
defmodule Wechat.CustomerWechatController do
use Wechat.Web, :controller
use Wechat.Responder
import Wechat.Message
defp on_text_responder(conn) do
message = conn.assigns[:message]
case message do
%{content: "我要图"} ->
reply_with(conn, generate_passive(message, msgtype: "news",
articles: [
%{ title: "sjsjssjsj", description: "xxxxlaldsaldskl",
picurl: "picurl", url: "http://baidu.com" },
%{ title: "sjsjssjsj", description: "xxxxlaldsaldskl",
picurl: "picurl", url: "http://baidu.com" }
]))
%{content: content} ->
reply_with(conn, generate_passive(message, msgtype: "text",
content: String.reverse(content)))
_ ->
conn
end
end
end
There are several methods you can override:
def on_text_responder(conn), do: conn
def on_image_responder(conn), do: conn
def on_voice_responder(conn), do: conn
def on_video_responder(conn), do: conn
def on_shortvideo_responder(conn), do: conn
def on_location_responder(conn), do: conn
def on_link_responder(conn), do: conn
def on_event_responder(conn), do: conn
these methods must return a `Plug.Conn`,
just choose what you need.
"""
defmacro __using__(_opts) do
quote do
unless Code.ensure_loaded?(Plug.Conn) do
import Plug.Conn
end
unless Code.ensure_loaded?(Phoenix.Controller) do
import Phoenix.Controller
end
def on_text_responder(conn), do: conn
def on_image_responder(conn), do: conn
def on_voice_responder(conn), do: conn
def on_video_responder(conn), do: conn
def on_shortvideo_responder(conn), do: conn
def on_location_responder(conn), do: conn
def on_link_responder(conn), do: conn
def on_event_responder(conn), do: conn
def message_responder(conn) do
message = conn.assigns[:message]
reply_conn = case message do
%{msgtype: "text"} ->
on_text_responder(conn)
%{msgtype: "voice"} ->
on_voice_responder(conn)
%{msgtype: "video"} ->
on_video_responder(conn)
%{msgtype: "image"} ->
on_image_responder(conn)
%{msgtype: "location"} ->
on_location_responder(conn)
%{msgtype: "shortvideo"} ->
on_shortvideo_responder(conn)
%{msgtype: "link"} ->
on_link_responder(conn)
%{msgtype: "event"} ->
on_event_responder(conn)
_ ->
conn
end
case reply_conn do
%Plug.Conn{} ->
case reply_conn.assigns[:signature] do
true ->
if reply_conn.assigns[:reply] do
text reply_conn, conn.assigns[:reply]
else
text reply_conn, "success"
end
false ->
text reply_conn, "forbidden"
end
_ ->
text conn, "success"
end
end
def reply_with(conn, message) do
assign conn, :reply, message
end
def signature_responder(conn) do
case conn.assigns[:signature] do
true -> text(conn, conn.params["echostr"] )
false -> text(conn, "forbidden")
end
end
def index(conn, _), do: signature_responder(conn)
def show(conn, _), do: signature_responder(conn)
def create(conn, _), do: message_responder(conn)
defoverridable Module.definitions_in(__MODULE__)
end
end
end