/** * 微信授权-获取微信信息 控制层 */ @Controller @RequestMapping("/waxberry/wx") public class WechatController { protected Logger log = LoggerFactory.getLogger(this.getClass()); @Autowired private CustomerService customerService; /** * 判断入口 * * @param request * @param response * @return */ @RequestMapping(value = "/judgmentEntry") public String judgmentEntry(HttpServletRequest request, HttpServletResponse response,String signs) { Subject subject = SecurityUtils.getSubject(); if (subject.isAuthenticated()) { SecurityUtils.getSubject().logout(); } //获取客户端浏览器和操作系统信息 String ua = request.getHeader("User-Agent"); log.info("请求登录:" + ua); // 开始判断登录渠道 //判断用户是否通过浏览器登录 if (!StringUtils.isEmpty(ua)) { if (ua.contains("MicroMessenger")) { // 微信访问, 开始通过静默微信授权进行登录 log.info("微信访问, 开始通过静默微信授权进行登录"); //return "redirect:/oauth2.wx" } else { log.info("非微信渠道"); } } /*return "redirect:/pwlogin";*/ try { request.setCharacterEncoding("UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } System.out.println(request.getRequestURI()); // 判断是从登录界面进入 request.getSession().setAttribute("fromLogin", "1"); Customer customer = new Customer(); customer.setSigns(signs); Customer custo = customerService.selectOne(customer); if(custo!=null){ // 直接微信自动化 return "redirect:/waxberry/wx/oauth2.wx?signs="+signs; } return null; //跳页面 //return "bulk/index/index"; //跳方法 // String signsa="TSYF"; // String openId="123456"; // return "redirect:/waxberry/wx/home?signs="+signsa+"&openId="+openId; } /** * <pre> * 功能: 开始获取微信授权 * </pre> * * @param request * @return String */ @RequestMapping(value = "/oauth2.wx") public String wxAuth(HttpServletRequest request, String signs) { try { log.info("275-----------"); Customer customer = new Customer(); customer.setSigns(signs); Customer custo = customerService.selectOne(customer); String WX_APPID = custo.getAppId(); String WX_APPSECRET = custo.getAppSecret(); log.info("281-----------"); String backUri = "http://" + Constant.DOMAIN + "/waxberry/wx/wxoauth/handler?signs=" + signs + "&_d=" + new Date().getTime(); //backUri = backUri+"?userId=b88001&orderNo=" + new Date().getTime() + "&describe=xx&money=1780"; backUri = URLEncoder.encode(backUri); //scope 参数视各自需求而定,这里用scope=snsapi_base 不弹出授权页面直接授权目的只获取统一支付接口的openid //snsapi_userinfo String url = "https://open.weixin.qq.com/connect/oauth2/authorize?" + "appid=" + WX_APPID + "&redirect_uri=" + backUri + "&response_type=code&scope=snsapi_userinfo&state=123#wechat_redirect"; log.info("开始微信认证:"); log.info(url); return "redirect:" + url; } catch (Exception e) { e.printStackTrace(); throw e; } } /** * 微信回调地址 * @param request * @return */ @RequestMapping("/wxoauth/handler") public String authHandler(HttpServletRequest request) { String signs = request.getParameter("signs"); Customer customer = new Customer(); customer.setSigns(signs); Customer custo = customerService.selectOne(customer); String WX_APPID = custo.getAppId(); String WX_APPSECRET = custo.getAppSecret(); String uid = request.getParameter("uid"); String code = request.getParameter("code"); log.info("----uid------" + uid); log.info("-----code-----" + code); String openId = ""; //2016-10-14 新加字段 //注意,CWY在测试的时候发现 微信服务器会向重定向地址发送两次url请求,第一次code为空 第二次code才有值 测试人员需要注意这个问题 String access_token = ""; if (code == null) { log.warn("验证失败:code为空"); // return "redirect:/waxberry/wx/home"; } // String URL = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="+WX_APPID+"&secret="+WX_APPSECRET+"&code="+code+"&grant_type=authorization_code"; String requestUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code"; requestUrl = requestUrl.replace("APPID", WX_APPID); requestUrl = requestUrl.replace("SECRET", WX_APPSECRET); requestUrl = requestUrl.replace("CODE", code); log.info("准备获取token了-->" + requestUrl); // 获取授权凭证 String str = HttpUtil.httpRequest(requestUrl, "GET", null); JSONObject jsonObj = JSONObject.parseObject(str); if (jsonObj.containsKey("errcode")) { // return "redirect:/waxberry/wx/home>"; } System.out.println(jsonObj); openId = jsonObj.getString("openid"); String unionid = null; if (jsonObj.containsKey("unionid")) unionid = jsonObj.getString("unionid"); access_token = jsonObj.getString("access_token"); log.info("openId : " + openId); log.info("unionid : " + unionid); log.info("--------获取access_token--------- : " + access_token); // 获得到OPENID后开始查找是否本地有此OPENID的用户,若有则直接进行内部登录,若没有则进入一键注册(只填写手机号和密码)。 WxUserService us = SpringContextHolder.getBean(WxUserService.class); WxUser user = new WxUser(); user.setOpenId(openId); WxUser u = us.selectOne(user); if (u == null) { //判断是否绑定 // 没有历史用户,直接要求绑定 log.info("没有历史用户,直接要求绑定!"); //获取用户信息 Map<String, String> map = getUserInfo(openId, access_token, request); if (map == null || map.containsKey("error")) { log.error("获取用户信息失败,map为空"); System.out.println("获取用户信息失败,map为空"); // return "redirect:/waxberry/wx/home"; return null; } user.setAppId(WX_APPID); user.setNickName(map.get("nickname")); user.setSex(Integer.valueOf(map.get("sex"))); user.setHeadimageUrl(map.get("headImgURL")); user.setCountry(map.get("country")); user.setProvince(map.get("province")); user.setCity(map.get("city")); us.insertSelective(user); request.getSession().setAttribute("openId", openId); request.getSession().setAttribute("nickName", map.get("nickname")); request.getSession().setAttribute("sex",map.get("sex")); request.getSession().setAttribute("headImgURL",map.get("headImgURL")); request.getSession().setAttribute("country", map.get("country")); request.getSession().setAttribute("province", map.get("province")); request.getSession().setAttribute("city", map.get("city")); request.getSession().setAttribute("type", "wx"); return "redirect:/waxberry/wx/home?signs="+signs+"&openId="+openId; } else { // 有历史用户,直接登录 HttpSession session = request.getSession(); if (session.getAttribute("isUpdate") == null || session.getAttribute("headImgURL") == null) //根据session判断是否需要更新数据 { session.setAttribute("isUpdate", "no"); session.setMaxInactiveInterval(60 * 60 * 2); //获取用户 Map<String, String> map = getUserInfo(openId, access_token, request); if (map == null || map.containsKey("error")) { System.out.println("获取用户信息失败,map为空"); return "redirect:/waxberry/wx/home?signs="+signs+"&openId="+openId; } map.put("openId", openId); try { Example example = new Example(WxUser.class); example.createCriteria().andEqualTo("openId", openId); WxUser users = new WxUser(); users.setNickName(map.get("nickname")); users.setSex(Integer.valueOf(map.get("sex"))); users.setHeadimageUrl(map.get("headImgURL")); users.setCountry(map.get("country")); users.setProvince(map.get("province")); users.setCity(map.get("city")); int i = us.updateByExampleSelective(users,example); if (i>0) { System.out.println("用户微信信息更新失败!"); return "redirect:/waxberry/wx/home?signs="+signs+"&openId="+openId; } } catch (Exception ex) { log.error("更新微信信息失败!", ex); } } else // 测试用户头像链接是否过期 { WxUser user_wx = us.selectByPrimaryKey(u.getId()); String imgurl = user_wx.getHeadimageUrl(); try { URL url = new URL(imgurl); URLConnection uc = url.openConnection(); InputStream is = uc.getInputStream(); if (is != null) { is.close(); } } catch (Exception e) { //更新用户信息 ... Map<String, String> newmap = getUserInfo(openId, access_token, request); log.info("----更新用户信息newmap-----" + newmap); if (newmap == null || newmap.containsKey("error")) { System.out.println("获取用户信息失败,map为空"); return "redirect:/waxberry/wx/home?signs="+signs+"&openId="+openId; } try { Example example = new Example(WxUser.class); example.createCriteria().andEqualTo("openId", openId); WxUser users = new WxUser(); users.setNickName(newmap.get("nickname")); users.setSex(Integer.valueOf(newmap.get("sex"))); users.setHeadimageUrl(newmap.get("headImgURL")); users.setCountry(newmap.get("country")); users.setProvince(newmap.get("province")); users.setCity(newmap.get("city")); int i = us.updateByExampleSelective(users,example); if (i>0) { System.out.println("用户微信信息更新失败!"); return "redirect:/waxberry/wx/home?signs="+signs+"&openId="+openId; } } catch (Exception ex) { log.error("更新微信信息失败!", ex); } } } return "redirect:/waxberry/wx/home?signs="+signs+"&openId="+openId; } } /** * 获取用户的微信信息 */ public Map<String,String > getUserInfo(String openId,String access_token,HttpServletRequest request) { Map<String, String> map = new HashMap<String, String>(); String nickname ="nickname"; String sex ="sex"; String headImgURL = "headImgURL"; String country ="country"; String province ="province"; String city = "city"; String error = "error"; //2016-10-14新加内容 log.info("access_token :"+access_token); String URL2 = "https://api.weixin.qq.com/sns/userinfo?access_token="+access_token+"&openid="+openId+"&lang=zh_CN"; log.info("准备获取用户信息-->"+URL2); String infores=""; try { // infores = HttpConnect.getInstance().doGetStr(URL2); infores = HttpUtil.httpRequest(URL2, "GET", null); }catch(Exception e) { log.error("准备获取用户信息出现错误", e); // map.put(error,"redirect:/index"); // return map; } String infoValue = ""; if(StringUtils.isEmpty(infores)) { log.error("出错!!!infores==null"); map.put(error,""); return map; } else { try { JSONObject json = JSONObject.parseObject(infores); if(json.containsKey("errcode")) { log.info(infoValue); map.put(error,""); return map; } log.info("json :"+json); map.put(nickname,json.getString("nickname") ); map.put(sex, json.getString("sex")); map.put(headImgURL, json.getString("headimgurl")); map.put(country, json.getString("country")); map.put(province, json.getString("province")); map.put(city, json.getString("city")); } catch (ClassCastException e) { System.out.println("获取用户信息失败"); log.error("获取用户信息失败", e); map.put(error,""); return map; } //用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空。若用户更换头像,原有头像URL将失效。 log.info("map :"+map); return map; } }
微信公众号 -授权-登陆
最新推荐文章于 2021-07-16 16:04:14 发布