微信公众号给指定用户发送消息
1、登陆微信公众平台,在公众号设置--》功能设置,设置网页授权域名
2、将上面的文件MP_verify_TiY7wSZODGYKMF87.txt下载到服务跟目录(我是直接放在代码的webapp目录下)
3、在安全中心设置ip白名单
4、用户同意授权,获取code,(参考链接:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842)
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %> <!DOCTYPE html> <html> <head> <title>获取公众号openId测试</title> </head> <body> <h1>My Web Page</h1> <p id="demo">A Paragraph</p> <input type="button" value="获取openId" onclick="myFunction()" style="width:200px;height:200px;font-size:30px"/><br><br> <a href="/message/assessToken">获取assess_token</a> <script type="text/javascript"> function myFunction() { var userId = 1234;//该值在回调url会传入参数 var appId = "xxxxxxxxx";//你的appId var local = "http://vvakga.xxxxxxxx.cc/test.jsp";// 授权后重定向的回调链接地址, 请使用 urlEncode 对链接进行处理 window.location.href = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + appId + "&redirect_uri=" + encodeURIComponent(local) + "&response_type=code&scope=snsapi_base&state=" + userId + "#wechat_redirect"; } </script> </body> </html>
5、回调url页面,获取code
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %> <!DOCTYPE html> <html> <head> <title>获取公众号openId测试</title> </head> <body onload="myFunction()"> <h1>test Page</h1> <p id="demo">A Paragraph</p> </body> <script> function myFunction() { document.getElementById("demo").innerHTML = window.location.href; var code = GetQueryString("code"); var url = "/message/findOpenId?code=" + code; var httpRequest = new XMLHttpRequest();//第一步:建立所需的对象 httpRequest.open('GET', url, true);//第二步:打开连接 将请求参数写在url中 ps:"./Ptest.php?name=test&nameone=testone" httpRequest.send();//第三步:发送请求 将请求参数写在URL中 /** * 获取数据后的处理程序 */ httpRequest.onreadystatechange = function () { if (httpRequest.readyState == 4 && httpRequest.status == 200) { var json = httpRequest.responseText;//获取到json字符串,还需解析 alert(json); // console.log(json); } }; } function GetQueryString(name) { var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i"); var r = window.location.search.substr(1).match(reg); //获取url中"?"符后的字符串并正则匹配 var context = ""; if (r != null) context = r[2]; reg = null; r = null; return context == null || context == "" || context == "undefined" ? "" : context; } </script> </html>
6、后端获取用户的openId
/** * 获取用户的openId * @param code 编码 * @return */ @ResponseBody @RequestMapping("/findOpenId") public WebResponse findOpenId(String code) { logger.info("----->>>>code:"+code); Map<String,String> params=new HashMap<>(); params.put("appId", Config.WEIXIN_APPID); params.put("secret",Config.WEIXIN_SECRET); params.put("code",code); params.put("grant_type","authorization_code"); String url=" https://api.weixin.qq.com/sns/oauth2/access_token"; String res=HttpServiceUtil.URLGet(url,params,"utf-8"); logger.info("-------->>>>res:"+res); Map<String,Object> map= JsonUtil.toMap(res); if(map.containsKey("openid")){ //将获得的用户openId存入数据表中 //后期会将openId与用户id进行关联,然后就可以对指定用户发送消息了 return WebResponse.resSuccess("获取openId成功",map.get("openid")); }else if(map.containsKey("ermsg")){ return WebResponse.resFail("获取openId失败",map.get("errmsg")); }else { return WebResponse.resFail("获取openId失败",map); } }
7、发送消息,参考链接:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140547
/*** * 客服接口-发消息 */ @ResponseBody @RequestMapping("/send") public Object send(String openId,String content) { String accessToken=getAssessToken(); Map<String,Object> data=new HashMap<>(); data.put("content",content); Map<String,Object> params=new HashMap<>(); params.put("touser",openId); params.put("msgtype","text"); params.put("text",data); logger.info("-------------------->>>>请求参数"+JsonUtil.toJsonString(params)); String url="https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token="+accessToken; try{ String res=HttpServiceUtil.AbsoluteURLPostForJson(url,JsonUtil.toJsonString(params)); logger.info("-------->>>>res:"+res); return WebResponse.resFail("请求成功",res); }catch (IOException e){ e.printStackTrace(); return WebResponse.resFail("请求失败",null); } } /** * 获取assess_token */ @ResponseBody @RequestMapping("/assessToken") public Object assessToken() { return requestAssessToken(); } private String requestAssessToken(){ Map<String,String> params=new HashMap<>(); params.put("appId", Config.WEIXIN_APPID); params.put("secret",Config.WEIXIN_SECRET); params.put("grant_type","client_credential"); String url="https://api.weixin.qq.com/cgi-bin/token"; String res=HttpServiceUtil.URLGet(url,params,"utf-8"); logger.info("-------->>>>res:"+res); return res; } private String getAssessToken(){ String res=requestAssessToken(); if(StringUtil.isEmptyOrNull(res))return null; Map map=JsonUtil.toMap(res); if(map.containsKey("access_token")){ return map.get("access_token").toString(); }else { return null; } }