|
|
|
@ -1,13 +1,18 @@ |
|
|
|
package com.ynxbd.wx.wxfactory; |
|
|
|
package com.ynxbd.wx.wxfactory; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import com.ynxbd.common.bean.GMCUser; |
|
|
|
import com.ynxbd.common.bean.Patient; |
|
|
|
import com.ynxbd.common.bean.Patient; |
|
|
|
import com.ynxbd.common.bean.User; |
|
|
|
import com.ynxbd.common.bean.User; |
|
|
|
import com.ynxbd.common.helper.common.*; |
|
|
|
import com.ynxbd.common.helper.common.*; |
|
|
|
import com.ynxbd.common.helper.http.OkHttpHelper; |
|
|
|
import com.ynxbd.common.helper.http.OkHttpHelper; |
|
|
|
|
|
|
|
import com.ynxbd.common.result.JsonResult; |
|
|
|
|
|
|
|
import com.ynxbd.common.result.JsonResultEnum; |
|
|
|
import com.ynxbd.common.result.Result; |
|
|
|
import com.ynxbd.common.result.Result; |
|
|
|
|
|
|
|
import com.ynxbd.common.service.GMCUserService; |
|
|
|
import com.ynxbd.common.service.PatientService; |
|
|
|
import com.ynxbd.common.service.PatientService; |
|
|
|
import com.ynxbd.wx.config.WeChatConfig; |
|
|
|
import com.ynxbd.wx.config.WeChatConfig; |
|
|
|
import com.ynxbd.wx.wxfactory.base.auth.models.AuthData; |
|
|
|
import com.ynxbd.wx.wxfactory.base.auth.models.AuthResultData; |
|
|
|
|
|
|
|
import com.ynxbd.wx.wxfactory.base.auth.models.AuthTokenData; |
|
|
|
import com.ynxbd.wx.wxfactory.base.auth.models.SnsOath2AccessToken; |
|
|
|
import com.ynxbd.wx.wxfactory.base.auth.models.SnsOath2AccessToken; |
|
|
|
import com.ynxbd.wx.wxfactory.base.auth.models.SnsUserInfo; |
|
|
|
import com.ynxbd.wx.wxfactory.base.auth.models.SnsUserInfo; |
|
|
|
import lombok.extern.slf4j.Slf4j; |
|
|
|
import lombok.extern.slf4j.Slf4j; |
|
|
|
@ -19,7 +24,10 @@ import javax.servlet.http.HttpServletResponse; |
|
|
|
import javax.servlet.http.HttpSession; |
|
|
|
import javax.servlet.http.HttpSession; |
|
|
|
import java.net.URLDecoder; |
|
|
|
import java.net.URLDecoder; |
|
|
|
import java.net.URLEncoder; |
|
|
|
import java.net.URLEncoder; |
|
|
|
import java.util.*; |
|
|
|
import java.util.Date; |
|
|
|
|
|
|
|
import java.util.HashMap; |
|
|
|
|
|
|
|
import java.util.List; |
|
|
|
|
|
|
|
import java.util.Map; |
|
|
|
|
|
|
|
|
|
|
|
@Slf4j |
|
|
|
@Slf4j |
|
|
|
public class WxAuthHelper { |
|
|
|
public class WxAuthHelper { |
|
|
|
@ -29,47 +37,35 @@ public class WxAuthHelper { |
|
|
|
private static final String P_SUFFIX = ":"; // 后缀
|
|
|
|
private static final String P_SUFFIX = ":"; // 后缀
|
|
|
|
|
|
|
|
|
|
|
|
private static final String AUTH_SESSION_ID_NAME = "SID"; |
|
|
|
private static final String AUTH_SESSION_ID_NAME = "SID"; |
|
|
|
private static final String UNION_ID_NAME = "UID"; |
|
|
|
private static final String GMC_ID = "GMCId"; |
|
|
|
|
|
|
|
private static final String OPENID = "openid"; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static String auth(HttpServletRequest request, HttpServletResponse response, boolean isUserInfo) { |
|
|
|
public static String auth(HttpServletRequest request, HttpServletResponse response, boolean isUserInfo) { |
|
|
|
String code = request.getParameter("code"); |
|
|
|
|
|
|
|
String state = request.getParameter("state"); // base64
|
|
|
|
|
|
|
|
Map<String, String> paramsMap = getParamsMap(request.getParameter("p")); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
log.info("[授权] code={}, state={}, paramsMap={}", code, state, JsonHelper.toJsonString(paramsMap)); |
|
|
|
|
|
|
|
try { |
|
|
|
try { |
|
|
|
|
|
|
|
String code = request.getParameter("code"); |
|
|
|
|
|
|
|
String state = request.getParameter("state"); // base64
|
|
|
|
|
|
|
|
Map<String, String> paramsMap = getParamsMap(request.getParameter("p")); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
log.info("[认证授权] code={}, state={}, paramsMap={}", code, state, JsonHelper.toJsonString(paramsMap)); |
|
|
|
|
|
|
|
|
|
|
|
state = state == null ? "" : URLDecoder.decode(Base64Helper.decode(state), "UTF-8"); |
|
|
|
state = state == null ? "" : URLDecoder.decode(Base64Helper.decode(state), "UTF-8"); |
|
|
|
String enUnionId = paramsMap.get(UNION_ID_NAME); |
|
|
|
String authSessionId = AesWxHelper.decode(paramsMap.get(AUTH_SESSION_ID_NAME)); |
|
|
|
String enAuthSessionId = paramsMap.get(AUTH_SESSION_ID_NAME); |
|
|
|
|
|
|
|
String authSessionId = AesWxHelper.decode(enAuthSessionId); |
|
|
|
log.info("[认证授权-解码] authSessionId={}, state={}", authSessionId, state); |
|
|
|
|
|
|
|
|
|
|
|
paramsMap.get(AUTH_SESSION_ID_NAME); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// if (!ObjectUtils.isEmpty(params)) {
|
|
|
|
|
|
|
|
// int index = params.indexOf("@" + AUTH_SESSION_ID_NAME + ":");
|
|
|
|
|
|
|
|
// if (index == -1) index = params.indexOf("%40" + AUTH_SESSION_ID_NAME + ":"); // 防止数据转义失败
|
|
|
|
|
|
|
|
// if (index != -1) {
|
|
|
|
|
|
|
|
// enUnionId = params.substring(0, index);
|
|
|
|
|
|
|
|
// authSessionId = params.substring(index);
|
|
|
|
|
|
|
|
// authSessionId = AesWxHelper.decode(authSessionId);
|
|
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
log.info("[授权-解码] enUnionId={}, enAuthSessionId={}, authSessionId={}, state={}", enUnionId, enAuthSessionId, authSessionId, state); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
SnsOath2AccessToken snsToken = WxFactory.Base.OAuth().oauth2AccessToken(WeChatConfig.APP_ID, WeChatConfig.APP_SECRET, code); |
|
|
|
SnsOath2AccessToken snsToken = WxFactory.Base.OAuth().oauth2AccessToken(WeChatConfig.APP_ID, WeChatConfig.APP_SECRET, code); |
|
|
|
log.info("[授权-用户]snsToken={}", JsonHelper.toJsonString(snsToken)); |
|
|
|
log.info("[认证授权]信息 snsToken={}", JsonHelper.toJsonString(snsToken)); |
|
|
|
if (snsToken != null) { |
|
|
|
if (snsToken != null) { |
|
|
|
String openid = snsToken.getOpenid(); |
|
|
|
String openid = snsToken.getOpenid(); |
|
|
|
String unionId = snsToken.getUnionid(); |
|
|
|
String unionId = snsToken.getUnionid(); |
|
|
|
if (unionId == null) { |
|
|
|
|
|
|
|
log.info("[测试] enUnionId={}", enUnionId); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
if (openid != null) { |
|
|
|
if (openid != null) { |
|
|
|
HttpSession session = request.getSession(); |
|
|
|
HttpSession session = request.getSession(); |
|
|
|
session.setMaxInactiveInterval(SESSION_MAX_INACTIVE_INTERVAL); |
|
|
|
session.setMaxInactiveInterval(SESSION_MAX_INACTIVE_INTERVAL); |
|
|
|
session.setAttribute("openid", openid); |
|
|
|
session.setAttribute(OPENID, openid); |
|
|
|
WxCacheHelper.putOpenIdToAIDCache(authSessionId, openid); |
|
|
|
|
|
|
|
|
|
|
|
WxCacheHelper.putOpenIdCacheToSessionIdCache(authSessionId, openid); |
|
|
|
|
|
|
|
|
|
|
|
Cache<String, User> cache = WxCacheHelper.getUserCacheManager(); |
|
|
|
Cache<String, User> cache = WxCacheHelper.getUserCacheManager(); |
|
|
|
if (WeChatConfig.isDevUser(openid) || !cache.containsKey(openid)) { |
|
|
|
if (WeChatConfig.isDevUser(openid) || !cache.containsKey(openid)) { |
|
|
|
@ -108,7 +104,6 @@ public class WxAuthHelper { |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (WeChatConfig.HAS_HTTPS_BY_BASE_URL) { // 强制为https
|
|
|
|
if (WeChatConfig.HAS_HTTPS_BY_BASE_URL) { // 强制为https
|
|
|
|
String httpsURL = URLHelper.URLToHttps(state); |
|
|
|
String httpsURL = URLHelper.URLToHttps(state); |
|
|
|
state = httpsURL == null ? "" : httpsURL; |
|
|
|
state = httpsURL == null ? "" : httpsURL; |
|
|
|
@ -130,127 +125,244 @@ public class WxAuthHelper { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static Result isAuth(HttpServletRequest request, HttpServletResponse response, boolean isPayOAuth) throws Exception { |
|
|
|
public static Result isAuth(HttpServletRequest request, HttpServletResponse response) throws Exception { |
|
|
|
String token = request.getParameter("token"); // 前端缓存
|
|
|
|
String token = request.getParameter("token"); // 前端缓存
|
|
|
|
String state = request.getParameter("state"); |
|
|
|
String state = request.getParameter("state"); |
|
|
|
String isUserInfo = request.getParameter("isUserInfo"); |
|
|
|
String isUserInfo = request.getParameter("isUserInfo"); |
|
|
|
String UID = ParamHelper.filterParamNull(request.getParameter(UNION_ID_NAME), ""); |
|
|
|
|
|
|
|
String deState = URLDecoder.decode(Base64Helper.decode(state), "UTF-8"); |
|
|
|
String deState = URLDecoder.decode(Base64Helper.decode(state), "UTF-8"); |
|
|
|
|
|
|
|
|
|
|
|
String authSessionId = null; |
|
|
|
HttpSession session = request.getSession(); |
|
|
|
if (WeChatConfig.IS_ENABLE_GMC && WeChatConfig.IS_GMC_SERVER && !isPayOAuth) { // 开启医共体开关 & 是医共体主服务器 & 不是支付授权
|
|
|
|
session.setMaxInactiveInterval(SESSION_MAX_INACTIVE_INTERVAL); |
|
|
|
authSessionId = AesWxHelper.decode(request.getHeader(AUTH_SESSION_ID_NAME)); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
log.warn("[授权is_auth] token={}, state={}, isUserInfo={}, authSessionId={}, UID={}, deState={}", token, state, isUserInfo, authSessionId, UID, deState); |
|
|
|
Object sessionOpenIdObj = session.getAttribute(OPENID); // 自身openid
|
|
|
|
if (WeChatConfig.IS_ENABLE_GMC && !WeChatConfig.IS_GMC_SERVER && !isPayOAuth) { // 开启医共体开关 & 不是医共体主服务器 & 不是支付授权
|
|
|
|
String sessionOpenId = sessionOpenIdObj == null ? null : sessionOpenIdObj.toString(); |
|
|
|
try { // 请求转发
|
|
|
|
|
|
|
|
String serverDomain = WeChatConfig.getDomain(false, false); |
|
|
|
|
|
|
|
if (deState != null && serverDomain != null && !deState.contains(serverDomain)) { |
|
|
|
|
|
|
|
return Result.error("授权域名不匹配"); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
HttpSession session = request.getSession(); |
|
|
|
AuthTokenData authTokenData = new AuthTokenData(); |
|
|
|
String sessionId = session.getId(); |
|
|
|
String cacheTokenOpenId = authTokenData.decodeToken(token, WeChatConfig.APP_ID); |
|
|
|
|
|
|
|
|
|
|
|
log.info("[认证请求转发] [sessionId:{}]URL:[{}]", sessionId, WeChatConfig.getGMCAuthDomain(isHttpsWithProxy(request), true)); |
|
|
|
log.warn("[授权is_auth] token={}, state={}, isUserInfo={}, deState={}", token, state, isUserInfo, deState); |
|
|
|
String data = OkHttpHelper.postFormStr(WeChatConfig.getGMCAuthDomain(isHttpsWithProxy(request), true) + "wx_auth/is_auth", params -> { |
|
|
|
|
|
|
|
params.put("token", token); |
|
|
|
String authSessionId = null; |
|
|
|
params.put("state", state); |
|
|
|
if (WeChatConfig.IS_ENABLE_GMC) { // 开启医共体开关 & 是医共体主服务器 & 不是支付授权
|
|
|
|
params.put("isUserInfo", isUserInfo); |
|
|
|
try { |
|
|
|
params.put(UNION_ID_NAME, UID); |
|
|
|
if (WeChatConfig.IS_GMC_SERVER) { |
|
|
|
}, headers -> { |
|
|
|
authSessionId = AesWxHelper.decode(request.getHeader(AUTH_SESSION_ID_NAME)); |
|
|
|
if (!ObjectUtils.isEmpty(sessionId)) { |
|
|
|
|
|
|
|
headers.add(AUTH_SESSION_ID_NAME, AesWxHelper.encode(WeChatConfig.APP_ID + ":" + sessionId)); |
|
|
|
} else { // 请求转发
|
|
|
|
|
|
|
|
String serverDomain = WeChatConfig.getDomain(false, false); |
|
|
|
|
|
|
|
if (deState != null && serverDomain != null && !deState.contains(serverDomain)) { |
|
|
|
|
|
|
|
return Result.error("授权域名不匹配"); |
|
|
|
} |
|
|
|
} |
|
|
|
}); |
|
|
|
return gmc_server_auth(request, session, state, isUserInfo, cacheTokenOpenId, token, authTokenData, sessionOpenId, authSessionId); |
|
|
|
Result result = Result.dataToResult(data, true); |
|
|
|
} |
|
|
|
System.out.println(JsonHelper.toJsonString(result)); |
|
|
|
|
|
|
|
return Result.dataToResult(data, true); |
|
|
|
|
|
|
|
} catch (Exception e) { |
|
|
|
} catch (Exception e) { |
|
|
|
e.printStackTrace(); |
|
|
|
ErrorHelper.println(e); |
|
|
|
return Result.error(e); |
|
|
|
return Result.error(e); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
boolean isFindUserInfo = ("true".equals(isUserInfo)); |
|
|
|
if (cacheTokenOpenId != null) { |
|
|
|
|
|
|
|
log.info("[微信token认证] token={}, cacheOpenId={}", token, cacheTokenOpenId); |
|
|
|
|
|
|
|
AuthResultData authResultData = getTokenData(cacheTokenOpenId, token, authTokenData); |
|
|
|
|
|
|
|
return Result.success(authResultData.toResultData()); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
AuthData authData = new AuthData(); |
|
|
|
log.info("[微信认证]获取 openid={}, authSessionId={}", sessionOpenId, authSessionId); |
|
|
|
String cacheOpenid = authData.decodeToken(token, WeChatConfig.APP_ID); |
|
|
|
if (!ObjectUtils.isEmpty(authSessionId) && ObjectUtils.isEmpty(sessionOpenId)) { |
|
|
|
if (cacheOpenid != null) { |
|
|
|
sessionOpenId = WxCacheHelper.findOpenIdBySessionIdCache(authSessionId); |
|
|
|
log.info("[微信token认证] token={}, openid={}", token, cacheOpenid); |
|
|
|
log.info("[微信AID认证]sessionOpenId={}", sessionOpenId); |
|
|
|
User user = WxCacheHelper.getCacheUser(cacheOpenid); |
|
|
|
} |
|
|
|
List<Patient> patients; |
|
|
|
|
|
|
|
if (user == null) { |
|
|
|
|
|
|
|
patients = new PatientService().queryPatientList(cacheOpenid, null, true); |
|
|
|
|
|
|
|
Cache<String, User> cache = WxCacheHelper.getUserCacheManager(); |
|
|
|
|
|
|
|
User addCache = new User(); |
|
|
|
|
|
|
|
addCache.setOpenid(cacheOpenid); |
|
|
|
|
|
|
|
addCache.setUnionId(authData.getUnionId()); |
|
|
|
|
|
|
|
addCache.setAvatar(authData.getAvatar()); |
|
|
|
|
|
|
|
addCache.setNickName(authData.getNickName()); |
|
|
|
|
|
|
|
addCache.setPatientList(patients); |
|
|
|
|
|
|
|
cache.put(cacheOpenid, addCache); |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
patients = user.getPatientList(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Map<String, Object> map = new HashMap<>(); |
|
|
|
AuthResultData authResultData = getCacheUserData(request, sessionOpenId, state, isUserInfo, authSessionId); |
|
|
|
map.put("openid", cacheOpenid); |
|
|
|
if (authResultData.hasAuthUrl()) { |
|
|
|
map.put("token", token); |
|
|
|
return Result.success(authResultData.getAuthUrl()); |
|
|
|
map.put("enOpenId", AesWxHelper.encode(cacheOpenid, true)); |
|
|
|
|
|
|
|
map.put("enUnionId", AesWxHelper.encode(authData.getUnionId(), true)); |
|
|
|
|
|
|
|
map.put("date", new Date()); |
|
|
|
|
|
|
|
map.put("avatar", authData.getAvatar()); |
|
|
|
|
|
|
|
map.put("nickName", authData.getNickName()); |
|
|
|
|
|
|
|
map.put("patients", CodeHelper.get28UUID() + Base64Helper.encode(URLEncoder.encode(JsonHelper.toJsonString(patients), "UTF-8"))); |
|
|
|
|
|
|
|
map.put("enParams", AesMicroHelper.encode(cacheOpenid)); |
|
|
|
|
|
|
|
return Result.success(map); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return Result.success(authResultData.toResultData()); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
HttpSession session = request.getSession(); |
|
|
|
/** |
|
|
|
Object sessionOpenId = session.getAttribute("openid"); |
|
|
|
* 主体服务器认证 |
|
|
|
String openid = sessionOpenId == null ? null : sessionOpenId.toString(); |
|
|
|
*/ |
|
|
|
|
|
|
|
public static Result gmc_server_auth(HttpServletRequest request, HttpSession session, String state, String isUserInfo, |
|
|
|
|
|
|
|
String cacheTokenOpenId, String token, AuthTokenData tokenData, String sessionOpenId, String authSessionId) { |
|
|
|
|
|
|
|
String reqGMCDomain = WeChatConfig.getGMCAuthDomain(isHttpsWithProxy(request), true); // 医共体请求服务地址
|
|
|
|
|
|
|
|
// 自身认证
|
|
|
|
|
|
|
|
boolean hasTokenCache = !ObjectUtils.isEmpty(cacheTokenOpenId); |
|
|
|
|
|
|
|
String openId = hasTokenCache ? cacheTokenOpenId : sessionOpenId; |
|
|
|
|
|
|
|
if (ObjectUtils.isEmpty(openId)) { // 自身认证未完成
|
|
|
|
|
|
|
|
return Result.success(getAuthUrl(request, state, false, null, authSessionId)); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
// log.info("cacheTokenOpenId={}, sessionOpenId={}", cacheTokenOpenId, sessionOpenId);
|
|
|
|
|
|
|
|
|
|
|
|
log.info("[微信认证] openid={}, authSessionId={}", openid, authSessionId); |
|
|
|
// 判断是否有主体id
|
|
|
|
if (!ObjectUtils.isEmpty(authSessionId) && ObjectUtils.isEmpty(openid)) { |
|
|
|
Object sessionGmcOpenId = session.getAttribute(GMC_ID); |
|
|
|
openid = WxCacheHelper.getOpenIdByAIDCache(authSessionId); |
|
|
|
String gmcOpenId = sessionGmcOpenId == null ? null : sessionGmcOpenId.toString(); |
|
|
|
log.warn("[微信AID认证]openid={}", openid); |
|
|
|
|
|
|
|
|
|
|
|
if (gmcOpenId == null) { |
|
|
|
|
|
|
|
GMCUser gmcUser = new GMCUserService().queryInfoByOpenId(openId); |
|
|
|
|
|
|
|
if (gmcUser != null) { |
|
|
|
|
|
|
|
gmcOpenId = gmcUser.getGmcOpenId(); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (openid != null) { |
|
|
|
if (!ObjectUtils.isEmpty(gmcOpenId)) { |
|
|
|
log.info("[微信认证]openid={}", openid); |
|
|
|
if (sessionGmcOpenId == null) { |
|
|
|
User user = WxCacheHelper.getCacheUser(openid); |
|
|
|
session.setAttribute(GMC_ID, gmcOpenId); |
|
|
|
if (user == null) { |
|
|
|
|
|
|
|
return Result.success(getAuthUrl(request, state, isFindUserInfo, UID, authSessionId)); |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
if (ObjectUtils.isEmpty(openid)) { |
|
|
|
|
|
|
|
openid = user.getOpenid(); // sessionId认证openid补充
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (isFindUserInfo) { // 更换授权模式,需更新信息
|
|
|
|
// 查询返回数据
|
|
|
|
if (user.getNickName() == null || user.getAvatar() == null) { |
|
|
|
AuthResultData authResultData = null; |
|
|
|
return Result.success(getAuthUrl(request, state, true, UID, authSessionId)); |
|
|
|
if (hasTokenCache) { |
|
|
|
} |
|
|
|
authResultData = getTokenData(openId, token, tokenData); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
if (authResultData == null) { |
|
|
|
|
|
|
|
authResultData = getCacheUserData(request, sessionOpenId, state, isUserInfo, authSessionId); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if (authResultData.hasAuthUrl()) { // 授权链接
|
|
|
|
|
|
|
|
return Result.success(authResultData.getAuthUrl()); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
// repeatPatients(reqGMCDomain, authResultData.getPatientList(), gmcOpenId); // 患者信息去重
|
|
|
|
|
|
|
|
return Result.success(authResultData.toResultData()); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
Map<String, Object> map = new HashMap<>(); |
|
|
|
|
|
|
|
map.put("openid", openid); |
|
|
|
String sessionId = session.getId(); |
|
|
|
map.put("token", new AuthData().createToken(WeChatConfig.APP_ID, openid, user.getUnionId(), user.getAvatar(), user.getNickName())); |
|
|
|
log.info("[认证请求转发] [sessionId:{}]URL:[{}]", sessionId, reqGMCDomain); |
|
|
|
map.put("enOpenId", AesWxHelper.encode(openid, true)); |
|
|
|
String resultJson = OkHttpHelper.postFormStr(reqGMCDomain + "wx_auth/is_auth", params -> { |
|
|
|
map.put("enUnionId", AesWxHelper.encode(user.getUnionId(), true)); |
|
|
|
params.put("token", token); |
|
|
|
map.put("date", new Date()); |
|
|
|
params.put("state", state); |
|
|
|
map.put("avatar", user.getAvatar()); |
|
|
|
params.put("isUserInfo", "false"); |
|
|
|
map.put("nickName", user.getNickName()); |
|
|
|
}, headers -> { |
|
|
|
map.put("patients", CodeHelper.get28UUID() + Base64Helper.encode(URLEncoder.encode(JsonHelper.toJsonString(user.getPatientList()), "UTF-8"))); |
|
|
|
if (!ObjectUtils.isEmpty(sessionId)) { |
|
|
|
map.put("enParams", AesMicroHelper.encode(openid)); |
|
|
|
headers.add(AUTH_SESSION_ID_NAME, AesWxHelper.encode(WeChatConfig.APP_ID + ":" + sessionId)); |
|
|
|
return Result.success(map); |
|
|
|
} |
|
|
|
|
|
|
|
}); |
|
|
|
|
|
|
|
Result result = Result.dataToResult(resultJson, true); |
|
|
|
|
|
|
|
if (!result.isOK()) { |
|
|
|
|
|
|
|
return result; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
String dataStr = result.toDataStr(); |
|
|
|
|
|
|
|
if (dataStr != null && !dataStr.contains("{")) { |
|
|
|
|
|
|
|
return Result.success(dataStr); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
AuthResultData gmcAuthResultData = result.dataToBean(AuthResultData.class); // 医共体医生
|
|
|
|
|
|
|
|
String enGmcOpenId = gmcAuthResultData.getEnOpenId(); |
|
|
|
|
|
|
|
gmcOpenId = AesWxHelper.decode(enGmcOpenId); // 主体openid
|
|
|
|
|
|
|
|
String gmcUUID = AesWxHelper.decode(gmcAuthResultData.getEnGmcUUID()); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!ObjectUtils.isEmpty(gmcOpenId)) { // 授权主体完成认证
|
|
|
|
|
|
|
|
session.setAttribute(GMC_ID, gmcOpenId); |
|
|
|
|
|
|
|
boolean isOK = new GMCUserService().addInfo(sessionOpenId, gmcOpenId, null, gmcUUID); |
|
|
|
|
|
|
|
log.info("[认证联系]添加{} wxOpenId={}, gmcOpenId={}, gmcUUID={}", (isOK ? "成功" : "失败"), sessionOpenId, gmcOpenId, gmcUUID); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
AuthResultData authResultData = getCacheUserData(request, sessionOpenId, state, isUserInfo, authSessionId); |
|
|
|
|
|
|
|
authResultData.setEnGmcOpenId(enGmcOpenId); // 用于绑定传递数据,确保关系记录
|
|
|
|
|
|
|
|
return Result.success(authResultData.toResultData()); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return result; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* 从token获取数据 |
|
|
|
|
|
|
|
* |
|
|
|
|
|
|
|
* @param cacheOpenId token中的openid |
|
|
|
|
|
|
|
* @param token token |
|
|
|
|
|
|
|
* @param tokenData token解析出来的数据 |
|
|
|
|
|
|
|
* @return bean |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
public static AuthResultData getTokenData(String cacheOpenId, String token, AuthTokenData tokenData) { |
|
|
|
|
|
|
|
if (cacheOpenId == null) { |
|
|
|
|
|
|
|
return null; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
if (tokenData == null) { |
|
|
|
|
|
|
|
return null; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
log.info("[微信token认证] token={}, cacheOpenId={}", token, cacheOpenId); |
|
|
|
|
|
|
|
User user = WxCacheHelper.getCacheUser(cacheOpenId); |
|
|
|
|
|
|
|
List<Patient> patients; |
|
|
|
|
|
|
|
if (user == null) { |
|
|
|
|
|
|
|
patients = new PatientService().queryPatientList(cacheOpenId, null, true); |
|
|
|
|
|
|
|
Cache<String, User> cache = WxCacheHelper.getUserCacheManager(); |
|
|
|
|
|
|
|
User addCache = new User(); |
|
|
|
|
|
|
|
addCache.setOpenid(cacheOpenId); |
|
|
|
|
|
|
|
addCache.setUnionId(tokenData.getUnionId()); |
|
|
|
|
|
|
|
addCache.setAvatar(tokenData.getAvatar()); |
|
|
|
|
|
|
|
addCache.setNickName(tokenData.getNickName()); |
|
|
|
|
|
|
|
addCache.setPatientList(patients); |
|
|
|
|
|
|
|
cache.put(cacheOpenId, addCache); |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
patients = user.getPatientList(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return Result.success(getAuthUrl(request, state, isFindUserInfo, UID, authSessionId)); |
|
|
|
AuthResultData authResultData = new AuthResultData(); |
|
|
|
|
|
|
|
authResultData.setDate(new Date()); |
|
|
|
|
|
|
|
authResultData.setOpenid(cacheOpenId); |
|
|
|
|
|
|
|
authResultData.setToken(token); |
|
|
|
|
|
|
|
authResultData.setEnOpenId(AesWxHelper.encode(cacheOpenId, true)); |
|
|
|
|
|
|
|
authResultData.setEnUnionId(AesWxHelper.encode(tokenData.getUnionId(), true)); |
|
|
|
|
|
|
|
authResultData.setNickName(tokenData.getNickName()); |
|
|
|
|
|
|
|
authResultData.setAvatar(tokenData.getAvatar()); |
|
|
|
|
|
|
|
authResultData.setPatientList(patients); |
|
|
|
|
|
|
|
authResultData.setEnParams(AesMicroHelper.encode(cacheOpenId)); |
|
|
|
|
|
|
|
authResultData.setEnGmcUUID(AesWxHelper.encode(CodeHelper.get32UUID())); |
|
|
|
|
|
|
|
return authResultData; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static AuthResultData getCacheUserData(HttpServletRequest request, String openId, String state, String isUserInfo, String authSessionId) { |
|
|
|
|
|
|
|
log.info("[微信认证]openid={}", openId); |
|
|
|
|
|
|
|
AuthResultData authResultData = new AuthResultData(); |
|
|
|
|
|
|
|
boolean isFindUserInfo = ("true".equals(isUserInfo)); |
|
|
|
|
|
|
|
if (openId == null) { |
|
|
|
|
|
|
|
authResultData.setAuthUrl(getAuthUrl(request, state, isFindUserInfo, null, authSessionId)); |
|
|
|
|
|
|
|
return authResultData; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
User user = WxCacheHelper.getCacheUser(openId); |
|
|
|
|
|
|
|
if (user == null) { |
|
|
|
|
|
|
|
authResultData.setAuthUrl(getAuthUrl(request, state, isFindUserInfo, null, authSessionId)); |
|
|
|
|
|
|
|
return authResultData; |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
if (ObjectUtils.isEmpty(openId)) { |
|
|
|
|
|
|
|
openId = user.getOpenid(); // sessionId认证openid补充
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (isFindUserInfo) { // 更换授权模式,需更新信息
|
|
|
|
|
|
|
|
if (user.getNickName() == null || user.getAvatar() == null) { |
|
|
|
|
|
|
|
authResultData.setAuthUrl(getAuthUrl(request, state, true, null, authSessionId)); |
|
|
|
|
|
|
|
return authResultData; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
authResultData.setDate(new Date()); |
|
|
|
|
|
|
|
authResultData.setOpenid(openId); |
|
|
|
|
|
|
|
authResultData.setToken(new AuthTokenData().createToken(WeChatConfig.APP_ID, openId, user.getUnionId(), user.getAvatar(), user.getNickName())); |
|
|
|
|
|
|
|
authResultData.setEnOpenId(AesWxHelper.encode(openId, true)); |
|
|
|
|
|
|
|
authResultData.setEnUnionId(AesWxHelper.encode(user.getUnionId(), true)); |
|
|
|
|
|
|
|
authResultData.setNickName(user.getNickName()); |
|
|
|
|
|
|
|
authResultData.setAvatar(user.getAvatar()); |
|
|
|
|
|
|
|
authResultData.setPatientList(user.getPatientList()); |
|
|
|
|
|
|
|
authResultData.setEnParams(AesMicroHelper.encode(openId)); |
|
|
|
|
|
|
|
authResultData.setEnGmcUUID(AesWxHelper.encode(CodeHelper.get32UUID())); |
|
|
|
|
|
|
|
return authResultData; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public List<Patient> repeatPatients(String reqDomain, List<Patient> patientList, String gmcOpenId) throws Exception { |
|
|
|
|
|
|
|
// 数据去重
|
|
|
|
|
|
|
|
JsonResult jsonResult = postForm(reqDomain + "patient/authGMCPatients", params -> { |
|
|
|
|
|
|
|
params.put("gmcOpenId", AesWxHelper.encode(gmcOpenId, true)); |
|
|
|
|
|
|
|
}, headers -> { |
|
|
|
|
|
|
|
headers.add("gmcOpenId", AesWxHelper.encode(gmcOpenId, true)); |
|
|
|
|
|
|
|
}); |
|
|
|
|
|
|
|
if (jsonResult.success()) { |
|
|
|
|
|
|
|
List<Patient> gmcPatientList = jsonResult.dataMapGetNodeToList(Patient.class); |
|
|
|
|
|
|
|
// authResultData.setPatientList(patientList);
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return patientList; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private static final String OAUTH_URL = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + WeChatConfig.APP_ID + "&redirect_uri="; |
|
|
|
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, String state, boolean isFindUserInfo, String UID, String SID) { |
|
|
|
private static String getAuthUrl(HttpServletRequest request, String state, boolean isFindUserInfo, String UID, String SID) { |
|
|
|
@ -263,10 +375,10 @@ public class WxAuthHelper { |
|
|
|
String api = isFindUserInfo ? "u_auth" : "b_auth"; |
|
|
|
String api = isFindUserInfo ? "u_auth" : "b_auth"; |
|
|
|
String scope = isFindUserInfo ? "snsapi_userinfo" : "snsapi_base"; |
|
|
|
String scope = isFindUserInfo ? "snsapi_userinfo" : "snsapi_base"; |
|
|
|
|
|
|
|
|
|
|
|
UID = toURLParam(UNION_ID_NAME, UID); |
|
|
|
String enUID = toURLParam(GMC_ID, AesWxHelper.encode(UID, true)); |
|
|
|
String enSID = toURLParam(AUTH_SESSION_ID_NAME, AesWxHelper.encode(SID, true)); |
|
|
|
String enSID = toURLParam(AUTH_SESSION_ID_NAME, AesWxHelper.encode(SID, true)); |
|
|
|
|
|
|
|
|
|
|
|
String params = enSID + UID; |
|
|
|
String params = enSID + enUID; |
|
|
|
try { |
|
|
|
try { |
|
|
|
params = ObjectUtils.isEmpty(params) ? "" : URLEncoder.encode(params, "UTF-8"); |
|
|
|
params = ObjectUtils.isEmpty(params) ? "" : URLEncoder.encode(params, "UTF-8"); |
|
|
|
log.warn("[认证链接参数] params={}", params); |
|
|
|
log.warn("[认证链接参数] params={}", params); |
|
|
|
@ -333,7 +445,11 @@ public class WxAuthHelper { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// // 医共体开启 & 不是支付授权
|
|
|
|
public static JsonResult postForm(String url, OkHttpHelper.MapParams params, OkHttpHelper.Header header) { |
|
|
|
|
|
|
|
return OkHttpHelper.postForm(url, params, header, JsonResultEnum.SYS_MICRO); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// // 医共体开启 & 不是支付授权
|
|
|
|
// private static boolean isAuthGMC(boolean isPayOAuth) {
|
|
|
|
// private static boolean isAuthGMC(boolean isPayOAuth) {
|
|
|
|
// return WeChatConfig.IS_ENABLE_GMC && !isPayOAuth;
|
|
|
|
// return WeChatConfig.IS_ENABLE_GMC && !isPayOAuth;
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
|