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 }