java后台接收微信服务号/订阅号消息
1.申请订阅号(适合个人)或者服务号(适合企业)
微信公众平台
2.填写配置
服务器地址: 需要接收消息 的服务端接口地址
令牌:通话识别码,随便写,后端接收时,使用一样的就可以了。
消息加密秘钥 :(目前不用)
提交这些配置信息,就能与后端通讯了,这个项目使用的是SSM框架,springboot项目做的后端接收。
注:
因为项目在本地测试,需要用到内网穿透相关。
这里就不一一叙述了这里有教程,不懂可以问我。QQ:794171011
实现的效果 : 接收到 用户给公众号发送的消息,并处理。
有图有真相
我这里的功能比较简单只是过滤消息中的 链接
附上代码:
1 @Controller 2 @RequestMapping("/wecha") 3 public class WeChaturlController extends BaseController { 4 5 private final static Logger logger = Logger.getLogger(WeChaturlController.class.getName()); 6 7 @Resource 8 private INewsCommentService newsCommentService; 9 @Resource 10 private IReviewNewsService reviewNewsService; 11 @Resource 12 protected IWaitParseDao waitParseDao; 13 14 public static String BIND_TOKEN = "CX_TEST"; 15 private static SAXReader saxReader = new SAXReader(); 16 17 /** 18 * 消息接收端 19 * @param response 20 * @param request 21 */ 22 @RequestMapping(value = "/get") 23 public void msgIn(HttpServletResponse response, HttpServletRequest request) { 24 if ("GET".equals(request.getMethod())) { 25 bindMsg(response, request); 26 } else if ("POST".equals(request.getMethod())) { 27 if (WxBaseCheck.checkSignature(request, BIND_TOKEN)) { 28 handleMsgIn(response, request); 29 } else { 30 logger.warn("消息验证失败,来源不是微信!"); 31 } 32 } 33 } 34 35 /** 36 * 腾讯通过GET请求进行绑定 37 * @param response 38 * @param request 39 */ 40 public void bindMsg(HttpServletResponse response, HttpServletRequest request) { 41 try { 42 String echostr = request.getParameter("echostr"); 43 // System.out.println(WxBaseCheck.checkSignature(request, 44 // BIND_TOKEN)); 45 if (WxBaseCheck.checkSignature(request, BIND_TOKEN)) { 46 logger.warn("公众平台与本系统成功绑定!可以开始通信~~~"); 47 response.getWriter().write(echostr); 48 } else { 49 response.getWriter().write(""); 50 } 51 } catch (IOException e) { 52 logger.warn("绑定URL时:" + e.getMessage()); 53 e.printStackTrace(); 54 } 55 } 56 57 /** 58 * 处理腾讯服务器发送过来的消息 59 * @param response 60 * @param request 61 */ 62 public void handleMsgIn(HttpServletResponse response, HttpServletRequest request) { 63 try { 64 // 使用response的时候必须要设置响应头,不然会乱码~~~ 65 response.setHeader("Content-type", "text/xml;charset=UTF-8"); 66 // 从request中取得输入流 67 // 读取输入流 68 Document document = saxReader.read(request.getInputStream()); 69 // 得到xml根元素 70 Element element = document.getRootElement(); 71 // System.out.println("接口接受xml:"+element.asXML()); 72 // 将解析结果存储在HashMap中 73 Map<String, String> msgMap = XmlHandler.xmlToMap(element); 74 String text = msgMap.get("Content"); 75 System.out.println("微信收到消息:" + text); 76 Pattern pattern = GetUrl.WEB_URL; 77 Matcher matcher = pattern.matcher(text); 78 if (matcher.find()) { 79 // 取字符串中的链接,链接结尾必须有空格 必须有http 或 https开头 80 // System.out.println(matcher.group()); 81 if (new BrandUrlUtil().isBrandUrl(matcher.group())) { 82 // 链接初始化入库 83 this.newsCommentService.initNews(matcher.group()); 84 } else { 85 // 链接 未收录 86 // WaitParse waitParse = new WaitParse(); 87 // waitParse.setUrl(matcher.group()); 88 // waitParse.setInfoType(0); 89 // WaitParse dbWaitParse = this.waitParseDao.getWaitParse(waitParse); 90 // if (dbWaitParse == null) { 91 // waitParse.setCreateTime(new Date()); 92 // this.waitParseDao.insertWaitParse(waitParse); 93 // } 94 logger.warn("微信公众号收到的链接,系统未收录[" + matcher.group() + "]"); 95 } 96 } else { 97 // 其他消息 不包含链接 98 } 99 100 } catch (Exception e) { 101 logger.warn("微信收录链接时:" + e.toString()); 102 } 103 } 104 105 }
提莫队长