You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					175 lines
				
				7.4 KiB
			
		
		
			
		
	
	
					175 lines
				
				7.4 KiB
			| 
								 
											2 years ago
										 
									 | 
							
								package com.ynxbd.wx.wxfactory;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import com.ynxbd.common.bean.User;
							 | 
						||
| 
								 | 
							
								import com.ynxbd.common.helper.common.AesHelper;
							 | 
						||
| 
								 | 
							
								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<String, User> 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<String, Object> 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"));
							 | 
						||
| 
								 | 
							
								            map.put("enParams", AesHelper.enCode(openid.toString()));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            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;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								}
							 |