1、首先修改微信授权接口下的JS回调域名,要求全域名并且不带http,目录下的所有文件均可进行授权,然后将txt密钥放入域名根目录下
2、这里是微信公众号的文档说明:
1、引导用户进入授权页面同意授权,获取code
2、通过code换取网页授权access_token(与基础支持中的access_token不同)
3、如果需要,开发者可以刷新网页授权access_token,避免过期
4、通过网页授权access_token和openid获取用户基本信息(支持UnionID机制)
2 第二步:通过code换取网页授权access_token
4 第四步:拉取用户信息(需scope为 snsapi_userinfo)
3、具体流程,第一步,引入用户进入授权页面
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String backUrl = "http://你的域名/项目名/接口方法路径";
String url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid="+APPID
+"&redirect_uri="+backUrl//请求成功后返回code,用来接受code的方法路径
+"&response_type=code"//固定code
+"&scope=snsapi_userinfo"//snsapi_userinfo和snsapi_base都可以
+"&state=STATE#wechat_redirect"; //固定STATE#wechat_redirect
resp.sendRedirect(url);
}
这里的参数说明,直接用微信公众开发文档的,很明确:
4、上一步请求成功后,微信后台会返回一个code参数给服务器的回调地址,就是上面的backUrl,在这里接受一下code参数再向服务器发起请求,用code换取access_token,这里的access_token,与微信调用接口的access_token不同,这里access_token没有次数限制,另一个每日调用次数100000次,然后发起Get请求,获得access_token,openid,再用两个参数Get请求得到用户信息,这里返回的数据都是JSON格式的字符串,需要转换。没有用urlEncode依旧可以用,不太懂。
String urlStr = java.net.URLEncoder.encode("钱钱钱钱","GBK"); //javaAPI自带
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String code = req.getParameter("code");
String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="+APPID
+"&secret="+APPSECRET
+"&code="+code
+"&grant_type=authorization_code";
JSONObject jsonObject = AuthUtil.doGetJson(url);//这里发起httpget请求,需要http相关jar包和json相关jar包
String openid = jsonObject.optString("openid");
String access_token = jsonObject.optString("access_token");
String userInfoUrl = "https://api.weixin.qq.com/sns/userinfo?access_token="+access_token
+"&openid="+openid
+ "&lang=zh_CN";
JSONObject userInfo= AuthUtil.doGetJson(userInfoUrl);
String imgurl =userInfo.optString("headimgurl");
System.out.println(userInfo);
System.out.println(imgurl);
}
public static JSONObject doGetJson(String url) throws ClientProtocolException, IOException{
JSONObject jsonObject = null;
DefaultHttpClient client = new DefaultHttpClient();
HttpGet get = new HttpGet(url);
HttpResponse response = client.execute(get);
HttpEntity entity = response.getEntity();
if(entity!=null){
String result = EntityUtils.toString(entity, "UTF-8");
jsonObject = JSONObject.fromObject(result);
}
get.releaseConnection();
return jsonObject;
}
然后就可以获得用户的信息了,亲测可用,就是遇到一个问题,上面接受code方法需要继承httpservlet的doGet方法,但是对获取code发起请求可不可以不用doGet?
最近在整理一些资源工具,放在网站分享 http://tools.maqway.com
欢迎关注公众号:麻雀唯伊 , 不定时更新资源文章,生活优惠,或许有你想看的