7.3.3 案例:回复Emoji表情

下面我们来做一个使用Emoji表情的简单案例,该案例要实现的功能是:不管用户发送什么消息,公众账号都回复一个包含Emoji表情的文本消息给用户。该案例的核心代码如下:

  1. 1 package org.liufeng.course.service;
  2. 2
  3. 3 import java.util.Date;
  4. 4 import java.util.Map;
  5. 5 import javax.servlet.http.HttpServletRequest;
  6. 6 import org.liufeng.course.message.resp.TextMessage;
  7. 7 import org.liufeng.course.util.MessageUtil;
  8. 8 
  9. 9 /**
  10. 10  * 核心服务类
  11. 11  *
  12. 12  * @author liufeng
  13. 13  * @date 2013-10-20
  14. 14  */
  15. 15 public class CoreService {
  16. 16  /**
  17. 17  * 得到包含指定Unicode代码点的字符串
  18. 18  *
  19. 19  * @param codePoint
  20. 20  * @return
  21. 21  */
  22. 22 private static String emoji(int codePoint) {
  23. 23  return String.valueOf(Character.toChars(codePoint));
  24. 24 }
  25. 25
  26. 26 /**
  27. 27  * 处理微信发来的请求
  28. 28  *
  29. 29  * @param request
  30. 30  * @return
  31. 31  */
  32. 32 public static String processRequest(HttpServletRequest request) {
  33. 33  String respXml = null;
  34. 34  try {
  35. 35  // XML请求解析
  36. 36  Map<String, String> requestMap = MessageUtil.parseXml(request);
  37. 37  // 发送方账号(open_id)
  38. 38  String fromUserName = requestMap.get("FromUserName");
  39. 39  // 公众账号
  40. 40  String toUserName = requestMap.get("ToUserName");
  41. 41
  42. 42  // 定义消息内容(鬼节做南瓜灯)
  43. 43  StringBuffer sb = new StringBuffer();
  44. 44  sb.append("1.Unified Unicode").append("\n");
  45. 45  sb.append(emoji(0x1F47B)).append("节做").append(emoji(0x1F383)).append
  46. 46  ("灯\n\n");
  47. 47  sb.append("2.Softbank Unicode").append("\n");
  48. 48  sb.append(emoji(0xE11B)).append("节做").append(emoji(0xE445)).append("灯");
  49. 49
  50. 50  // 回复文本消息
  51. 51  TextMessage textMessage = new TextMessage();
  52. 52  textMessage.setToUserName(fromUserName);
  53. 53  textMessage.setFromUserName(toUserName);
  54. 54  textMessage.setCreateTime(new Date().getTime());
  55. 55  textMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_TEXT);
  56. 56  textMessage.setContent(sb.toString());
  57. 57  respXml = MessageUtil.messageToXml(textMessage);
  58. 58  } catch (Exception e) {
  59. 59  e.printStackTrace();
  60. 60  }
  61. 61  return respXml;
  62. 62  }
  63. 63 }

代码的第22~24行定义了一个emoji()方法,用于得到包含指定Unicode代码点的字符串。第43~48行代码定义了要回复的文本内容,这里通过调用emoji()方法加入了4个Emoji表情。第51~56行代码将回复的内容封装成文本消息对象。笔者使用了两部手机(ME722和iPhone4S)进行测试,如图7-7所示。可以看出,使用Unified和Softbank两种编码得到的Emoji表情一样,并且在两部手机上的表现也完全一致。

7.3.3 案例:回复Emoji表情 - 图1

图7-7 公众账号回复Emoji表情的演示效果