微信自动回复接口

  1 //1.微信自动回复接口
  2 public void receiveMSG(HttpServletRequest request, HttpServletResponse response, @PathVariable(value = "comId")
  3     String comId) throws Exception {
  4         try {
  5             boolean isGet = request.getMethod().toLowerCase().equals("get");
  6             request.setCharacterEncoding("UTF-8");
  7             response.setCharacterEncoding("UTF-8");
  8             if (isGet) {
  9                 // 验证URL真实性
 10                 String token = Utils.getParmValueByName(request, comId, "WeChat_Token", ""); // "rrtxxvafgargae";//
 11                 String signature = request.getParameter("signature");// 微信加密签名
 12                 String timestamp = request.getParameter("timestamp");// 时间戳
 13                 String nonce = request.getParameter("nonce");// 随机数
 14                 String echostr = request.getParameter("echostr");// 随机字符串
 15                 List<String> params = new ArrayList<String>();
 16                 params.add(token);// Token
 17                 params.add(timestamp);
 18                 params.add(nonce);
 19                 // 1. 将token、timestamp、nonce三个参数进行字典序排序
 20                 Collections.sort(params, new Comparator<String>() {
 21                     @Override
 22                     public int compare(String o1, String o2) {
 23                         return o1.compareTo(o2);
 24                     }
 25                 });
 26                 // 2. 将三个参数字符串拼接成一个字符串进行sha1加密
 27                 String temp = Utils.toShaString(params.get(0) + params.get(1) + params.get(2));
 28                 // log.debug("temp:"+temp);
 29                 // log.debug("signature:"+signature);
 30                 if (temp.equals(signature)) {
 31                     response.getWriter().write(echostr);
 32                 }
 33             } else {
 34                 // 处理接收消息
 35                 /** 读取接收到的xml消息 */
 36                 StringBuffer sb = new StringBuffer();
 37                 InputStream is = request.getInputStream();
 38                 InputStreamReader isr = new InputStreamReader(is, "UTF-8");
 39                 BufferedReader br = new BufferedReader(isr);
 40                 String s = "";
 41                 while ((s = br.readLine()) != null) {
 42                     sb.append(s);
 43                 }
 44                 String xml = sb.toString(); // 次即为接收到微信端发送过来的xml数据
 45                 HashMap<String, String> xmlmap = WeChatUtils.xml2HashMap(xml);
 46                 log.debug(xmlmap.toString());
 47                 // 接收事件推送
 48                 String msgType = xmlmap.get("MsgType");
 49                 if ("event".equals(msgType)) {
 50                     String event = xmlmap.get("Event");
 51                     if ("subscribe".equals(event)) {
 52                         String msg = Utils.getParmValueByName(request, comId, "WeChat_SubscribeMsg", "您好,欢迎关注!");
 53                         String xmlTo = "<xml>";
 54                         xmlTo += "<ToUserName>" + xmlmap.get("FromUserName") + "</ToUserName>";
 55                         xmlTo += "<FromUserName>" + xmlmap.get("ToUserName") + "</FromUserName>";
 56                         xmlTo += "<CreateTime>" + xmlmap.get("CreateTime") + "</CreateTime>";
 57                         xmlTo += "<MsgType>text</MsgType>";
 58                         xmlTo += "<Content>" + msg + "</Content>";
 59                         xmlTo += "</xml>";
 60                         response.getWriter().write(xmlTo);
 61                     }
 62                     if ("subscribe".equals(event) || "SCAN".equals(event)) {
 63                         log.debug("订阅");
 64 
 65                         String sql = " select cust_id from WECHAT_CUST where com_id = ? and OPENID = ?  order by TYPE_BIND desc  ";
 66                         ArrayList parms = new ArrayList();
 67                         parms.add(comId);
 68                         parms.add(xmlmap.get("FromUserName"));
 69                         String custId = utilsService.getValueBySql(sql, parms, "");
 70                         if (StringUtils.isBlank(custId)) {
 71                             String accessToken = WeChatUtils.getAccessToken(request, comId);
 72                             String usermsg = WeChatUtils.getUserInfo(accessToken, xmlmap.get("FromUserName"));
 73                             JSONObject jsonUser = WeChatUtils.string2JSON(usermsg);
 74                             if (jsonUser.containsKey("errcode"))
 75                                 throw new Exception(jsonUser.toString());
 76 
 77                             Cust cust = new Cust();
 78                             String cust_id = utilsService.getMemNum(comId);
 79                             cust.setCustId(cust_id);
 80                             cust.setCustName(jsonUser.getString("nickname").replaceAll("'", "").replaceAll(""", ""));
 81                             cust.setCustShortName("");
 82                             cust.setReturnlimitdays(99999);
 83                             cust.setCustPwd("");
 84                             cust.setComId(comId);
 85                             cust.setCallRut(comId);
 86                             cust.setInnerType("05");
 87                             cust.setIsMkt("0");
 88                             cust.setCustType5("1");
 89                             cust.setStatus("02");
 90                             cust.setCallState("M");
 91                             cust.setTel("");
 92                             cust.setIsTel("0");
 93                             cust.setEmail("");
 94                             cust.setIsWeb("0");
 95                             if (!jsonUser.getString("sex").equals("1")) {
 96                                 cust.setCallState("F");
 97                             }
 98                             sql = " select min(MCP_CLS_ID)  from MEM_CLASS_POLICE where MCP_COM_ID = ? ";
 99                             parms.clear();
100                             parms.add(comId);
101                             String mcp_cls_id = utilsService.getValueBySql(sql, parms, "");
102                             cust.setCustType4(mcp_cls_id);
103                             CustOther custOther = new CustOther();
104                             custOther.setCustId(cust_id);
105                             if (xmlmap.containsKey("Ticket")) {
106                                 sql = " select cust_id  from WECHAT_CUST where TICKET = ? ";
107                                 parms.clear();
108                                 parms.add(xmlmap.get("Ticket"));
109                                 String CorCusNum = utilsService.getValueBySql(sql, parms, "");
110                                 cust.setCorCusNum(CorCusNum);
111                             } else {
112                                 cust.setCorCusNum("");
113                             }
114                             WechatCust wechatcust = new WechatCust();
115                             wechatcust.setComId(comId);
116                             wechatcust.setCustId(cust_id);
117                             wechatcust.setOpenid(xmlmap.get("FromUserName"));
118                             wechatcust.setTicket("");
119                             wechatcust.setHeadimgurl(jsonUser.getString("headimgurl"));
120                             wechatcust.setStatus("1");
121                             wechatcust.setCrtDate(Utils.GetCurrentDate());
122                             wechatcust.setTypeBind("0");
123                             wechatcust.setCancelDate("");
124                             weChatBaseService.addCust(cust, custOther, wechatcust);
125 
126                         } else if ("subscribe".equals(event)) {
127                             WechatCust wechatcust = new WechatCust();
128                             wechatcust.setComId(comId);
129                             wechatcust.setCustId(custId);
130                             wechatcust = wechatCustService.findByPrimaryKey(wechatcust.getPrimaryKey());
131                             Cust cust = custService.findByPrimaryKey(custId);
132                             if (StringUtils.isBlank(wechatcust.getHeadimgurl())) {
133                                 String accessToken = WeChatUtils.getAccessToken(request, comId);
134                                 String usermsg = WeChatUtils.getUserInfo(accessToken, xmlmap.get("FromUserName"));
135                                 JSONObject jsonUser = WeChatUtils.string2JSON(usermsg);
136                                 if (jsonUser.containsKey("errcode"))
137                                     throw new Exception(jsonUser.toString());
138                                 String nickname = "";
139                                 String sex = "1";
140                                 String headimgurl = "";
141                                 String ticket = "";
142                                 try {
143                                     nickname = jsonUser.getString("nickname").replaceAll("'", "").replaceAll(""", "");
144                                     sex = jsonUser.getString("sex");
145                                     headimgurl = jsonUser.getString("headimgurl");
146                                     ticket = WeChatUtils.getQRCode(accessToken, custId).get("ticket").toString();
147                                 } catch (Throwable e) {
148 
149                                 }
150 
151                                 wechatcust.setOpenid(xmlmap.get("FromUserName"));
152                                 wechatcust.setTicket(ticket);
153                                 wechatcust.setHeadimgurl(headimgurl);
154                                 wechatcust.setCrtDate(Utils.GetCurrentDate());
155                                 cust.setCustName(nickname);
156                                 if (!sex.equals("1")) {
157                                     cust.setCallState("F");
158                                 }
159                             }
160                             wechatcust.setStatus("1");
161                             weChatBaseService.updateCust(cust, wechatcust);
162                             String updatesql = " update WECHAT_CUST set STATUS = '1' where com_id = ? and OPENID = ? ";
163                             String nowDate = Utils.GetCurrentDate();
164                             parms.clear();
165                             parms.add(comId);
166                             parms.add(xmlmap.get("FromUserName"));
167                             utilsService.updateSql(updatesql, parms);
168                         }
169 
170                     } else if ("unsubscribe".equals(event)) {
171                         log.debug("取消订阅");
172                         String sql = " update WECHAT_CUST set STATUS = '0', CANCEL_DATE = ? where com_id = ? and OPENID = ? ";
173                         ArrayList parms = new ArrayList();
174                         String nowDate = Utils.GetCurrentDate();
175                         parms.add(nowDate);
176                         parms.add(comId);
177                         parms.add(xmlmap.get("FromUserName"));
178 
179                         utilsService.updateSql(sql, parms);
180 
181                     }else if ("SCAN".equals(event)) {
182                         log.debug("用户已关注时的事件推送  ");
183                     } else if ("LOCATION".equals(event)) {
184                         log.debug("上报地理位置事件");
185                     } else if ("CLICK".equals(event)) {
186                         log.debug("点击菜单拉取消息时的事件推送");
187                         String eventKey = xmlmap.get("EventKey");
188                         log.debug("eventKey:"+eventKey);
189                         if (StringUtils.equalsIgnoreCase("cust_service", eventKey)) {
190                             String fromUserName = xmlmap.get("FromUserName");
191                             String sql = " select COR_CUS_NUM from  cust , wechat_cust where wechat_cust.cust_id = cust.cust_id "
192                                     + "    and wechat_cust.com_id = ? and wechat_cust.openid = ?  " + " order by wechat_cust.TYPE_BIND desc ";
193                             String mSql = " select MEDIA_ID from WECHAT_CUST_MEDIA where cust_id = ? and com_id = ? ";
194                             String custSql = "select COR_CUS_NUM from  cust where cust_id = ? ";
195                             ArrayList parms = new ArrayList();
196                             parms.add(comId);
197                             parms.add(fromUserName);
198 
199                             String mediaId = "";
200                             String custId = utilsService.getValueBySql(sql, parms, "");
201                             int count = 0;
202                             while (StringUtils.isBlank(mediaId) && StringUtils.isNotBlank(custId) && count < 3) {
203                                 count++;
204                                 parms.clear();
205                                 parms.add(custId);
206                                 parms.add(comId);
207                                 mediaId = utilsService.getValueBySql(mSql, parms, "");
208                                 if (StringUtils.isBlank(mediaId)) {
209                                     parms.clear();
210                                     parms.add(custId);
211                                     custId = utilsService.getValueBySql(custSql, parms, "");
212                                 }
213                             }
214                             if (StringUtils.isBlank(mediaId)) {
215                                 mediaId = Utils.getParmValueByName(request, comId, "WeChat_ServiceMediaId", "");
216                             }
217                             if (StringUtils.isNotBlank(mediaId)) {
218                                 log.debug("mediaId:"+mediaId);
219                                 String xmlTo = "<xml>";
220                                 xmlTo += "<ToUserName>" + xmlmap.get("FromUserName") + "</ToUserName>";
221                                 xmlTo += "<FromUserName>" + xmlmap.get("ToUserName") + "</FromUserName>";
222                                 xmlTo += "<CreateTime>" + xmlmap.get("CreateTime") + "</CreateTime>";
223                                 xmlTo += "<MsgType>image</MsgType>";
224                                 xmlTo += "<Image>";
225                                 xmlTo += "<MediaId>" + mediaId + "</MediaId>";
226                                 xmlTo += "</Image>";
227                                 xmlTo += "</xml>";
228                                 response.getWriter().write(xmlTo);
229                             }else {
230                                 String xmlTo = "<xml>";
231                                 xmlTo += "<ToUserName>" + xmlmap.get("FromUserName") + "</ToUserName>";
232                                 xmlTo += "<FromUserName>" + xmlmap.get("ToUserName") + "</FromUserName>";
233                                 xmlTo += "<CreateTime>" + xmlmap.get("CreateTime") + "</CreateTime>";
234                                 xmlTo += "<MsgType>text</MsgType>";
235                                 xmlTo += "<Content>还未绑定客服资料</Content>";
236                                 xmlTo += "</xml>";
237                                 response.getWriter().write(xmlTo);
238                             }
239                         }
240                     }
241                 } else if ("text".equals(msgType)) {//回复文本
242                     String key = xmlmap.get("Content");
243                     String xmlTo = "<xml>";
244                     xmlTo += "<ToUserName>" + xmlmap.get("ToUserName") + "</ToUserName>";
245                     xmlTo += "<FromUserName>" + xmlmap.get("FromUserName") + "</FromUserName>";
246                     xmlTo += "<CreateTime>" + xmlmap.get("CreateTime") + "</CreateTime>";
247                     xmlTo += "<MsgType>text</MsgType>";
248                     String repltSql="select * from  WECHAT_AUTO_KEY where WECHAT_AUTO_KEY.KEY_NAME = ? and WECHAT_AUTO_KEY.COM_ID=? ";
249                     ArrayList parms = new ArrayList();
250                     parms.add(key);
251                     parms.add(comId);
252                     List replylist=utilsService.getDataList(repltSql, parms);
253                     String desc="";
254                     if(replylist!=null && replylist.size()>0){
255                          HashMap replyLine = (HashMap)replylist.get(0);
256                          desc=(String) replyLine.get("DESC");
257                     }
258                     if(StringUtils.isNotBlank(desc))
259                         xmlTo += "<Content>" + desc + "</Content>";
260                     else 
261                         xmlTo += "<Content>" + "查无内容" + "</Content>";
262                     xmlTo += "</xml>";
263                     response.getWriter().write(xmlTo);
264                 }else if ("image".equals(msgType)) {//回复图片
265                     String key = xmlmap.get("MediaId");
266                     String xmlTo = "<xml>";
267                     xmlTo += "<ToUserName>" + xmlmap.get("ToUserName") + "</ToUserName>";
268                     xmlTo += "<FromUserName>" + xmlmap.get("FromUserName") + "</FromUserName>";
269                     xmlTo += "<CreateTime>" + xmlmap.get("CreateTime") + "</CreateTime>";
270                     xmlTo += "<MsgType>image</MsgType>";
271                     xmlTo += "<Image>";
272                     String repltSql="select * from  WECHAT_AUTO_KEY where WECHAT_AUTO_KEY.KEY_NAME = ? and WECHAT_AUTO_KEY.COM_ID=? ";
273                     ArrayList parms = new ArrayList();
274                     parms.add(key);
275                     parms.add(comId);
276                     List replylist=utilsService.getDataList(repltSql, parms);
277                     String mediaId="";
278                     if(replylist!=null && replylist.size()>0){
279                          HashMap replyLine = (HashMap)replylist.get(0);
280                          mediaId=(String) replyLine.get("MEDIA_ID");
281                     }
282                     if(StringUtils.isNotBlank(mediaId))
283                         xmlTo += "<MediaId>" + mediaId + "</MediaId>";
284                     else 
285                         xmlTo += "<MediaId>" + "查无内容" + "</MediaId>";
286                     xmlTo += "</Image>";
287                     xmlTo += "</xml>";
288                     response.getWriter().write(xmlTo);
289                 }else if ("voice".equals(msgType)) {//回复语音
290                     String key = xmlmap.get("MediaId");
291                     String xmlTo = "<xml>";
292                     xmlTo += "<ToUserName>" + xmlmap.get("ToUserName") + "</ToUserName>";
293                     xmlTo += "<FromUserName>" + xmlmap.get("FromUserName") + "</FromUserName>";
294                     xmlTo += "<CreateTime>" + xmlmap.get("CreateTime") + "</CreateTime>";
295                     xmlTo += "<MsgType>voice</MsgType>";
296                     xmlTo += "<Voice>";
297                     String repltSql="select * from  WECHAT_AUTO_KEY where WECHAT_AUTO_KEY.KEY_NAME = ? and WECHAT_AUTO_KEY.COM_ID=? ";
298                     ArrayList parms = new ArrayList();
299                     parms.add(key);
300                     parms.add(comId);
301                     List replylist=utilsService.getDataList(repltSql, parms);
302                     String mediaId="";
303                     if(replylist!=null && replylist.size()>0){
304                          HashMap replyLine = (HashMap)replylist.get(0);
305                          mediaId=(String) replyLine.get("MEDIA_ID");
306                     }
307                     if(StringUtils.isNotBlank(mediaId))
308                         xmlTo += "<MediaId>" + mediaId + "</MediaId>";
309                     else 
310                         xmlTo += "<MediaId>" + "查无内容" + "</MediaId>";
311                     xmlTo += "</Voice>";
312                     xmlTo += "</xml>";
313                     response.getWriter().write(xmlTo);
314                 }else if ("video".equals(msgType)) {//回复视频
315                     String key = xmlmap.get("MediaId");
316                     String xmlTo = "<xml>";
317                     xmlTo += "<ToUserName>" + xmlmap.get("ToUserName") + "</ToUserName>";
318                     xmlTo += "<FromUserName>" + xmlmap.get("FromUserName") + "</FromUserName>";
319                     xmlTo += "<CreateTime>" + xmlmap.get("CreateTime") + "</CreateTime>";
320                     xmlTo += "<MsgType>video</MsgType>";
321                     xmlTo += "<Video>";
322                     String repltSql="select * from  WECHAT_AUTO_KEY where WECHAT_AUTO_KEY.KEY_NAME = ? and WECHAT_AUTO_KEY.COM_ID=? ";
323                     ArrayList parms = new ArrayList();
324                     parms.add(key);
325                     parms.add(comId);
326                     List replylist=utilsService.getDataList(repltSql, parms);
327                     String mediaId="";
328                     String title="";
329                     String desc="";
330                     if(replylist!=null && replylist.size()>0){
331                          HashMap replyLine = (HashMap)replylist.get(0);
332                          mediaId=(String) replyLine.get("MEDIA_ID");
333                          title=(String) replyLine.get("TITLE");
334                          desc=(String) replyLine.get("DESC");
335                     }
336                     if(StringUtils.isNotBlank(mediaId))
337                         xmlTo += "<MediaId>" + mediaId + "</MediaId>";
338                     else 
339                         xmlTo += "<MediaId>" + "查无内容" + "</MediaId>";
340                     xmlTo += "<Title>" + title + "</Title>";
341                     xmlTo += "<Description>" + desc + "</Title>";
342                     xmlTo += "</Video> ";
343                     xmlTo += "</xml>";
344                     response.getWriter().write(xmlTo);
345                 }else if ("music".equals(msgType)) {//回复音乐
346                     String key = xmlmap.get("ThumbMediaId");
347                     String xmlTo = "<xml>";
348                     xmlTo += "<ToUserName>" + xmlmap.get("ToUserName") + "</ToUserName>";
349                     xmlTo += "<FromUserName>" + xmlmap.get("FromUserName") + "</FromUserName>";
350                     xmlTo += "<CreateTime>" + xmlmap.get("CreateTime") + "</CreateTime>";
351                     xmlTo += "<MsgType>music</MsgType>";
352                     xmlTo += "<Music>";
353                     String repltSql="select * from  WECHAT_AUTO_KEY where WECHAT_AUTO_KEY.KEY_NAME = ? and WECHAT_AUTO_KEY.COM_ID=? ";
354                     ArrayList parms = new ArrayList();
355                     parms.add(key);
356                     parms.add(comId);
357                     List replylist=utilsService.getDataList(repltSql, parms);
358                     String mediaId="";
359                     String title="";
360                     String desc="";
361                     String url="";
362                     if(replylist!=null && replylist.size()>0){
363                          HashMap replyLine = (HashMap)replylist.get(0);
364                          mediaId=(String) replyLine.get("MEDIA_ID");
365                          title=(String) replyLine.get("TITLE");
366                          desc=(String) replyLine.get("DESC");
367                          url=(String) replyLine.get("URL");
368                     }
369                     xmlTo += "<Title>" + title + "</Title>";
370                     xmlTo += "<Description>" + desc + "</Title>";
371                     xmlTo += "<MusicUrl>" + url + "</MusicUrl>";
372                     if(StringUtils.isNotBlank(mediaId))
373                         xmlTo += "<ThumbMediaId>" + mediaId + "</ThumbMediaId>";
374                     else 
375                         xmlTo += "<ThumbMediaId>" + "查无内容" + "</ThumbMediaId>";
376                     
377                     xmlTo += "</Music> ";
378                     xmlTo += "</xml>";
379                     response.getWriter().write(xmlTo);
380                 }else if ("news".equals(msgType)) {//回复图文
381                     String key = xmlmap.get("Articles");
382                     String xmlTo = "<xml>";
383                     xmlTo += "<ToUserName>" + xmlmap.get("ToUserName") + "</ToUserName>";
384                     xmlTo += "<FromUserName>" + xmlmap.get("FromUserName") + "</FromUserName>";
385                     xmlTo += "<CreateTime>" + xmlmap.get("CreateTime") + "</CreateTime>";
386                     xmlTo += "<MsgType>news</MsgType>";
387                     xmlTo += "<ArticleCount>1</ArticleCount>";
388                     xmlTo += "<Articles>";
389                     xmlTo += "<item>";
390                     String repltSql="select * from  WECHAT_AUTO_KEY where WECHAT_AUTO_KEY.KEY_NAME = ? and WECHAT_AUTO_KEY.COM_ID=? ";
391                     ArrayList parms = new ArrayList();
392                     parms.add(key);
393                     parms.add(comId);
394                     List replylist=utilsService.getDataList(repltSql, parms);
395                     String mediaId="";
396                     String title="";
397                     String desc="";
398                     String url="";
399                     String goUrl="";
400                     if(replylist!=null && replylist.size()>0){
401                          HashMap replyLine = (HashMap)replylist.get(0);
402                          mediaId=(String) replyLine.get("MEDIA_ID");
403                          title=(String) replyLine.get("TITLE");
404                          desc=(String) replyLine.get("DESC");
405                          url=(String) replyLine.get("URL");
406                          goUrl=(String) replyLine.get("GO_URL");
407                     }
408                     xmlTo += "<Title>" + title + "</Title>";
409                     if(StringUtils.isNotBlank(desc))
410                         xmlTo += "<Description>" + desc + "</Description>";
411                     else 
412                         xmlTo += "<Description>" + "查无内容" + "</Description>";
413                     xmlTo += "<PicUrl>" + url + "</PicUrl>";
414                     xmlTo += "<Url>" + goUrl + "</Url>";
415                     xmlTo += "</item> ";
416                     xmlTo += "</Articles> ";
417                     xmlTo += "</xml>";
418                     response.getWriter().write(xmlTo);
419                 }
420             }
421         } catch (Exception e) {
422             log.debug("", e);
423         }
424     }
原文地址:https://www.cnblogs.com/guoziyi/p/5999445.html