8.5.2 案例:服务两个公众账号
下面我们来开发一个服务两个公众账号的简单案例,示例程序需要服务企业A和企业B的公众账号,并且为两个账号设置不同的关注提示语,该案例的核心服务类CoreServlet的代码如下:
- 1 package org.liufeng.course.service;
- 2
- 3 import java.util.Date;
- 4 import java.util.Map;
- 5 import javax.servlet.http.HttpServletRequest;
- 6 import org.liufeng.course.message.resp.TextMessage;
- 7 import org.liufeng.course.util.MessageUtil;
- 8
- 9 /**
- 10 * 核心服务类
- 11 *
- 12 * @author liufeng
- 13 * @date 2013-10-26
- 14 */
- 15 public class CoreService {
- 16 /**
- 17 * 处理微信发来的请求
- 18 *
- 19 * @param request
- 20 * @return xml
- 21 */
- 22 public static String processRequest(HttpServletRequest request) {
- 23 // XML格式的消息数据
- 24 String respXml = null;
- 25
- 26 try {
- 27 // 公众账号的标识
- 28 String accountId = request.getParameter("accountId");
- 29 // 调用parseXml方法解析请求消息
- 30 Map<String, String> requestMap = MessageUtil.parseXml(request);
- 31 // 发送方账号
- 32 String fromUserName = requestMap.get("FromUserName");
- 33 // 开发者微信号
- 34 String toUserName = requestMap.get("ToUserName");
- 35 // 消息类型
- 36 String msgType = requestMap.get("MsgType");
- 37
- 38 TextMessage textMessage = new TextMessage();
- 39 textMessage.setToUserName(fromUserName);
- 40 textMessage.setFromUserName(toUserName);
- 41 textMessage.setCreateTime(new Date().getTime());
- 42 textMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_TEXT);
- 43
- 44 // 事件推送
- 45 if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_EVENT)) {
- 46 // 事件类型
- 47 String eventType = requestMap.get("Event");
- 48 // 订阅
- 49 if (eventType.equals(MessageUtil.EVENT_TYPE_SUBSCRIBE)) {
- 50 // 判断是哪个公众账号
- 51 if ("aaa".equals(accountId))
- 52 textMessage.setContent("您好,欢迎关注企业A的官方微信!");
- 53 else if ("bbb".equals(accountId))
- 54 textMessage.setContent("您好,欢迎关注企业B的官方微信!");
- 55 respXml = MessageUtil.messageToXml(textMessage);
- 56 } else {
- 57 // TODO 其他情况
- 58 }
- 59 } else {
- 60 // TODO 其他情况
- 61 }
- 62 } catch (Exception e) {
- 63 e.printStackTrace();
- 64 }
- 65 return respXml;
- 66 }
- 67 }
上述代码中最关键的是第28行,从request对象中获取参数accountId,该参数是通过URL传入的,表示公众账号的标识。第51~54行通过accountId判断是哪个公众账号的关注事件,然后回复相应的关注提示语。我们将上述示例程序部署到BAE上,如果CoreServlet的访问地址为http://0.weixinmptest.duapp.com/coreServlet,那么在公众平台开发模式的接口配置信息中,企业A和企业B需要填入的URL分别如下:
- // 企业A公众账号的URL
- http://0.weixinmptest.duapp.com/coreServlet?accountId=aaa
- // 企业B公众账号的URL
- http://0.weixinmptest.duapp.com/coreServlet?accountId=bbb
说明 ①在实际项目(服务多个账号的项目)中,我们会将所有公众账号的标识、关注提示语、默认回复的消息等存储到数据库中。另外,也会对URL中传递的参数值进行加密,保障企业数据安全。②除了URL以外,还可以通过请求消息中的参数ToUserName(公众账号的原始ID)区分不同的公众账号。