package cn.ksource.web.controller.wechat; import java.io.File; import java.io.IOException; import java.net.URLEncoder; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.servlet.ModelAndView; import cn.ksource.beans.GG_MESSAGE; import cn.ksource.core.util.ConvertUtil; import cn.ksource.core.util.DateUtil; import cn.ksource.core.util.DownloadUtil; import cn.ksource.core.util.HttpCharset; import cn.ksource.core.util.HttpUtil; import cn.ksource.core.util.JsonUtil; import cn.ksource.core.util.ParamsMapUtil; import cn.ksource.core.util.StringUtil; import cn.ksource.core.web.WebUtil; import cn.ksource.core.weixin.service.WeiXinCoreService; import cn.ksource.web.Constants; import cn.ksource.web.SysConstants; import cn.ksource.web.controller.wechat.response.RspTextMessage; import cn.ksource.web.controller.wechat.util.MessageUtil; import cn.ksource.web.controller.wechat.util.SignUtil; import cn.ksource.web.controller.wechat.util.WechatConstants; import cn.ksource.web.facade.JsglFacade; import cn.ksource.web.facade.cfg.CfgFacade; import cn.ksource.web.facade.file.FileFacade; import cn.ksource.web.facade.wechat.WechatFacade; import cn.ksource.web.service.wechat.WechatService; /** * 微信公众平台开发 * @author jxl */ @Controller @RequestMapping("/wechat") public class WechatController { @Resource(name="wechatFacade") private WechatFacade wechatFacade; @Resource(name="wechatService") private WechatService wechatService; @Autowired private WeiXinCoreService weiXinCoreService; @Autowired private JsglFacade jsglFacade; @Autowired private CfgFacade cfgFacade; /** * 执行微信的服务器的doGet请求,确认请求来自微信服务器 */ @RequestMapping(value="index.html",method=RequestMethod.GET) public void index(HttpServletRequest request,HttpServletResponse response) { //微信加密签名 String signature = request.getParameter("signature"); // 时间戳 String timestamp = request.getParameter("timestamp"); // 随机数 String nonce = request.getParameter("nonce"); // 随机字符串 String echostr = request.getParameter("echostr"); // 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败 if (SignUtil.checkSignature(signature, timestamp, nonce)) { WebUtil.write(response, echostr); } } /** * 执行微信的post请求 */ @RequestMapping(value="index.html",method=RequestMethod.POST) public void indexPost(HttpServletRequest request,HttpServletResponse response) throws Exception { System.out.println("enter doPost method ========================"); // 将请求、响应的编码均设置为UTF-8(防止中文乱码) request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); //调用核心业务类接收消息、处理消息 String respContent = "欢迎来到微信公众平台!"; // xml请求解析 Map requestMap = MessageUtil.parseXml(request); // 发送方帐号(open_id) String fromUserName = requestMap.get("FromUserName"); System.out.println("formUserName----------------->"+fromUserName); // 公众帐号 String toUserName = requestMap.get("ToUserName"); // 消息类型 String msgType = requestMap.get("MsgType"); if(msgType.equals(MessageUtil.RESP_MESSAGE_TYPE_TEXT)) { String msgContent = requestMap.get("Content"); System.out.println("msgContent---------------------->"+msgContent); if(msgContent.equals(WechatConstants.GGSBD)) { //工程师绑定 //判断该工程师是否已经执行过绑定操作 boolean hasBind = wechatFacade.queryEngineerHasBind(fromUserName); System.out.println("hasBind============="+hasBind); if(hasBind) { respContent = "您已绑定过账号,点击解除绑定"; } else { //respContent = "您未绑定该账号,请点击立即绑定"; respContent = "您未绑定该账号,请点击立即绑定"; } } else if(msgContent.equals(WechatConstants.USER)) { respContent = "用户登录,请点击登录"; } else if(msgContent.substring(0,2).equalsIgnoreCase(WechatConstants.ZSK)) { //respContent = wechatFacade.queryZsk(request,msgContent); } } else if(msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_EVENT)) { String eventKey = requestMap.get("EventKey"); System.out.println("eventKey---------------->"+eventKey); if(StringUtil.notEmpty(eventKey)) { if(eventKey.equals(WechatConstants.BX)) { //查询用户是否已经绑定过账号,如果已经绑定过,则直接报修,否则跳转到用户绑定页面 //respContent = wechatFacade.doRepair(fromUserName); } else if (eventKey.equals(WechatConstants.LINK_US)) { respContent = "联系电话:400-633-7959\n产品官网:http://www.larks.com.cn"; } } } // 回复文本消息 RspTextMessage textMessage = new RspTextMessage(); textMessage.setToUserName(fromUserName); textMessage.setFromUserName(toUserName); textMessage.setCreateTime(new Date().getTime()); textMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_TEXT); textMessage.setContent(respContent); System.out.println("公众号响应微信用户的信息:"); String respMessage = MessageUtil.textMessageToXml(textMessage); System.out.println(respMessage); // 响应消息 WebUtil.write(response, respMessage); } /** * 点击微运维跳转,如果用户已经绑定过工程师账号或者已经绑定过客户账号, * 则跳转到工程师首页面或者客户首页面, * 否则跳转到用户类型选择页面,执行相应的绑定操作 */ @RequestMapping("wywType.html") public ModelAndView wywType(HttpServletRequest request,HttpServletResponse response) { ModelAndView modelAndView = new ModelAndView(); String code = request.getParameter("code"); System.out.println("code---------------------------"+code); String url = WechatConstants.CODE_GET_TOKEN.replace("CODE", code); String valString = HttpUtil.doGet(url, new HashMap(), HttpCharset.UTF8); Map map = JsonUtil.json2Map(valString); String openId = ConvertUtil.obj2StrBlank(map.get("openid")); // String openId = "123456"; //String openId = "fwt"; //判断openId是否已经绑定过工程师信息 if(StringUtil.isNotBlank(openId)){ String result = wechatFacade.queryGcsBind(request,openId); if(result.equals("1")) { //判断用户桌面类型 String jumpUrl = Constants.getWxDeskTopUrl(Constants.ROLE_FLINE); List roles = jsglFacade.getRolesByUserId(WebUtil.getEngineerUserId(request), 1); if(roles.size()==1){ String identify = ConvertUtil.obj2StrBlank(roles.get(0).get("identify")); if (StringUtil.isNotBlank(identify)) { jumpUrl = Constants.getWxDeskTopUrl(identify); } } request.getSession().setAttribute("homePage", jumpUrl); //System.out.println("jumpUrl------------------->"+jumpUrl+"------------>"+deskType); return new ModelAndView("redirect:"+jumpUrl); } //判断openId是否已经绑定过用户信息 String userResult = wechatFacade.queryCustomerBind(request,openId); if(userResult.equals("1")) { return new ModelAndView("redirect:/uwyw/uhome.html"); } } modelAndView.setViewName("/business/wechat/wywType"); modelAndView.addObject("openId", openId); return modelAndView; } /** * 跳转到工程师绑定页面 */ /*@RequestMapping("engineerBind.html") public ModelAndView engineerBind(HttpServletRequest request,HttpServletResponse response) { ModelAndView modelAndView = new ModelAndView("/business/wechat/engineerBind"); return modelAndView; }*/ @RequestMapping("engineerBind.html") public ModelAndView engineerBind(HttpServletRequest request,HttpServletResponse response) { ModelAndView modelAndView = new ModelAndView("/business/wechat/engineerBind"); String jsapi_ticket = weiXinCoreService.getJsApiTicket(); System.out.println("jsapi_ticket------------>"+jsapi_ticket); String requestUrl = request.getRequestURI(); String queryString = request.getQueryString(); String url = new String(); if(StringUtil.notEmpty(queryString)) { url = requestUrl.toString()+"?"+queryString; } else { url = requestUrl.toString(); } url = WechatConstants.BASE_ADDRESS + url; System.out.println("url---------->"+url); //获取jsApiTicket的签名 Map signParam = SignUtil.sign(jsapi_ticket, url); modelAndView.addObject("signParam",signParam); modelAndView.addObject("appId", WechatConstants.appID); return modelAndView; } /** * 执行工程师绑定操作 */ @RequestMapping("doEngineerBind.html") public void doEngineerBind(HttpServletRequest request,HttpServletResponse response) { String result = wechatFacade.updateEngineerOpenId(request); String url = new String(); String ciId = ConvertUtil.obj2StrBlank(request.getSession().getAttribute("ciId")); if(StringUtil.notEmpty(ciId)) { url = "/ewyw/ewconfig/econfigInfo.html?id="+ciId; request.getSession().removeAttribute("ciId"); }else { if(result.equals("1")) { url = WebUtil.getEngineerDeskType(request); } } Map resultMap = new HashMap(); resultMap.put("flag", result); resultMap.put("url", url); WebUtil.write(response, JsonUtil.map2Json(resultMap)); } /** * 跳转到工程师解除绑定页面 */ @RequestMapping("engineerUnbind.html") public ModelAndView engineerUnbind(HttpServletRequest request,HttpServletResponse response) { ModelAndView modelAndView = new ModelAndView("/business/wechat/engineerUnbind"); String jsapi_ticket = weiXinCoreService.getJsApiTicket(); StringBuffer requestURL = request.getRequestURL(); String queryString = request.getQueryString(); String url = new String(); if(StringUtil.notEmpty(queryString)) { url = requestURL.toString()+"?"+queryString; } else { url = requestURL.toString(); } //获取jsApiTicket的签名 Map signParam = SignUtil.sign(jsapi_ticket, url); modelAndView.addObject("signParam",signParam); return modelAndView; } /** * 执行工程师解除绑定操作 */ @RequestMapping("doEngineerUnbind.html") public void doEngineerUnbind(HttpServletRequest request,HttpServletResponse response) { String result = wechatFacade.updateEngineerUnBindOpenId(request); WebUtil.write(response, result); } /** * 发送模板消息 */ @RequestMapping("sendTemplateMsg.html") public void sendTemplateMsg(HttpServletRequest request,HttpServletResponse response) { wechatService.sendTemplateMsg(new String[]{"oKOyDtx1DmObD8hDfIhAqs46TDbM"},"e8c17ff9df6a4e0bae475f6fcfd85147", "2","江小磊","测试报账工单", "测试报账工单"); } /** * 发送催办消息 */ @RequestMapping("sendReminderMsg") public void sendReminderMsg(HttpServletRequest request,HttpServletResponse response) { wechatService.sendReminderTemplateMsg(new String[]{"oKOyDtx1DmObD8hDfIhAqs46TDbM"},"e8c17ff9df6a4e0bae475f6fcfd85147","2","这是催办事项标题", "这是催办事项具体内容", "这是催办人","这是催办消息的备注"); } /** * 测试发送系统消息 */ @RequestMapping("sendSysMsg.html") public void sendSysMsg(HttpServletRequest request) { GG_MESSAGE message = new GG_MESSAGE(); message.setContent("测试内容"); message.setTitle("测试标题"); message.setSend_time(DateUtil.getCurrentDate14()); message.setSender_name("testuser"); message.setWx_url("http://www.baidu.com"); message.setWeb_url("http://www.baidu.com"); wechatService.sendSysMsg(new String[]{"oKOyDtx1DmObD8hDfIhAqs46TDbM"}, message); } /** * 测试绑定通知消息 */ @RequestMapping("testBind.html") public void testBind(HttpServletRequest request,HttpServletResponse response) { //如果绑定成功,提醒微信绑定成功通知 wechatService.bindingNotice("ou0vYt5mLwOCe8lIM0R1tykonCHM","http://www.baidu.com","wxh","liuzhengyu","测试开通功能","测试备注"); } /** * 微信测试登录页面 */ @RequestMapping(value="testwywLogin.html", method=RequestMethod.GET) public ModelAndView testwywLogin(HttpServletRequest request,HttpServletResponse response) { ModelAndView modelAndView = new ModelAndView("/business/wechat/testwywLogin"); return modelAndView; } /** * 微信测试登录页面 */ @RequestMapping(value="testwywLogin.html", method=RequestMethod.POST) public void testwywLoginSubmit(HttpServletRequest request,HttpServletResponse response) { String result = wechatFacade.checkLoginMsg(request); WebUtil.write(response, result); } /** * 跳转到用户绑定页面 */ @RequestMapping("customerBind.html") public ModelAndView customerBind(HttpServletRequest request,HttpServletResponse response) { ModelAndView modelAndView = new ModelAndView(); String openId = request.getParameter("openId"); System.out.println("openid------------->"+openId); String result = wechatFacade.queryCustomerBind(request,openId); if(result.equals("1")) { return new ModelAndView("redirect:/uwyw/uhome.html"); } else { modelAndView.setViewName("/business/wechat/customerBind"); modelAndView.addObject("openId", openId); } return modelAndView; } /** * 跳转到用户绑定页面 */ @RequestMapping("userBind.html") public ModelAndView userBind(HttpServletRequest request,HttpServletResponse response) { ModelAndView modelAndView = new ModelAndView("/business/wechat/customerBind"); String openId = request.getParameter("openId"); modelAndView.addObject("openId", openId); return modelAndView; } /** * 执行用户绑定操作 */ @RequestMapping("doCustomerBind.html") public void doCustomerBind(HttpServletRequest request,HttpServletResponse response) { String result = wechatFacade.updateCustomerBindOpenId(request); WebUtil.write(response, result); } /** * 跳转到用户解除绑定页面 */ @RequestMapping("customerUnbind.html") public ModelAndView customerUnbind(HttpServletRequest request,HttpServletResponse response) { ModelAndView modelAndView = new ModelAndView("/business/wechat/customerUnbind"); /*String jsapi_ticket = weiXinCoreService.getJsApiTicket(); StringBuffer requestURL = request.getRequestURL(); String queryString = request.getQueryString(); String url = new String(); if(StringUtil.notEmpty(queryString)) { url = requestURL.toString()+"?"+queryString; } else { url = requestURL.toString(); } //获取jsApiTicket的签名 Map signParam = SignUtil.sign(jsapi_ticket, url); modelAndView.addObject("signParam",signParam);*/ return modelAndView; } /** * 执行用户解除绑定操作 */ @RequestMapping("doCustomerUnbind.html") public void doCustomerUnbind(HttpServletRequest request,HttpServletResponse response) { System.out.println("解除绑定-------------------"); String result = wechatFacade.updateCustomerUnBindOpenId(request); WebUtil.write(response, result); } /** * 微运维链接 */ @RequestMapping("wyw.html") public ModelAndView wyw(HttpServletRequest request,HttpServletResponse response) { ModelAndView modelAndView = new ModelAndView("redirect:"+WechatConstants.SQ_REBACK); return modelAndView; } /** * 测试发送消息 */ @RequestMapping("sendMsg.html") public void sendMsg(HttpServletRequest request) { GG_MESSAGE message = new GG_MESSAGE(); message.setContent("测试内容"); message.setSend_time(DateUtil.getCurrentDate14()); message.setSender_name("jiangxiaolei"); message.setWx_url("http://www.baidu.com"); message.setTitle("测试消息"); wechatService.sendSysMsg(new String[]{"oKOyDt9RluzdluTQU-xljU2H3EzI","oKOyDtx1DmObD8hDfIhAqs46TDbM"}, message); } /** * 测试 */ @RequestMapping("page.html") public ModelAndView page(HttpServletRequest request,HttpServletResponse response) throws Exception { System.out.println("enter-------------->page"); String SQ_BACK_URL = WechatConstants.BASE_ADDRESS+"/wechat/testGz.html"; String url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid="+WechatConstants.appID+"&redirect_uri="+URLEncoder.encode(SQ_BACK_URL,"UTF-8")+"&response_type=code&scope=snsapi_base&state=123#wechat_redirect"; System.out.println("enter-------------->page1"); ModelAndView modelAndView = new ModelAndView("redirect:"+url); System.out.println("enter-------------->page2"); return modelAndView; } @RequestMapping("testknow.html") public void testKnow(HttpServletRequest request,HttpServletResponse response) { String content = ""; //wechatFacade.queryZsk(request,"z@鼠标"); WebUtil.write(response, content); } @RequestMapping("testGz.html") public ModelAndView testGz(HttpServletRequest request,HttpServletResponse response) { System.out.println("----------------->enter testGz.html"); String code = request.getParameter("code"); System.out.println("---->code---------->"+code); String url = WechatConstants.CODE_GET_TOKEN.replace("CODE", code); String valString = HttpUtil.doGet(url, new HashMap(), HttpCharset.UTF8); Map map = JsonUtil.json2Map(valString); String openId = ConvertUtil.obj2StrBlank(map.get("openid")); System.out.println("openid------------->"+openId); if(StringUtil.notEmpty(openId)) { //通过openId 获取 Map userBaseMap = wechatService.queryUserBaseMsgByOpenId(openId); System.out.println("subscribe----------------->"+ConvertUtil.obj2StrBlank(userBaseMap.get("subscribe"))); System.out.println("msg----------------------->"+JsonUtil.map2Json(userBaseMap)); } ModelAndView modelAndView = new ModelAndView("redirect:http://mp.weixin.qq.com/s?__biz=MzA3ODg3NjIwMA==&mid=203995057&idx=1&sn=7a2cce78d23c95184f3076320feb161e#rd"); return modelAndView; } public static void main(String[] args) { String url = WechatConstants.SQ_REBACK; System.out.println(url); } /*------客户端登陆之前---------*/ /** * 跳转到获取ime的页面 * */ /* @RequestMapping("clientLoginBefore.html") public ModelAndView clientLoginBefore(HttpServletRequest request){ return new ModelAndView("/business/wechat/client/clientLoginBefore"); }*/ /*------客户端嵌入登录---start---*/ /** * 点击微运维跳转,如果用户已经绑定过工程师账号或者已经绑定过客户账号, * 则跳转到工程师首页面或者客户首页面, * 否则跳转到用户类型选择页面,执行相应的绑定操作 */ @RequestMapping("clientWywType.html") public ModelAndView clientwywType(HttpServletRequest request,HttpServletResponse response) { String ime = request.getParameter("ime"); System.out.println(ime); ModelAndView modelAndView = new ModelAndView(); if(StringUtil.isNotBlank(ime)){ //判断当前手机ime是否绑定工程师信息 String engResult = wechatFacade.queryEmgIme(request, ime); if(engResult.equals("1")){ //判断用户桌面类型 String jumpUrl = Constants.getWxDeskTopUrl(Constants.ROLE_FLINE); List roles = jsglFacade.getRolesByUserId(WebUtil.getEngineerUserId(request), 1); if(roles.size()==1){ String identify = ConvertUtil.obj2StrBlank(roles.get(0).get("identify")); if (StringUtil.isNotBlank(identify)) { jumpUrl = Constants.getWxDeskTopUrl(identify); } } request.getSession().setAttribute("homePage", jumpUrl); System.out.println("jumpUrl------------------->"+jumpUrl+"------------>"); return new ModelAndView("redirect:"+jumpUrl); } String userResult = wechatFacade.queryUserIme(request, ime); if(userResult.equals("1")){ return new ModelAndView("redirect:/uwyw/uhome.html"); } } modelAndView.setViewName("/business/wechat/client/clientWywType"); return modelAndView; } /** * 跳转到工程师绑定页面 */ @RequestMapping("clientEngineerBind.html") public ModelAndView clientEngineerBind(HttpServletRequest request,HttpServletResponse response) { ModelAndView modelAndView = new ModelAndView("/business/wechat/client/clientEngineerBind"); wechatFacade.deleteClientEngineer(request); HttpSession session = request.getSession(); session.removeAttribute(SysConstants.WYW_ENGINEER_LOGIN_INFO_KEY); session.removeAttribute("homePage"); session.removeAttribute("isclient"); session.invalidate(); return modelAndView; } /** * 跳转到用户绑定页面 */ @RequestMapping("clientCustomerBind.html") public ModelAndView clientCustomerBind(HttpServletRequest request,HttpServletResponse response) { ModelAndView modelAndView = new ModelAndView(); wechatFacade.deleteClientCustomer(request); HttpSession session = request.getSession(); session.removeAttribute(SysConstants.WYW_LOGIN_INFO_KEY); session.removeAttribute("isclient"); session.invalidate(); modelAndView.setViewName("/business/wechat/client/clientCustomerBind"); return modelAndView; } /** * 执行工程师绑定操作 */ @RequestMapping("doClientEngineerBind.html") public void doClientEngineerBind(HttpServletRequest request,HttpServletResponse response) { String result = wechatFacade.updateClientEngineer(request); String url = new String(); if(result.equals("1")) { url = WebUtil.getEngineerDeskType(request); } Map resultMap = new HashMap(); resultMap.put("flag", result); resultMap.put("url", url); WebUtil.write(response, JsonUtil.map2Json(resultMap)); } /** * 执行用户绑定操作 */ @RequestMapping("doClientCustomerBind.html") public void doClientCustomerBind(HttpServletRequest request,HttpServletResponse response) { String result = wechatFacade.updateClientCustomer(request); WebUtil.write(response, result); } /** * 跳转到session中转页面 */ @RequestMapping("clientTemp.html") public ModelAndView clientTemp(HttpServletRequest request,HttpServletResponse response) { ModelAndView modelAndView = new ModelAndView(); modelAndView.setViewName("/business/wechat/clientTemp"); String user = request.getParameter("user"); modelAndView.addObject("url", WechatConstants.SQ_REBACK); modelAndView.addObject("user", user); return modelAndView; } /** * 微信扫码跳转详情 */ @RequestMapping("cfgInfo.html") public ModelAndView cfgInfo(HttpServletRequest request) { String ciId = request.getParameter("id"); Map engineer = WebUtil.getEngineerMsg(request); if(null!=engineer && engineer.size()>0) { ModelAndView modelAndView = new ModelAndView("redirect:/ewyw/ewconfig/econfigInfo.html?id="+ciId); return modelAndView; } Map user = WebUtil.getWywLoginUser(request); if(null!=user && user.size()>0) { ModelAndView modelAndView = new ModelAndView("redirect:/uwyw/uconfig/uconfigInfo.html?id="+ciId); return modelAndView; } request.getSession().setAttribute("ciId", ciId); ModelAndView modelAndView = new ModelAndView("redirect:"+WechatConstants.SQ_REBACK); return modelAndView; } @Autowired private FileFacade fileFacade; /** * 文件下载 */ @RequestMapping("download.html") public void download(HttpServletRequest request,HttpServletResponse response) { String fileId = request.getParameter("fileId"); Map fileMsg = fileFacade.queryFileMsg(fileId); if(null!=fileMsg && fileMsg.size()>0) { String fileName = ConvertUtil.obj2StrBlank(fileMsg.get("FILE_NAME")); String filePath = ConvertUtil.obj2StrBlank(fileMsg.get("FILE_PATH")); String basePath = request.getSession().getServletContext().getRealPath(""); File file = new File(basePath+filePath); try { DownloadUtil.download(response, file, fileName, false); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } @RequestMapping("sysversion.html") public void sysversion(HttpServletRequest request,HttpServletResponse response) { Map version = wechatFacade.getVersion(); WebUtil.write(response, JsonUtil.map2Json(version)); } /** * 设备详情 * @param request * @return */ @RequestMapping("facDetail") public ModelAndView facDetail(HttpServletRequest request){ ModelAndView view=new ModelAndView("/business/wechat/facDetail"); String id = request.getParameter("id"); Map info= cfgFacade.getCfgById(id); view.addObject("info", info); return view; } /** * 一键报修页面 * @param request * @return */ @RequestMapping("facBx.html") public ModelAndView ucYjbx(HttpServletRequest request) { ModelAndView modelAndView = new ModelAndView("/business/wechat/facBx"); String id = request.getParameter("id"); Map info= cfgFacade.getCfgById(id); modelAndView.addObject("info", info); return modelAndView; } @RequestMapping("saveFacBx.html") public void saveFacBx(HttpServletRequest request,HttpServletResponse response){ Map params=ParamsMapUtil.getParameterMap(request); wechatFacade.saveFacBx(params); WebUtil.write(response, "1"); } }