一、须要有一个公众号,拿到AppID和AppSecret;html
二、进入公众号开发者中心页配置受权回调域名。具体位置:接口权限-网页服务-网页帐号-网页受权获取用户基本信息-修改注意,这里仅需填写全域名(如www.qq.com、www.baidu.com),勿加 http:// 等协议头及具体的地址字段; 这个域名须要是一个备案过的域名。git
一、引导用户进入受权页面赞成受权,获取code ;json
二、经过code换取网页受权access_token(与基础支持中的access_token不一样) ;api
三、经过网页受权access_token和openid获取用户基本信息。服务器
1.生成二维码的受权二维码(getQrCodeServlet的doPost方法),引导用户进入受权页面赞成受权,获取code;微信
protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException { PrintWriter out = response.getWriter(); //生成惟一ID int uuid = (int) (Math.random() * 100000); //生成二维码 String imgName = uuid + "_" + (int) (new Date().getTime() / 1000) + ".png"; String path = getServletContext().getRealPath("/")+"images/"; File file = new File(path+imgName); String callbackurl = URLEncoder.encode(ResourceUtil.getConfigByName("callbackurl") +"&uuid="+uuid); QRCode.encode("https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx812eea92b8bd7255&redirect_uri="+callbackurl+"&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect ", file,"png", BarcodeFormat.QR_CODE, 500, 500, null); //生成的图片访问地址 String qrCodeImg = "http://你的服务器地址/images/" + imgName; String jsonStr = "{\"uuid\":" + uuid + ",\"qrCodeImg\":\"" + qrCodeImg + "\"}"; out.print(jsonStr); out.flush(); out.close(); }
其中callbackurl是微信扫码后跳转跳转的URL,如callbackurl=你的域名/phoneLoginServlet?version=3app
2. 经过code换取网页受权access_token,而后经过网页受权access_token和openid获取用户基本信息(phoneLoginServlet的doPost方法);dom
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String uuid = request.getParameter("uuid"); String code = request.getParameter("code"); boolean bool = true; new WeixinUserServiceImpl().saveWeixinLogin(null); //根据回调url返回的code换取网页受权access_token if(null != code && code != ""){ String appid = ResourceUtil.getConfigByName("appid"); String appsecret = ResourceUtil.getConfigByName("appsecret"); JSONObject json_accessToken = HttpUtil.httpGet("https://api.weixin.qq.com/sns/oauth2/access_token?appid="+appid+"&secret="+appsecret+"&code="+code+"&grant_type=authorization_code"); String access_token = json_accessToken.getString("access_token"); String openid = json_accessToken.getString("openid"); //拉取用户信息 JSONObject json_userinfo = HttpUtil.httpGet("https://api.weixin.qq.com/sns/userinfo?access_token="+access_token+"&openid="+openid); //TODO 验证登陆 if(bool){ //将登录信息存入map WeixinUser userVo = (WeixinUser) LoginUserVo.getLoginUserMap().get(uuid); if(userVo == null){ userVo = new WeixinUser(); userVo.setOpenid(json_userinfo.getString("openid")); userVo.setNickname(json_userinfo.getString("nickname")); userVo.setSex(json_userinfo.getString("sex")); userVo.setProvince(json_userinfo.getString("province")); userVo.setCity(json_userinfo.getString("city")); //WeixinUserService weixinUserService = new WeixinUserService(); weixinUserService.saveWeixinLogin(userVo); LoginUserVo.getLoginUserMap().put(uuid, userVo); } } } PrintWriter out = response.getWriter(); out.print(bool); out.flush(); out.close(); }
获取用户信息返回样例:ui
[result={ "openid":"oN9UryuC0Y01aQt0jKxZXbfe658w", "nickname":"lovebread", "sex":1, "language":"zh_CN", "city":"", "province":"", "country":"中国", "headimgurl":"http://wx.qlogo.cn/mmopen/bRLXzTf2f6HNfBTd72heAA7vNKsGKvK3dfreewrewsPff9OaMWib0GibbA8daQmNQvQhagtiaicf4vNC5nYU3ia821QQ/0", "privilege":[]}]
参考网址:url
1.http://www.cnblogs.com/lovebread/p/5513241.html
2.https://git.oschina.net/langqiao123/lrswx1