接收消息

目前的第三方应用接收Link消息,即事件推送,仅Java版的SDK支持

接入事件推送,开发者需要按照如下步骤完成:

  1. 第一步,配置web.xml;
  2. 第二步,创建事件处理类;
  3. 第三步,配置开发者选项;
  4. 第四步,配置服务号菜单事件;

配置web.xml

配置servlet的参数,token、appId、secret可从服务号开发者选项获取,embUrl就需要向Link环境部署人员咨询。

<servlet>
    <servlet-name>link</servlet-name>
    <servlet-class>link.message.server.test.LinkServlet</servlet-class>
    <init-param>
        <param-name>token</param-name>
        <param-value>122c0b1f6112490299fb03766cc04ea5</param-value>
    </init-param>
    <init-param>
        <param-name>embUrl</param-name>
        <param-value>http://10.201.76.93:10082/svrnum/</param-value>
    </init-param>
    <init-param>
        <param-name>appId</param-name>
        <param-value>3ecc8782-d1bd-45dc-88a5-b65d83dc5c30</param-value>
    </init-param>
    <init-param>
        <param-name>secret</param-name>
        <param-value>1e5bc77ad12f496b8f9d038291de3680</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>link</servlet-name>
    <url-pattern>/link/*</url-pattern>
</servlet-mapping>

创建事件处理类

创建事件处理的servlet继承EventHandlerServlet,并覆盖getReplyContent方法。

package link.message.server.test;
import link.message.client.content.MessageContent;
import link.message.client.content.TextMessageContent;
import link.message.client.content.complex.Action;
import link.message.client.content.complex.ComplexMessageContent;
import link.message.client.content.complex.ComplexMessageContentItem;
import link.message.client.content.complex.ComplexMessageType;
import link.message.client.content.complex.NativeCommandAndParamsBuilder;
import link.message.client.event.EventHandlerServlet;
import com.alibaba.fastjson.JSONObject;

/**
 * <code>{@link LinkServlet}</code>
 *
 * @author zhongt
 */
@SuppressWarnings("serial")
public class LinkServlet extends EventHandlerServlet {

@Override
protected MessageContent getReplyContent(String loginId, String loginName,
    String key, String value, String params, JSONObject userInputParams) 
    return new TextMessageContent(loginName + " : " + UUID.randomUUID().toString());
}

}

getReplyContent参数详解:

参数 类型 描述
loginId String 登录Id
loginName String 用户名
key String 该参数用来区分事件是由自动应答触发还是点击菜单触发。
自动应答返回值 : ivr_input
菜单触发返回值 : click_menu
value String 输入的值。
当是自动应答时,这个是用户输入的值。
当是点击菜单时,这个是菜单的编码code。
params String 上一次设置的上下文信息。
userInputParams JSONObject 整一条完整的消息的信息

配置开发者选项

填写开发者选项的服务URL地址,并点击校验,当Link平台与第三方互通的时候,返回成功信息。当显示链接超时错误时,请检查服务URL地址。

配置服务号菜单事件

服务号的事件处理只有服务号菜单需要配置,自动回复不需要。
事件处理的两种情况:

  1. 当用户的输入的内容不在Link自动回复配置时,Link会将用户输入推送到第三方事件处理。
  2. 在服务号菜单配置响应动作是事件时,,Link会将用户输入推送到第三方事件处理。

示例

下面示例实现了有上下文的事件处理。

EventContextParams ,该类定义了上下文消息的内容。

package link.message.server.test;

import java.util.ArrayList;
import java.util.List;

/**
 * 上下文消息
 * @author lufeng
 */
public class EventContextParams {

    private String title;
    private List<ChildParams>  childs = new ArrayList<ChildParams>();

    public EventContextParams(String title) {
        this.title = title;
    }    

    public void addChildParams(String showKey, String content, String context) {
        childs.add(new ChildParams(showKey, content, context));
    }    

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public List<ChildParams> getChilds() {
        return childs;
    }

    public void setChilds(List<ChildParams> childs) {
        this.childs = childs;
    }


    class ChildParams {

        private String showKey; //显示的序号
        private String content; //内容
        private String context; //上下文

        public ChildParams(String showKey, String content, String context) {

            this.showKey = showKey;
            this.content = content;
            this.context = context;
        }

        public String getShowKey() {
            return showKey;
        }

        public void setShowKey(String showKey) {
            this.showKey = showKey;
        }

        public String getContent() {
            return content;
        }

        public void setContent(String content) {
            this.content = content;
        }

        public String getContext() {
            return context;
        }

        public void setContext(String context) {
            this.context = context;
        }
    }
}

EventContext ,该类定义了上下文消息的处理。

