微信公众号给指定用户发送消息

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;
        }
    }

  

  

  

posted @ 2019-05-30 14:59  争鸣  阅读(789)  评论(0)    收藏  举报