项目完整代码请访问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函数,控制台打印如下

公众号emoji代码 公众号emoji表情_公众号emoji代码


有了表情后,接下来就是在菜单点击时返回包含表情的文本消息,这样客户端就能收到表情消息了

// 如果是菜单按钮点击事件
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代码 公众号emoji表情_微信公众号发送Emoji表情消息_02

如何存储含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表情的字符串,这时我们有两种解决方法

  1. 使用emoji-java库将Emoji表情转换成普通字符串
  2. 将要存储Emoji表情的数据库表字段修改为utf8mb4编码

首先看第一种,要使用emoji-java,需要先引入如下pom依赖

<dependency>
    <groupId>com.vdurmont</groupId>
    <artifactId>emoji-java</artifactId>
    <version>3.2.0</version>
</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>

再看一下数据库,也成功新增了一条记录

公众号emoji代码 公众号emoji表情_微信公众号发送Emoji表情消息_03

接下来我们看第二种方法,修改数据库表字段的编码格式为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);

再次点击关于按钮,可以看到数据库依然记录成功,只是这次直接存储的是Emoji表情符号,如下图红框所示

公众号emoji代码 公众号emoji表情_微信公众号发送表情消息_04