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