package com.ynxbd.wx.wxfactory; import com.ynxbd.common.bean.User; import com.ynxbd.common.helper.common.Base64Helper; import com.ynxbd.common.helper.common.CodeHelper; import com.ynxbd.common.helper.common.JsonHelper; import com.ynxbd.common.result.Result; import com.ynxbd.common.service.PatientService; import com.ynxbd.wx.config.WeChatConfig; import com.ynxbd.wx.wxfactory.bean.SnsOath2AccessToken; import com.ynxbd.wx.wxfactory.bean.SnsUserInfo; import org.ehcache.Cache; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.net.URLDecoder; import java.net.URLEncoder; import java.util.Date; import java.util.HashMap; import java.util.Map; public class WxAuthHelper { public static String auth(HttpServletRequest request, HttpServletResponse response, boolean isUserInfo) { String code = request.getParameter("code"); String state = request.getParameter("state"); String hash = request.getParameter("hash"); try { if (hash == null) { hash = ""; } else { hash = Base64Helper.decode(hash); hash = URLDecoder.decode(hash, "UTF-8"); } SnsOath2AccessToken snsToken = WxFactory.Base.OAuth().oauth2AccessToken(WeChatConfig.APP_ID, WeChatConfig.APP_SECRET, code); if (snsToken != null) { String openid = snsToken.getOpenid(); if (openid != null) { request.getSession().setAttribute("openid", openid); Cache cache = WxCacheHelper.getUserCache(); if (!cache.containsKey(openid)) { String unionId = snsToken.getUnionid(); User user = new User(); user.setUnionId(unionId); user.setOpenid(openid); user.setIsSnapShotUser(snsToken.getIsSnapShotUser()); user.setPatientList(new PatientService().getPatientList(openid, unionId, true)); if (isUserInfo) { SnsUserInfo snsUser = WxFactory.Base.OAuth().snsUserInfo(snsToken.getAccessToken(), openid, "zh_CN", 3); if (snsUser != null) { user.setCountry(snsUser.getCountry()); user.setAvatar(snsUser.getHeadImgUrl()); user.setNickName(snsUser.getNickname_emoji()); user.setProvince(snsUser.getProvince()); Integer sex = snsUser.getSex(); if (sex != null) { user.setGender(sex == 1 ? "男" : "女"); } user.setCity(snsUser.getCity()); user.setLanguage(snsUser.getLanguage()); } } cache.put(openid, user); } else { if (isUserInfo) { User user = cache.get(openid); if (user != null && user.getAvatar() == null && user.getNickName() == null) { SnsUserInfo snsUser = WxFactory.Base.OAuth().snsUserInfo(snsToken.getAccessToken(), openid, "zh_CN", 3); if (snsUser != null) { user.setAvatar(snsUser.getHeadImgUrl()); user.setNickName(snsUser.getNickname_emoji()); Integer sex = snsUser.getSex(); if (sex != null) { user.setGender(sex == 1 ? "男" : "女"); } } } } } } } if (hash == null) hash = ""; if (state == null) state = ""; if (state.contains(".html")) { return state + hash; } else { String baseUrl = WeChatConfig.getBaseUrl(); if (baseUrl != null && state.contains(baseUrl)) { return state + hash; } } } catch (Exception e) { e.printStackTrace(); } return null; } public static Result isAuth(HttpServletRequest request) throws Exception { HttpSession session = request.getSession(); Object openid = session.getAttribute("openid"); if (openid != null) { User user = WxCacheHelper.getCacheUser((String) openid); if (user == null) { return Result.success(getAuthUrl(request)); } String isUserInfo = request.getParameter("isUserInfo"); if ("true".equals(isUserInfo)) { // 更换授权模式,需更新信息 if (user.getNickName() == null || user.getAvatar() == null) { return Result.success(getAuthUrl(request)); } } Map map = new HashMap<>(); map.put("openid", openid); map.put("unionId", user.getUnionId()); map.put("date", new Date()); map.put("avatar", user.getAvatar()); map.put("nickName", user.getNickName()); map.put("patients", CodeHelper.get28UUID() + Base64Helper.encode(URLEncoder.encode(JsonHelper.toJsonString(user.getPatientList()), "UTF-8"))); map.put("hash", request.getParameter("hash")); return Result.success(map); } return Result.success(getAuthUrl(request)); } private static final String OAUTH_URL = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + WeChatConfig.APP_ID + "&redirect_uri="; private static String getAuthUrl(HttpServletRequest request) { // StringBuffer url = request.getRequestURL(); // String baseUrl = url.delete(url.length() - request.getRequestURI().length(), url.length()).append(request.getServletContext().getContextPath()).append("/").toString(); String state = request.getParameter("state"); String hash = request.getParameter("hash"); String isUserInfo = request.getParameter("isUserInfo"); if (hash == null) { hash = ""; } if (state != null) { String decode = Base64Helper.decode(state); if (!decode.contains(".html") && !decode.contains(".jsp")) { decode = "my-info.html"; } String api = ("true".equals(isUserInfo) ? "u_auth" : "b_auth"); String scope = ("true".equals(isUserInfo) ? "snsapi_userinfo" : "snsapi_base"); state = OAUTH_URL + WeChatConfig.getBaseUrl() + "wx_auth/" + api + "?hash=" + hash + "&response_type=code" + "&scope=" + scope + "&forcePopup=true" + "&state=" + decode + "#wechat_redirect"; state = Base64Helper.encode(state); } return state; } }