1.微信公众号开发 - 环境搭建
2.微信公众号开发 - 配置表设计以及接入公众号接口开发
3.微信公众号开发 - token获取(保证同一时间段内只请求一次)
4.微信公众号开发 - 菜单按钮bean封装
5.微信公众号开发 - 创建菜单
6.微信公众号开发 - 事件处理和回复消息
7.微信公众号开发 - 发送Emoji表情
项目完整代码请访问github:https://github.com/liaozq0426/wx.git
上篇文章实现了微信公众事件消息的处理,今天来实现向客户端发送Emoji表情
我们实现一个菜单按钮点击时后台回复带Emoji表情的文本消息,Emoji表情需要用Unicode编码转换而来
public class TestEmoji {
public static void main(String[] args) {
String emoji1 = String.valueOf(Character.toChars(0x1F389)); // 庆祝
String emoji2 = String.valueOf(Character.toChars(0x1F602)); // 笑哭
String emoji3 = String.valueOf(Character.toChars(0x1F448)); // 向左
System.out.println(("欢迎!" + emoji1+emoji2+emoji3));
}
}
运行main函数,控制台打印如下
如果想要生成其它表情,可以参考这篇博客获取对应表情的Unicode编码https://blog.csdn.net/gf771115/article/details/16825267
有了表情后,接下来就是在菜单点击时返回包含表情的文本消息,这样客户端就能收到表情消息了
// 如果是菜单按钮点击事件
if (WxMessageConst.EVENT_TYPE_CLICK.equals(requestMap.get(WxMessageConst.EVENT))) {
logger.info(requestMap.get(WxMessageConst.EVENT_KEY));
TextMessage textMessage = new TextMessage();
String emoji1 = String.valueOf(Character.toChars(0x1F389)); // 庆祝
String emoji2 = String.valueOf(Character.toChars(0x1F602)); // 笑哭
String emoji3 = String.valueOf(Character.toChars(0x1F448)); // 向左
textMessage.setContent("欢迎!" + emoji1+emoji2+emoji3);
textMessage.setCreateTime(new Date().getTime());
textMessage.setFromUserName(toUserName);
textMessage.setToUserName(fromUserName);
textMessage.setMsgType(WxMessageConst.MSG_TYPE_TEXT);
String response = BeanXmlUtil.beanToXmlCommon(textMessage);
if(response != null)
return response;
}
这里没有将所有事件消息处理代码贴出来,因为上篇文章已经展示了相关代码。
这样用户点击click按钮后,就会收到欢迎!
的回复了,启动服务在公众号测试一下,点击关于
按钮,如下图,客户端收到了公众号的回复。
如何存储含Emoji的文本消息
创建wx_reply表来存储消息,建表语句如下
CREATE TABLE `wx_reply` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主键',
`openid` varchar(36) DEFAULT NULL COMMENT '用户标识',
`request` text COMMENT '请求内容',
`response` text COMMENT '响应内容',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
创建mapper接口和对应的xml实现文件,里面只有一个insert方法
package com.gavin.mapper;
import com.gavin.pojo.WxReply;
public interface WxReplyMapper {
int insert(WxReply wxReply);
}
<mapper namespace="com.gavin.mapper.WxReplyMapper">
<resultMap type="com.gavin.pojo.WxReply" id="WxReplyMap">
<id column="id" property="id" />
<result column="openid" property="openid" />
<result column="request" property="request" />
<result column="response" property="response" />
<result column="create_time" property="createTime" />
resultMap>
<insert id="insert" parameterType="com.gavin.pojo.WxReply">
insert into wx_reply
(
openid
,request
,response
,create_time
)
values
(
#{openid}
,#{request}
,#{response}
,now()
)
insert>
mapper>
然后创建WxReplyService和实现类WxMsgServiceImpl,代码如下
package com.gavin.service;
import javax.servlet.http.HttpServletRequest;
public interface WxMsgService {
String processWxRequest(HttpServletRequest request) throws Exception;
}
package com.gavin.service.impl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.gavin.mapper.WxReplyMapper;
import com.gavin.pojo.WxReply;
import com.gavin.service.WxReplyService;
@Service
public class WxReplyServiceImpl implements WxReplyService{
@Autowired
private WxReplyMapper wxReplyMapper;
@Override
public int insert(WxReply wxReply) throws Exception {
return wxReplyMapper.insert(wxReply);
}
}
接下来我们在处理按钮点击事件代码中保存一下消息内容
要注意的是
:通常我们数据库表的编码格式都是utf8
,但utf8格式的话,无法存储含有Emoji表情的字符串,这时我们有两种解决方法
emoji-java
库将Emoji表情转换成普通字符串utf8mb4
编码首先看第一种,要使用emoji-java,需要先引入如下pom依赖
<dependency>
<groupId>com.vdurmontgroupId>
<artifactId>emoji-javaartifactId>
<version>3.2.0version>
dependency>
使用起来很简单,只需要用到EmojiParser
类的编码和解码方法
编码,将Emoji表情转为普通字符串
EmojiParser.parseToAliases(content);
解码,将普通字符串转换为Emoji表情
EmojiParser.parseToUnicode(content);
这样,处理按钮点击事件的代码就修改为
if (WxMessageConst.EVENT_TYPE_CLICK.equals(requestMap.get(WxMessageConst.EVENT))) {
// 按钮EventKey值
logger.info(requestMap.get(WxMessageConst.EVENT_KEY));
TextMessage textMessage = new TextMessage();
String emoji1 = String.valueOf(Character.toChars(0x1F389)); // 庆祝
String emoji2 = String.valueOf(Character.toChars(0x1F602)); // 笑哭
String emoji3 = String.valueOf(Character.toChars(0x1F448)); // 向左
textMessage.setContent("欢迎!" + emoji1+emoji2+emoji3);
textMessage.setCreateTime(new Date().getTime());
textMessage.setFromUserName(toUserName);
textMessage.setToUserName(fromUserName);
textMessage.setMsgType(WxMessageConst.MSG_TYPE_TEXT);
String response = BeanXmlUtil.beanToXmlCommon(textMessage);
if(response != null) {
// 保存response至数据库
System.out.println(response);
WxReply wxReply = new WxReply();
wxReply.setOpenid(fromUserName);
// 处理Emoji表情,将Emoji表情转换成utf-8可以存储的字符串
String responseText = EmojiParser.parseToAliases(response);
wxReply.setResponse(responseText);
this.WxReplyService.insert(wxReply);
return response;
}
}
启动服务在公众号点击一下关于
按钮,通过控制打印的日志可以看到响应消息内容编码前后的效果
---编码前---
<xml>
<ToUserName><![CDATA[oqGkCwqVozanJ9K2nIlrxU_LCwdg]]></ToUserName>
<FromUserName><![CDATA[gh_be5b60a2d8d9]]></FromUserName>
<CreateTime><![CDATA[1575289756423]]></CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[欢迎!]]></Content>
</xml>
---编码后---
<xml>
<ToUserName><![CDATA[oqGkCwqVozanJ9K2nIlrxU_LCwdg]]></ToUserName>
<FromUserName><![CDATA[gh_be5b60a2d8d9]]></FromUserName>
<CreateTime><![CDATA[1575289756423]]></CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[欢迎!:tada::joy::point_left:]]></Content>
</xml>
接下来我们看第二种方法,修改数据库表字段的编码格式为
utf8mb4
将response字段的编码格式修改为utf8mb4,sql语句如下
ALTER TABLE wx_reply MODIFY COLUMN response text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
然后将以下两行代码
String responseText = EmojiParser.parseToAliases(response);
wxReply.setResponse(responseText);
修改为
wxReply.setResponse(response);