[微信开发] - 消息回复及事件响应

微信平台的消息回复,的关键字(及)消息回复及关注事件消息响应,

其不同点如图:

 

[微信开发] - 消息回复及事件响应

在weixin4j作者的注释中,提到微信公众平台接受消息一共有这么8类:

 * <p>
 * Description: 接受消息分8类,普通消息(1.文本消息、2.图片消息、3.语音消息<br />
 * 、4.视频消息、5.地理位置消息、6.链接消息)<br />
 * 事件推送(1.关注/取消关注事件、2.扫描带二维码参数事件、3.上报地理位置事件、4.自定义<br />
 * 菜单事件、5.点击菜单拉取消息时事件推送、6.点击菜单跳转链接时的事件推送</p>
 *

其中普通消息分为: 1.文本 2.图片 3.语音 4.视频 5.地理位置 6.链接

这些消息处理放到了一个处理器接口 public interface INormalMessageHandler

 /**
     * 文字内容的消息处理
     *
     * @param msg 接受消息对象
     * @return 输出消息对象
     */
    public OutputMessage textTypeMsg(TextInputMessage msg);
 /**
     * 图片类型的消息处理
     *
     * @param msg 接受消息对象
     * @return 输出消息对象
     */
    public OutputMessage imageTypeMsg(ImageInputMessage msg);
/**
     * 语音类型的消息处理
     *
     * @param msg 接受消息对象
     * @return 输出消息对象
     */
    public OutputMessage voiceTypeMsg(VoiceInputMessage msg);
/**
     * 视频类型的消息处理
     *
     * @param msg 接受消息对象
     * @return 输出消息对象
     */
    public OutputMessage videoTypeMsg(VideoInputMessage msg);
/**
     * 小视频类型的消息处理
     *
     * @param msg 接受消息对象
     * @return 输出消息对象
     */
    public OutputMessage shortvideoTypeMsg(ShortVideoInputMessage msg);
/**
     * 地理位置类型的消息处理
     *
     * @param msg 接受消息对象
     * @return 输出消息对象
     */
    public OutputMessage locationTypeMsg(LocationInputMessage msg);
/**
     * 链接类型的消息处理
     *
     * @param msg 接受消息对象
     * @return 输出消息对象
     */
    public OutputMessage linkTypeMsg(LinkInputMessage msg);

 

另外有一个实现类实现了该消息处理类,可以根据需要根据不同类型的消息进行回复.

也就是像微软小冰这样的智能客服(做为微信接入时)也可能是按照这种微信端的数据进行了数据筛选分类,从而做出正确合乎逻辑的智能回复.


 

在实现类中

将传入的text类型信息做分类处理并回复 (简单版本)

@Override
    public OutputMessage textTypeMsg(TextInputMessage msg) {
        TextOutputMessage out = new TextOutputMessage();
        String inputText = msg.getContent();
        if(inputText.equals("你好")){
            out.setContent("你也好");
        }else if(inputText.equals("官方网站")){
            out.setContent("http://www.baigehuidi.com");
        }else{
            
        }
        return out;
    }

那跑起程序来是不是就按照输入内容的不同进行不同的回复.

[微信开发] - 消息回复及事件响应

当前端页面是要这样设定时,就可以这样做.

下面看看微信平台官方的"智能回复"

[微信开发] - 消息回复及事件响应

[微信开发] - 消息回复及事件响应

 现阶段可以只先回复文本内容.

整个设计从form表单提交过来之后,将"关键字"与"回复消息"存入文本消息回复数据库表.

当用户输入某个信息到微信平台后,处理器根据输入字段查询回复数据库表,进行消息的回复.

(其中也可以进行模糊查找,半匹配机制,并通过客户回复"您是不是要问.....****.....?").

DefaultNormalMessageHandler 
/*
 * 微信公众平台(JAVA) SDK
 * limitations under the License.
 */
package com.baigehuidi.demo.weixin4j.spi;


import com.baigehuidi.demo.weixin4j.model.message.OutputMessage;
import com.baigehuidi.demo.weixin4j.model.message.normal.*;
import com.baigehuidi.demo.weixin4j.model.message.output.TextOutputMessage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.ArrayList;

/**
 * <p>
 * Title: 微信公众平台接受消息处理器</p>
 *
 * <p>
 * Description: 此消息处理器只负责接收消息和返回已收到消息的功能,无特殊功能。</p>
 *
 * @author 杨启盛<qsyang @ ansitech.com>
 * @since 0.0.6
 */
@Component
public class DefaultNormalMessageHandler implements INormalMessageHandler {

    /**
     * 匹配所有类型消息 进行回复 ~
     *
     * @param msg
     * @return
     */
    private OutputMessage allType(NormalMessage msg) {
        TextOutputMessage out = new TextOutputMessage();
        out.setContent("你的消息已经收到! DefaultNormalMessageHandler");
        return out;
    }

    /**
     * 文本回复 根据前台form提交的数据->智能回复数据表->获取关键字/回复字段/
     *
     * @param msg 接受消息对象
     * @return
     */
    @Override
    public OutputMessage textTypeMsg(TextInputMessage msg) {

        //获取关键字
        String keyWord = msg.getContent();
        //从数据库搜索此关键字
        //select 回复字 from A where 关键字 = ""
        //返回(单个匹配字段数据 或 多个匹配字段(模糊查询的) list 集合 进行随机回复)
        //根据微信平台设定关键字的原样式,几个关键字同时能对应一个或几个回复
        //
//        假定messageMapper是从数据库获取回复字段
//        @Autowired
//        private MessageMapper messageMapper;
//        获取符合关键字的字段value,集合,使用random进行随机回复
//        ArrayList<String> valuesList = messageMapper.getValuesByKey(keyWord);
//        或1对1获取
//        String valueMessage = messageMapper.getValueByKey(keyWord);
//        将获取到的valueMesssage返回到前端就可以了
//        当使用多个线程处理消息时:


        /////* 之下为固定字段 *///// TODO 先做完用户信息获取 2018-12-08
        TextOutputMessage out = new TextOutputMessage();
        String inputText = msg.getContent();
        if (inputText.equals("你好")) {
            out.setContent("你也好");
        } else if (inputText.equals("官方网站")) {
            out.setContent("http://www.baigehuidi.com");
        } else {
            out.setContent("NULL");
        }
        return out;
    }

    @Override
    public OutputMessage imageTypeMsg(ImageInputMessage msg) {
        return allType(msg);
    }

    @Override
    public OutputMessage voiceTypeMsg(VoiceInputMessage msg) {
        return allType(msg);
    }

    @Override
    public OutputMessage videoTypeMsg(VideoInputMessage msg) {
        return allType(msg);
    }

    @Override
    public OutputMessage shortvideoTypeMsg(ShortVideoInputMessage msg) {
        return allType(msg);
    }

    @Override
    public OutputMessage locationTypeMsg(LocationInputMessage msg) {
        return allType(msg);
    }

    @Override
    public OutputMessage linkTypeMsg(LinkInputMessage msg) {
        return allType(msg);
    }
}

 

 


 

 

 

 

 

 

 

事件推送为一大类 : 有 1. 关注/取消关注事件 2.扫描带二维码参数事件 3.上报地理位置事件 4.自定义事件

菜单事件分为 : 1.点击菜单拉取消息时事件推送 2.点击菜单跳转链接时的事件推送

 

 

 

 

 

 

 

 

DefaultNormalMessageHandler 

[微信开发] - 消息回复及事件响应

上一篇:Java异常处理


下一篇:Java高级--Java线程运行栈信息的获取 getStackTrace()