这里记录自己爬过的微信坑。。。。
切记切记,开发之前一定仔细看官方文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842
我这里使用的是微信公众号-测试账号,比如微信端用户确认的页面没有出来(可能是测试号必须关注,但是关注的话确认页面就出不来。。。。),但是用户信息已经获取到了。。。。
做了以后发现OAuth2.0网页授权其实很简单的,废话少说,直接上代码了:
第一步:用户触发认证地址,我这里设置到了菜单里:
菜单中的设置:
CommonButton btn21 = new CommonButton();
btn21.setName("更多体验");
btn21.setType("view");
btn21.setUrl("http://1.1.1.1/wechatServer/auth");
以上只是为了触发。。。
第二步:用户同意授权,获取code
@RequestMapping(value = "/auth")
@ResponseBody
public void GuideServlet(HttpServletRequest request,HttpServletResponse response) throws Exception {
// 设置编码
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
response.setCharacterEncoding("utf-8");
/**
* 第一步:用户同意授权,获取code:https://open.weixin.qq.com/connect/oauth2/authorize
* ?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE
* &state=STATE#wechat_redirect
*/
String redirect_uri = URLEncoder.encode(
"http://1.1.1.1/wechatServer/login", "UTF-8");// 授权后重定向的回调链接地址,请使用urlencode对链接进行处理(文档要求)
// 按照文档要求拼接访问地址
String url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid="
+ GlobalParams.APPID
+ "&redirect_uri="
+ redirect_uri
+ "&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect";
response.sendRedirect(url);// 跳转到要访问的地址
}
第三步:根据code获取access_token,根据access_token获取用户信息
@ResponseBody
@RequestMapping(value = "/login")
public ModelAndView login(HttpServletRequest request) throws JSONException, IOException{
String code = request.getParameter("code");
System.out.println("终于获取到CODE了:"+code);
/**
* 第三步:通过code换取网页授权access_token
*/
// 同意授权
if (code != null) {
// 拼接请求地址
String url = "https://api.weixin.qq.com/sns/oauth2/access_token?"
+ "appid=" + GlobalParams.APPID + "&secret="
+ GlobalParams.APPSECRET
+ "&code=" + code
+ "&grant_type=authorization_code";
JSONObject json =ReadUrlUtil.readJsonFromUrl(url, "");// 拿去返回值
System.out.println("返回信息:"+json);
AutoWebParams autoWebParams = (AutoWebParams) JSONObject.toBean(json, AutoWebParams.class);
/**
* 第四步:拉取用户信息(需scope为 snsapi_userinfo)001MeAlp01IRjp1LlKkp0zPLlp0MeAl-
*/
String url3 = "https://api.weixin.qq.com/sns/userinfo?access_token="
+ autoWebParams.getAccess_token()
+ "&openid="
+ autoWebParams.getOpenid() + "&lang=zh_CN";
JSONObject json1 =ReadUrlUtil.readJsonFromUrl(url3, "");// 拿去返回值
// UserInfo userInfo = (UserInfo) JSONObject.toBean(json1, UserInfo.class);
// System.out.println("用户信息:"+userInfo.toString());
System.out.println("用户信息:"+json1);
}
每一步的内容其实都是按照官方文档里面的步骤,挨个设置参数,然后获取请求得到返回结果。。。。。
最后需要设置接口权限表中的网页授权获取用户基本信息:
这里一定注意:地址不可以以http://开头,必须包含回调地址(虽然这里写的是设置回调地址....这个坑爬了好几天),例如我的回调地址是:http://1.1.1.1/wechatServer/login,设置的地址应该是:1.1.1.1 或 1.1.1.1/wechatServer/
最后获取到的用户信息: