8.5.2 案例:服务两个公众账号

下面我们来开发一个服务两个公众账号的简单案例,示例程序需要服务企业A和企业B的公众账号,并且为两个账号设置不同的关注提示语,该案例的核心服务类CoreServlet的代码如下:

  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-26
  14. 14  */
  15. 15 public class CoreService {
  16. 16 /**
  17. 17  * 处理微信发来的请求
  18. 18  *
  19. 19  * @param request
  20. 20  * @return xml
  21. 21  */
  22. 22 public static String processRequest(HttpServletRequest request) {
  23. 23  // XML格式的消息数据
  24. 24  String respXml = null;
  25. 25
  26. 26  try {
  27. 27  // 公众账号的标识
  28. 28  String accountId = request.getParameter("accountId");
  29. 29  // 调用parseXml方法解析请求消息
  30. 30  Map<String, String> requestMap = MessageUtil.parseXml(request);
  31. 31  // 发送方账号
  32. 32  String fromUserName = requestMap.get("FromUserName");
  33. 33  // 开发者微信号
  34. 34  String toUserName = requestMap.get("ToUserName");
  35. 35  // 消息类型
  36. 36  String msgType = requestMap.get("MsgType");
  37. 37
  38. 38  TextMessage textMessage = new TextMessage();
  39. 39  textMessage.setToUserName(fromUserName);
  40. 40  textMessage.setFromUserName(toUserName);
  41. 41  textMessage.setCreateTime(new Date().getTime());
  42. 42  textMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_TEXT);
  43. 43
  44. 44  // 事件推送
  45. 45  if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_EVENT)) {
  46. 46  // 事件类型
  47. 47  String eventType = requestMap.get("Event");
  48. 48  // 订阅
  49. 49  if (eventType.equals(MessageUtil.EVENT_TYPE_SUBSCRIBE)) {
  50. 50  // 判断是哪个公众账号
  51. 51  if ("aaa".equals(accountId))
  52. 52  textMessage.setContent("您好,欢迎关注企业A的官方微信!");
  53. 53  else if ("bbb".equals(accountId))
  54. 54  textMessage.setContent("您好,欢迎关注企业B的官方微信!");
  55. 55  respXml = MessageUtil.messageToXml(textMessage);
  56. 56  } else {
  57. 57  // TODO 其他情况
  58. 58  }
  59. 59  } else {
  60. 60  // TODO 其他情况
  61. 61  }
  62. 62  } catch (Exception e) {
  63. 63  e.printStackTrace();
  64. 64  }
  65. 65  return respXml;
  66. 66  }
  67. 67 }

上述代码中最关键的是第28行,从request对象中获取参数accountId,该参数是通过URL传入的,表示公众账号的标识。第51~54行通过accountId判断是哪个公众账号的关注事件,然后回复相应的关注提示语。我们将上述示例程序部署到BAE上,如果CoreServlet的访问地址为http://0.weixinmptest.duapp.com/coreServlet,那么在公众平台开发模式的接口配置信息中,企业A和企业B需要填入的URL分别如下:

  1. // 企业A公众账号的URL
  2. http://0.weixinmptest.duapp.com/coreServlet?accountId=aaa
  3. // 企业B公众账号的URL
  4. http://0.weixinmptest.duapp.com/coreServlet?accountId=bbb

说明 ①在实际项目(服务多个账号的项目)中,我们会将所有公众账号的标识、关注提示语、默认回复的消息等存储到数据库中。另外,也会对URL中传递的参数值进行加密,保障企业数据安全。②除了URL以外,还可以通过请求消息中的参数ToUserName(公众账号的原始ID)区分不同的公众账号。