新增小程序用户管理
This commit is contained in:
parent
b48dbd5e27
commit
ae06a9791f
@ -1,9 +1,15 @@
|
|||||||
package com.cm.common.wechat.manager.miniapp;
|
package com.cm.common.wechat.manager.miniapp;
|
||||||
|
|
||||||
import com.cm.common.wechat.config.pojo.WechatMiniAppProperties;
|
import com.cm.common.wechat.config.pojo.WechatMiniAppProperties;
|
||||||
|
import com.cm.common.wechat.pojo.WechatMiniAppUserInfo;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* When you feel like quitting. Think about why you started
|
* When you feel like quitting. Think about why you started
|
||||||
* 当你想要放弃的时候,想想当初你为何开始
|
* 当你想要放弃的时候,想想当初你为何开始
|
||||||
@ -17,11 +23,66 @@ import org.slf4j.LoggerFactory;
|
|||||||
public class WechatMiniAppManager {
|
public class WechatMiniAppManager {
|
||||||
|
|
||||||
private static final Logger LOG = LoggerFactory.getLogger(WechatMiniAppManager.class);
|
private static final Logger LOG = LoggerFactory.getLogger(WechatMiniAppManager.class);
|
||||||
|
private static WechatMiniAppManager wechatMiniAppManager = WechatMiniAppManagerBuilder.wechatMiniAppManager;
|
||||||
|
// 超时分钟
|
||||||
|
private final int TIME_OUT_SECOND = 120 * 60;
|
||||||
private WechatMiniAppProperties wechatMiniAppProperties;
|
private WechatMiniAppProperties wechatMiniAppProperties;
|
||||||
|
|
||||||
|
private WechatMiniAppManager() {
|
||||||
|
}
|
||||||
|
|
||||||
|
private Map<String, WechatMiniAppUserInfo> users = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
|
public static WechatMiniAppManager getInstance() {
|
||||||
|
return wechatMiniAppManager;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 添加用户
|
||||||
|
*
|
||||||
|
* @param token
|
||||||
|
* @param wechatMiniAppUserInfo
|
||||||
|
*/
|
||||||
|
public void addUser(String token, WechatMiniAppUserInfo wechatMiniAppUserInfo) {
|
||||||
|
wechatMiniAppUserInfo.setUpdateTime(System.currentTimeMillis());
|
||||||
|
users.put(token, wechatMiniAppUserInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取小程序应用
|
||||||
|
*
|
||||||
|
* @param token
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public WechatMiniAppUserInfo getWechatMiniAppUserInfoByToken(String token) {
|
||||||
|
return users.get(token);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除超时用户
|
||||||
|
*/
|
||||||
|
public void removeTimeoutUser() {
|
||||||
|
LOG.debug("delete timeout wechat mini app user start");
|
||||||
|
long startTime = System.currentTimeMillis();
|
||||||
|
List<String> tokenList = new ArrayList<>();
|
||||||
|
for (Map.Entry<String, WechatMiniAppUserInfo> kv : users.entrySet()) {
|
||||||
|
// 超时
|
||||||
|
if ((startTime - kv.getValue().getUpdateTime()) / 1000 > TIME_OUT_SECOND) {
|
||||||
|
tokenList.add(kv.getKey());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (String token : tokenList) {
|
||||||
|
users.remove(token);
|
||||||
|
}
|
||||||
|
long endTime = System.currentTimeMillis();
|
||||||
|
LOG.debug("delete timeout wechat mini app user end, delete count: {}, useTime: {}ms", tokenList.size(), endTime - startTime);
|
||||||
|
}
|
||||||
|
|
||||||
public void setWechatMiniAppProperties(WechatMiniAppProperties wechatMiniAppProperties) {
|
public void setWechatMiniAppProperties(WechatMiniAppProperties wechatMiniAppProperties) {
|
||||||
this.wechatMiniAppProperties = wechatMiniAppProperties;
|
this.wechatMiniAppProperties = wechatMiniAppProperties;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static class WechatMiniAppManagerBuilder {
|
||||||
|
public static final WechatMiniAppManager wechatMiniAppManager = new WechatMiniAppManager();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -17,6 +17,7 @@ public class WechatMiniAppUserInfo {
|
|||||||
private String unionid;
|
private String unionid;
|
||||||
private Integer errcode;
|
private Integer errcode;
|
||||||
private String errmsg;
|
private String errmsg;
|
||||||
|
private long updateTime;
|
||||||
|
|
||||||
public String getOpenid() {
|
public String getOpenid() {
|
||||||
return openid == null ? "" : openid;
|
return openid == null ? "" : openid;
|
||||||
@ -58,6 +59,14 @@ public class WechatMiniAppUserInfo {
|
|||||||
this.errmsg = errmsg;
|
this.errmsg = errmsg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public long getUpdateTime() {
|
||||||
|
return updateTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUpdateTime(long updateTime) {
|
||||||
|
this.updateTime = updateTime;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
final StringBuilder sb = new StringBuilder("{");
|
final StringBuilder sb = new StringBuilder("{");
|
||||||
@ -67,10 +76,12 @@ public class WechatMiniAppUserInfo {
|
|||||||
.append(session_key).append('\"');
|
.append(session_key).append('\"');
|
||||||
sb.append(",\"unionid\":\"")
|
sb.append(",\"unionid\":\"")
|
||||||
.append(unionid).append('\"');
|
.append(unionid).append('\"');
|
||||||
sb.append(",\"errcode\":\"")
|
sb.append(",\"errcode\":")
|
||||||
.append(errcode).append('\"');
|
.append(errcode);
|
||||||
sb.append(",\"errmsg\":\"")
|
sb.append(",\"errmsg\":\"")
|
||||||
.append(errmsg).append('\"');
|
.append(errmsg).append('\"');
|
||||||
|
sb.append(",\"updateTime\":")
|
||||||
|
.append(updateTime);
|
||||||
sb.append('}');
|
sb.append('}');
|
||||||
return sb.toString();
|
return sb.toString();
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,187 @@
|
|||||||
|
package com.cm.common.wechat.pojo;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* When you feel like quitting. Think about why you started
|
||||||
|
* 当你想要放弃的时候,想想当初你为何开始
|
||||||
|
*
|
||||||
|
* @ClassName: WechatMiniAppUserInfoDetail
|
||||||
|
* @Description:
|
||||||
|
* @Author: WangGeng
|
||||||
|
* @Date: 2020/10/29 18:36
|
||||||
|
* @Version: 1.0
|
||||||
|
**/
|
||||||
|
public class WechatMiniAppUserInfoDetail {
|
||||||
|
|
||||||
|
private String openId;
|
||||||
|
private String nickName;
|
||||||
|
private Integer gender;
|
||||||
|
private String city;
|
||||||
|
private String province;
|
||||||
|
private String country;
|
||||||
|
private String avatarUrl;
|
||||||
|
private String unionId;
|
||||||
|
private String phoneNumber;
|
||||||
|
private String purePhoneNumber;
|
||||||
|
private String countryCode;
|
||||||
|
private WaterMark watermark;
|
||||||
|
|
||||||
|
public String getOpenId() {
|
||||||
|
return openId == null ? "" : openId.trim();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setOpenId(String openId) {
|
||||||
|
this.openId = openId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getNickName() {
|
||||||
|
return nickName == null ? "" : nickName.trim();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setNickName(String nickName) {
|
||||||
|
this.nickName = nickName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getGender() {
|
||||||
|
return gender;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setGender(Integer gender) {
|
||||||
|
this.gender = gender;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getCity() {
|
||||||
|
return city == null ? "" : city.trim();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCity(String city) {
|
||||||
|
this.city = city;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getProvince() {
|
||||||
|
return province == null ? "" : province.trim();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setProvince(String province) {
|
||||||
|
this.province = province;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getCountry() {
|
||||||
|
return country == null ? "" : country.trim();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCountry(String country) {
|
||||||
|
this.country = country;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getAvatarUrl() {
|
||||||
|
return avatarUrl == null ? "" : avatarUrl.trim();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAvatarUrl(String avatarUrl) {
|
||||||
|
this.avatarUrl = avatarUrl;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getUnionId() {
|
||||||
|
return unionId == null ? "" : unionId.trim();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUnionId(String unionId) {
|
||||||
|
this.unionId = unionId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPhoneNumber() {
|
||||||
|
return phoneNumber == null ? "" : phoneNumber.trim();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPhoneNumber(String phoneNumber) {
|
||||||
|
this.phoneNumber = phoneNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPurePhoneNumber() {
|
||||||
|
return purePhoneNumber == null ? "" : purePhoneNumber.trim();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPurePhoneNumber(String purePhoneNumber) {
|
||||||
|
this.purePhoneNumber = purePhoneNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getCountryCode() {
|
||||||
|
return countryCode == null ? "" : countryCode.trim();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCountryCode(String countryCode) {
|
||||||
|
this.countryCode = countryCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
public WaterMark getWatermark() {
|
||||||
|
return watermark;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setWatermark(WaterMark watermark) {
|
||||||
|
this.watermark = watermark;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
final StringBuilder sb = new StringBuilder("{");
|
||||||
|
sb.append("\"openId\":\"")
|
||||||
|
.append(openId).append('\"');
|
||||||
|
sb.append(",\"nickName\":\"")
|
||||||
|
.append(nickName).append('\"');
|
||||||
|
sb.append(",\"gender\":")
|
||||||
|
.append(gender);
|
||||||
|
sb.append(",\"city\":\"")
|
||||||
|
.append(city).append('\"');
|
||||||
|
sb.append(",\"province\":\"")
|
||||||
|
.append(province).append('\"');
|
||||||
|
sb.append(",\"country\":\"")
|
||||||
|
.append(country).append('\"');
|
||||||
|
sb.append(",\"avatarUrl\":\"")
|
||||||
|
.append(avatarUrl).append('\"');
|
||||||
|
sb.append(",\"unionId\":\"")
|
||||||
|
.append(unionId).append('\"');
|
||||||
|
sb.append(",\"phoneNumber\":\"")
|
||||||
|
.append(phoneNumber).append('\"');
|
||||||
|
sb.append(",\"purePhoneNumber\":\"")
|
||||||
|
.append(purePhoneNumber).append('\"');
|
||||||
|
sb.append(",\"countryCode\":\"")
|
||||||
|
.append(countryCode).append('\"');
|
||||||
|
sb.append(",\"watermark\":")
|
||||||
|
.append(watermark);
|
||||||
|
sb.append('}');
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class WaterMark {
|
||||||
|
private String appid;
|
||||||
|
private Long timestamp;
|
||||||
|
|
||||||
|
public String getAppid() {
|
||||||
|
return appid == null ? "" : appid.trim();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAppid(String appid) {
|
||||||
|
this.appid = appid;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getTimestamp() {
|
||||||
|
return timestamp;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTimestamp(Long timestamp) {
|
||||||
|
this.timestamp = timestamp;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
final StringBuilder sb = new StringBuilder("{");
|
||||||
|
sb.append("\"appid\":\"")
|
||||||
|
.append(appid).append('\"');
|
||||||
|
sb.append(",\"timestamp\":")
|
||||||
|
.append(timestamp);
|
||||||
|
sb.append('}');
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -8,6 +8,7 @@ import com.cm.common.result.SuccessResultData;
|
|||||||
import com.cm.common.utils.AesUtil;
|
import com.cm.common.utils.AesUtil;
|
||||||
import com.cm.common.utils.http.RestRequestUtil;
|
import com.cm.common.utils.http.RestRequestUtil;
|
||||||
import com.cm.common.wechat.config.pojo.WechatMiniAppProperties;
|
import com.cm.common.wechat.config.pojo.WechatMiniAppProperties;
|
||||||
|
import com.cm.common.wechat.manager.miniapp.WechatMiniAppManager;
|
||||||
import com.cm.common.wechat.pojo.WechatMiniAppLoginVO;
|
import com.cm.common.wechat.pojo.WechatMiniAppLoginVO;
|
||||||
import com.cm.common.wechat.pojo.WechatMiniAppUserInfo;
|
import com.cm.common.wechat.pojo.WechatMiniAppUserInfo;
|
||||||
import com.cm.common.wechat.pojo.WechatOfficialAccountUserInfo;
|
import com.cm.common.wechat.pojo.WechatOfficialAccountUserInfo;
|
||||||
@ -73,10 +74,10 @@ public class WechatMiniAppAuthServiceImpl implements IWechatMiniAppAuthService {
|
|||||||
if (wechatMiniAppUserInfo.getErrcode() != null && wechatMiniAppUserInfo.getErrcode() != 0) {
|
if (wechatMiniAppUserInfo.getErrcode() != null && wechatMiniAppUserInfo.getErrcode() != 0) {
|
||||||
throw new WechatAccessTokenForUserException(String.format("获取用户信息失败,错误码:%s,错误信息:%s", wechatMiniAppUserInfo.getErrcode(), wechatMiniAppUserInfo.getErrmsg()));
|
throw new WechatAccessTokenForUserException(String.format("获取用户信息失败,错误码:%s,错误信息:%s", wechatMiniAppUserInfo.getErrcode(), wechatMiniAppUserInfo.getErrmsg()));
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG.debug("绑定用户 | 登录");
|
LOG.debug("绑定用户 | 登录");
|
||||||
String wechatSignInfo = Base64.encodeBase64String(AesUtil.aesCommonEncoder("WECHAT_SIGN_INFO", new StringBuilder(wechatMiniAppUserInfo.getOpenid()).append("_WenG_").append(wechatMiniAppProperties.getAppKey()).toString()).getBytes("UTF-8"));
|
String wechatSignInfo = Base64.encodeBase64String(AesUtil.aesCommonEncoder("WECHAT_SIGN_INFO", new StringBuilder(wechatMiniAppUserInfo.getOpenid()).append("_WenG_").append(wechatMiniAppProperties.getAppKey()).toString()).getBytes("UTF-8"));
|
||||||
String token = getAppToken(wechatSignInfo);
|
String token = getAppToken(wechatSignInfo);
|
||||||
|
WechatMiniAppManager.getInstance().addUser(token, wechatMiniAppUserInfo);
|
||||||
return new SuccessResultData(token);
|
return new SuccessResultData(token);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package com.cm.common.wechat.task;
|
package com.cm.common.wechat.task;
|
||||||
|
|
||||||
import com.cm.common.wechat.config.pojo.WechatOfficialAccountProperties;
|
import com.cm.common.wechat.config.pojo.WechatOfficialAccountProperties;
|
||||||
|
import com.cm.common.wechat.manager.miniapp.WechatMiniAppManager;
|
||||||
import com.cm.common.wechat.manager.officialaccount.WechatOfficialAccountManager;
|
import com.cm.common.wechat.manager.officialaccount.WechatOfficialAccountManager;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
@ -39,4 +40,12 @@ public class WechatTask {
|
|||||||
WechatOfficialAccountManager.getInstance().refreshAccessToken();
|
WechatOfficialAccountManager.getInstance().refreshAccessToken();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除小程序超时用户,每10分钟执行一次
|
||||||
|
*/
|
||||||
|
@Scheduled(cron = "0 0/10 * * * ?")
|
||||||
|
public void removeTimeoutMiniAppUser() {
|
||||||
|
WechatMiniAppManager.getInstance().removeTimeoutUser();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user