## 微信接口连接和自动回复功能
先创建两个实体,用来接收微信(测试号或公众号)的消息和发送给微信(测试号或公众号)的消息。
接收微信发送消息的实体(InMsgEntity )
import lombok.Data;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
@Data //使用lombok的@Data注释功能,可以自动生成get,set,toString等方法
@XmlRootElement(name="xml")//使用这个和下面这个注释可以在生成微信识别的xml结尾格式
@XmlAccessorType(XmlAccessType.FIELD)
public class InMsgEntity {
// 文本消息
private String ToUserName; // 开发者微信号
private String FromUserName; // 发送方帐号(一个OpenID)
private Long CreateTime; // 消息创建时间 (整型)
private String MsgType; // 消息类型,文本为text
private String Content; // 文本消息内容
private Long MsgId; // 消息id,64位整型
private String PicUrl; // 图片链接(由系统生成)
private String MediaId; // 图片消息媒体id,可以调用获取临时素材接口拉取数据
private String Event;//事件类型,subscribe(订阅)、unsubscribe(取消订阅)在这里插入代码片
private String EvenKey;//事件菜单值
}
发送给微信的实体(OutMsgEntity )
import lombok.Data;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
@Data
@XmlRootElement(name="xml")
@XmlAccessorType(XmlAccessType.FIELD)
public class OutMsgEntity {
// 文本消息
private String ToUserName; // 用户的openId
private String FromUserName; // 测试号帐号(一个OpenID)
private Long CreateTime; // 消息创建时间 (整型)
private String MsgType; // 消息类型,文本为text
private String Content; // 文本消息内容
@XmlElementWrapper(name="Image")
private String[] MediaId; // 图片消息媒体id,可以调用获取临时素材接口拉取数据
//图文信息
private Integer ArticleCount;
//图文列表明细
@XmlElementWrapper(name="Articles")
private ArticleItem[] item;
}
controller层代码
这个controller是连接微信的,一般都是要通过排序和加密来验证的,这里我就不写了。
正确的验证方式说明如下():
开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。加密/校验流程如下:
1)将token、timestamp、nonce三个参数进行字典序排序
2)将三个参数字符串拼接成一个字符串进行sha1加密
3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
详细内容请查看官方微信开发文档
@RequestMapping(value="/WeChat.do", method=RequestMethod.GET)
@ResponseBody
public String wechat(String signature,String timestamp,String nonce,String echostr){
log.info("连接成功!");
return echostr;
}
连接成功之后,就可以进行简单的自动回复功能了。
说明:连接测试走的方式get方式,在微信测试号中输入内容走的是post方式,所以这两种方式就能实现简单的连接和交互。
下面这个controller能说实现的功能说明:
1、当关注测试号的时候,会自动推送欢迎功能;
2、用户在测试号页面输入什么内容,系统就会回复什么内容;
3、用户在测试号页面回复“1”,或“2”关键字,会自动回复已写好的文字内容。
@RequestMapping(value="/WeChat.do", method=RequestMethod.POST)
@ResponseBody
public Object returnMessage(@RequestBody InMsgEntity inMsgEntity){
log.info("---进入WeChatController的returnMessage方法");
OutMsgEntity outMsgEntity =new OutMsgEntity();
//发送方
outMsgEntity.setFromUserName(inMsgEntity.getToUserName());
log.info("发送方姓名:inMessageByWeChat.getToUserName():{}", inMsgEntity.getToUserName());
//接收方
outMsgEntity.setToUserName(inMsgEntity.getFromUserName());
log.info("接收方姓名:inMessageByWeChat.getFromUserName():{}", inMsgEntity.getFromUserName());
//消息创建时间
outMsgEntity.setCreateTime(new Date().getTime());
//判断传过来的消息类型
String type= inMsgEntity.getMsgType();
String show=null;
if(type.equals("text")){
//消息类型
outMsgEntity.setMsgType("text");
//设置消息内容
outMsgEntity.setContent(inMsgEntity.getContent());
log.info("---接收到的信息:inMessageByWeChat.getContent():{}", inMsgEntity.getContent());
if(inMsgEntity.getContent().contains("2")){
show="人生是场表演,它以生活为舞台,以时间为布景,"
+ "以情感起伏变化为线索,以我们经历的人与事为情节,以精彩与成功为高潮。"
+ "你哭也好,笑也罢,愿意也好,被动也罢,这是一场你无法拒绝的表演。有时,"
+ "我们演饰了别人,丢失了自己,成了自己舞台上的配角。去做属于自己的主角吧,"
+ "你的表演,谁都无可替代。";
}else if(inMsgEntity.getContent().contains("1")){
show="你回复1我就给你回复1,哈哈!";
}
}else if(type.equals("image")){
//消息类型
outMsgEntity.setMsgType("image");
//设置图片性关系
outMsgEntity.setMediaId(new String[]{inMsgEntity.getMediaId()});
}else if(type.equals("event")){
//判断事件的类型
if(inMsgEntity.getEvent().equals("subscribe")){
//回复普通文本消息
//outMessageByWeChat.setContent("欢迎关注!!!{微笑}");
//outMessageByWeChat.setMsgType("text");
//回复图文消息
outMsgEntity.setMsgType("news");
//设置图文个数
outMsgEntity.setArticleCount(1);
//设置图文明细列表
ArticleItem item = new ArticleItem();
item.setTitle("欢迎关注本微信测试号");
item.setPicUrl("http://pic.netbian.com/uploads/allimg/200604/001849-15912011292fcb.jpg");
item.setDescription("壁纸欢迎关注本测试号!");
item.setUrl("http://pic.netbian.com/tupian/25942.html");
outMsgEntity.setItem(new ArticleItem[]{item});
}
}
if(show!=null){
outMsgEntity.setContent(show);
log.info("---打印回复类型数据,outMessageByWeChat.getContent():{}", outMsgEntity.getContent());
}
log.info("---退出WeChatController的returnMessage方法---");
return outMsgEntity;
}
下面是效果测试
代码效果就这样了。