package link.message.server.test;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import link.message.client.content.complex.Action;
import link.message.client.content.complex.ComplexMessageContent;
import link.message.client.content.complex.ComplexMessageContentItem;
import link.message.client.content.complex.ComplexMessageType;
import link.message.client.content.complex.NativeCommandAndParamsBuilder;
import link.message.server.test.EventContextParams.ChildParams;


/**
 * 事件处理上下文
 * @author lufeng
 */
public class EventContext {

    public static Map<String, EventContextParams>  context =  new HashMap<String, EventContextParams>();

    //做有上下文的事件应答的demo数据,模拟两条有上下文事件消息 (正常来讲,是否拥有上下文,是由业务系统自行判断)
    static {

        EventContextParams ecx = new EventContextParams("我是x");
        ecx.addChildParams("1", "我是x1", "x1"); //显示序号 、 内容 、 上下文key
        ecx.addChildParams("2", "我是x2", "x2");
        ecx.addChildParams("3", "我是x3", "x3");
        context.put("x",ecx); //child , parent

        EventContextParams ecx1 = new EventContextParams("我是x1");
        ecx1.addChildParams("a", "我是x11", "x11"); 
        ecx1.addChildParams("b", "我是x12", "x12");
        context.put("x1",ecx1);

        EventContextParams ecx2 = new EventContextParams("我是x2");
        ecx2.addChildParams("1", "我是x21", "x21"); 
        context.put("x2",ecx2);

        EventContextParams ecx3 = new EventContextParams("我是x3");
        ecx3.addChildParams("one", "我是x31", "x31"); 
        ecx3.addChildParams("two", "我是x32", "x32");
        ecx3.addChildParams("thr", "我是x33", "x33");
        context.put("x3", ecx3);


        EventContextParams ecy = new EventContextParams("我是y");
        ecy.addChildParams("1", "我是y1", "y1");
        ecy.addChildParams("2", "我是y2", "y2");
        context.put("y",ecy); //child , parent

        EventContextParams ecy1 = new EventContextParams("我是y1");
        ecy1.addChildParams("1", "我是y11", "y11"); 
        context.put("y1",ecy1);

        EventContextParams ecy2 = new EventContextParams("我是y2");
        ecy2.addChildParams("1", "我是y21", "y21"); 
        ecy2.addChildParams("2", "我是y22", "y22"); 
        context.put("y2",ecy2);

    }


    public static ComplexMessageContent getEventContent(String nextParams){
        EventContextParams ec = context.get(nextParams);

        ComplexMessageContent content = null;
        if(null != ec) {
            content = new ComplexMessageContent(ec.getTitle(), ComplexMessageType.AUTO_REPLY);
            List<ChildParams> childList =  ec.getChilds();
            for(ChildParams child : childList){
                ComplexMessageContentItem item = new ComplexMessageContentItem(child.getContent(), 
                        Action.instanceAsOpenNative(NativeCommandAndParamsBuilder.buildAsRequestAnswer(
                                child.getShowKey(), child.getContext())));
                content.addMessageContentItem(item);
            }            
        }
        return content;
    } 

    /**
     * 是否是上下文事件消息
     * @param nextParams
     * @return
     */
    public static boolean isContextEventMessage(String nextParams){

        if(context.containsKey(nextParams)){
            return true;
        }
        return false;
    }

}

EventContext ,该类做事件处理。

package link.message.server.test;

import link.message.client.content.MessageContent;
import link.message.client.content.NewRichMessageContent;
import link.message.client.content.complex.Action;
import link.message.client.content.complex.ComplexMessageContent;
import link.message.client.content.complex.ComplexMessageContentItem;
import link.message.client.content.complex.ComplexMessageType;
import link.message.client.event.EventHandlerServlet;

import com.alibaba.fastjson.JSONObject;


/**
 * @author zhongt
 */
@SuppressWarnings("serial")
public class LinkServlet extends EventHandlerServlet {


    @Override
    protected MessageContent getReplyContent(String loginId, String loginName,
            String key, String value, String params, JSONObject userInputParams) {

        String nextParams = params == null ? value : params; 

        //具有上下文事件应答
        if(EventContext.isContextEventMessage(nextParams)){
            return EventContext.getEventContent(nextParams);
        }  else {
            //无上下文事件应答
            ComplexMessageContent content = new ComplexMessageContent("事件处理消息概要", ComplexMessageType.NEW_RICH_TEXT);
            NewRichMessageContent newRichMessageContent = new NewRichMessageContent("事件处理消息", "这里是你输入的内容:" + nextParams);
            ComplexMessageContentItem contentItem = new ComplexMessageContentItem(newRichMessageContent,
                    Action.instanceAsOpenHtml("<b>你好,这里是事件处理消息的详细内容!!</b>"));
            content.addMessageContentItem(contentItem);

            return content;
        }
    }

}
上一篇:发送消息 下一篇:消息格式