调整微信小程序用户和公众号用户代码结构

This commit is contained in:
wanggeng888 2021-04-29 11:16:42 +08:00
parent f5d7c61123
commit 9d5b198ecb
20 changed files with 106 additions and 75 deletions

View File

@ -190,4 +190,9 @@ public interface ISystemConstant {
*/
String DATE_FORMATTER_YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
/**
* 默认密码
*/
String DEFAULT_PASSWORD = "88888888";
}

View File

@ -24,7 +24,7 @@ public class MiniAppProperties {
private String appSecret;
public Boolean getActive() {
return active;
return active == null ? false : active;
}
public void setActive(Boolean active) {

View File

@ -35,7 +35,7 @@ public class OfficialAccountProperties {
}
public Boolean getActivate() {
return activate;
return activate == null ? false : activate;
}
public void setActivate(Boolean activate) {

View File

@ -17,6 +17,11 @@
<artifactId>login-base</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>ink.wgink</groupId>
<artifactId>module-wechat</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>

View File

@ -1,10 +1,12 @@
package ink.wgink.login.wechat.controller.api.sign;
import ink.wgink.annotation.CheckRequestBodyAnnotation;
import ink.wgink.exceptions.PropertiesException;
import ink.wgink.interfaces.consts.ISystemConstant;
import ink.wgink.login.wechat.pojo.vos.sign.MiniAppLoginVO;
import ink.wgink.login.wechat.service.sign.IMiniAppSignService;
import ink.wgink.pojo.result.SuccessResultData;
import ink.wgink.properties.wechat.miniapp.MiniAppProperties;
import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
@ -27,12 +29,17 @@ import org.springframework.web.bind.annotation.RestController;
@RequestMapping(ISystemConstant.WECHAT_MINI_APP_PREFIX + "/sign")
public class MiniAppSignController {
@Autowired
private MiniAppProperties miniAppProperties;
@Autowired
private IMiniAppSignService miniAppSignService;
@PostMapping("default")
@CheckRequestBodyAnnotation
public SuccessResultData<String> defaultSign(@RequestBody MiniAppLoginVO miniAppLoginVO) throws Exception {
if (!miniAppProperties.getActive()) {
throw new PropertiesException("小程序配置未激活");
}
return new SuccessResultData<>(miniAppSignService.defaultSign(miniAppLoginVO));
}

View File

@ -15,8 +15,6 @@ import ink.wgink.pojo.result.SuccessResultData;
*/
public interface IMiniAppSignService {
String WECHAT_RANDOM_USER_PREFIX = "WX_";
/**
* 默认登录
*

View File

@ -7,11 +7,11 @@ import ink.wgink.exceptions.WechatAccessTokenForUserException;
import ink.wgink.exceptions.WechatUserInfoException;
import ink.wgink.interfaces.consts.ISystemConstant;
import ink.wgink.login.base.service.BaseAppSignService;
import ink.wgink.module.wechat.pojo.bos.miniapp.MiniAppUserInfoBO;
import ink.wgink.module.wechat.service.miniapp.IMiniAppUserService;
import ink.wgink.properties.wechat.miniapp.MiniAppProperties;
import ink.wgink.login.wechat.pojo.bos.user.MiniAppUserInfoBO;
import ink.wgink.login.wechat.pojo.vos.sign.MiniAppLoginVO;
import ink.wgink.login.wechat.service.sign.IMiniAppSignService;
import ink.wgink.login.wechat.service.user.IMiniAppUserService;
import ink.wgink.service.user.pojo.pos.UserPO;
import ink.wgink.service.user.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
@ -46,9 +46,6 @@ public class MiniAppSignServiceImpl extends BaseAppSignService implements IMiniA
if (miniAppLoginVO == null) {
throw new PropertiesException("未有相关配置");
}
if (miniAppProperties.getActive() == null || !miniAppProperties.getActive()) {
throw new PropertiesException("未激活小程序配置");
}
Map<String, Object> params = new HashMap<>(2);
params.put("appid", miniAppProperties.getAppKey());
params.put("secret", miniAppProperties.getAppSecret());
@ -74,7 +71,7 @@ public class MiniAppSignServiceImpl extends BaseAppSignService implements IMiniA
throw new SearchException("用户不存在");
}
String isRandomUsername = ISystemConstant.IS_FALSE_INT;
if (userPO.getUserUsername().startsWith(IMiniAppSignService.WECHAT_RANDOM_USER_PREFIX)) {
if (userPO.getUserUsername().startsWith(IMiniAppUserService.MINIAPP_RANDOM_USER_PREFIX)) {
isRandomUsername = ISystemConstant.IS_TRUE_INT;
}
return getToken(userPO) + "_" + isRandomUsername;

View File

@ -1,40 +0,0 @@
package ink.wgink.login.wechat.startup;
import ink.wgink.login.wechat.dao.user.IMiniAppUserDao;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
/**
* When you feel like quitting. Think about why you started
* 当你想要放弃的时候想想当初你为何开始
*
* @ClassName: LoginWechatStartUp
* @Description: 微信登录
* @Author: wanggeng
* @Date: 2021/4/9 11:44 上午
* @Version: 1.0
*/
@Component
public class LoginWechatStartUp implements ApplicationRunner {
private static final Logger LOG = LoggerFactory.getLogger(LoginWechatStartUp.class);
@Autowired
private IMiniAppUserDao miniAppUserDao;
@Override
public void run(ApplicationArguments args) throws Exception {
initTable();
}
/**
* 建表
*/
private void initTable() {
LOG.debug("创建 wechat_mini_app_user 表");
miniAppUserDao.createTable();
}
}

View File

@ -14,7 +14,7 @@
<dependencies>
<dependency>
<groupId>ink.wgink</groupId>
<artifactId>common</artifactId>
<artifactId>service-user</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>

View File

@ -2,6 +2,7 @@ package ink.wgink.module.wechat.controller.official.account;
import ink.wgink.common.base.DefaultBaseController;
import ink.wgink.exceptions.ParamsException;
import ink.wgink.exceptions.PropertiesException;
import ink.wgink.interfaces.consts.ISystemConstant;
import ink.wgink.module.wechat.enums.XmlEventTypeEnum;
import ink.wgink.module.wechat.enums.XmlMsgTypeEnum;
@ -9,6 +10,7 @@ import ink.wgink.module.wechat.pojo.vos.official.account.OfficialAccountUserVO;
import ink.wgink.module.wechat.result.OfficialAccountEventResult;
import ink.wgink.module.wechat.service.official.account.IOfficialAccountCheckService;
import ink.wgink.module.wechat.service.official.account.IOfficialAccountUserService;
import ink.wgink.properties.wechat.official.account.OfficialAccountProperties;
import ink.wgink.util.xml.XMLUtil;
import io.swagger.annotations.Api;
import org.apache.commons.lang3.StringUtils;
@ -41,6 +43,8 @@ import java.util.concurrent.CompletableFuture;
@RequestMapping(ISystemConstant.WECHAT_PREFIX + "/official/account")
public class OfficialAccountWechatController extends DefaultBaseController {
@Autowired
private OfficialAccountProperties officialAccountProperties;
@Autowired
private IOfficialAccountCheckService officialAccountCheckService;
@Autowired
@ -48,6 +52,9 @@ public class OfficialAccountWechatController extends DefaultBaseController {
@RequestMapping("event")
public void event(HttpServletRequest request, HttpServletResponse response) throws IOException {
if (!officialAccountProperties.getActivate()) {
throw new PropertiesException("公众号配置未激活");
}
// 处理认证
if (StringUtils.equalsIgnoreCase(HttpMethod.GET.toString(), request.getMethod())) {
officialAccountCheckService.checkSignature(request, response);
@ -102,7 +109,9 @@ public class OfficialAccountWechatController extends DefaultBaseController {
if (StringUtils.equalsIgnoreCase(XmlEventTypeEnum.SUBSCRIBE.getType(), officialAccountEventResult.getEvent())) {
OfficialAccountUserVO officialAccountUserVO = new OfficialAccountUserVO();
officialAccountUserVO.setOpenId(officialAccountEventResult.getFromUserName());
officialAccountUserService.save(officialAccountUserVO);
synchronized (this) {
officialAccountUserService.save(officialAccountUserVO);
}
} else if (StringUtils.equalsIgnoreCase(XmlEventTypeEnum.UNSUBSCRIBE.getType(), officialAccountEventResult.getEvent())) {
officialAccountUserService.updateStatus(officialAccountEventResult.getFromUserName(), XmlEventTypeEnum.UNSUBSCRIBE);
}

View File

@ -1,9 +1,9 @@
package ink.wgink.login.wechat.dao.user;
package ink.wgink.module.wechat.dao.miniapp;
import ink.wgink.exceptions.SaveException;
import ink.wgink.exceptions.SearchException;
import ink.wgink.exceptions.UpdateException;
import ink.wgink.login.wechat.pojo.pos.user.MiniAppUserPO;
import ink.wgink.module.wechat.pojo.pos.miniapp.MiniAppUserPO;
import org.springframework.stereotype.Repository;
import java.util.Map;

View File

@ -1,4 +1,4 @@
package ink.wgink.login.wechat.pojo.bos.user;
package ink.wgink.module.wechat.pojo.bos.miniapp;
/**
* When you feel like quitting. Think about why you started

View File

@ -1,4 +1,4 @@
package ink.wgink.login.wechat.pojo.pos.user;
package ink.wgink.module.wechat.pojo.pos.miniapp;
import java.io.Serializable;

View File

@ -1,6 +1,7 @@
package ink.wgink.login.wechat.service.user;
package ink.wgink.module.wechat.service.miniapp;
import ink.wgink.login.wechat.pojo.pos.user.MiniAppUserPO;
import ink.wgink.module.wechat.pojo.pos.miniapp.MiniAppUserPO;
import java.util.Map;
@ -16,6 +17,11 @@ import java.util.Map;
*/
public interface IMiniAppUserService {
/**
* 微信随机用户前缀
*/
String MINIAPP_RANDOM_USER_PREFIX = "WXM_";
/**
* 创建用户并返回用户ID已经存在的不操作
*

View File

@ -1,15 +1,13 @@
package ink.wgink.login.wechat.service.user.impl;
package ink.wgink.module.wechat.service.miniapp.impl;
import ink.wgink.common.base.DefaultBaseService;
import ink.wgink.login.wechat.dao.user.IMiniAppUserDao;
import ink.wgink.login.wechat.pojo.pos.user.MiniAppUserPO;
import ink.wgink.login.wechat.service.sign.IMiniAppSignService;
import ink.wgink.login.wechat.service.user.IMiniAppUserService;
import ink.wgink.service.user.pojo.pos.UserPO;
import ink.wgink.interfaces.consts.ISystemConstant;
import ink.wgink.module.wechat.dao.miniapp.IMiniAppUserDao;
import ink.wgink.module.wechat.pojo.pos.miniapp.MiniAppUserPO;
import ink.wgink.module.wechat.service.miniapp.IMiniAppUserService;
import ink.wgink.service.user.pojo.vos.UserVO;
import ink.wgink.service.user.service.IUserService;
import ink.wgink.util.date.DateUtil;
import ink.wgink.util.map.HashMapUtil;
import ink.wgink.util.string.WStringUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
@ -30,7 +28,7 @@ import java.util.Map;
@Service
public class MiniAppUserServiceImpl extends DefaultBaseService implements IMiniAppUserService {
@Value("${user.default-password:888888}")
@Value("${user.default-password:"+ ISystemConstant.DEFAULT_PASSWORD +"}")
private String defaultPassword;
@Autowired
private IMiniAppUserDao miniAppUserDao;
@ -47,8 +45,8 @@ public class MiniAppUserServiceImpl extends DefaultBaseService implements IMiniA
// 随机字符串
String randomUserName = WStringUtil.randomSubStr(openId, 6);
UserVO userVO = new UserVO();
userVO.setUserUsername(IMiniAppSignService.WECHAT_RANDOM_USER_PREFIX + randomUserName);
userVO.setUserName("微信" + randomUserName);
userVO.setUserUsername(MINIAPP_RANDOM_USER_PREFIX + randomUserName);
userVO.setUserName("微信M" + randomUserName);
userVO.setUserPassword(defaultPassword);
userVO.setUserState(0);
userVO.setUserType(2);

View File

@ -23,14 +23,19 @@ import java.util.Map;
public interface IOfficialAccountUserService {
/**
* 新增用户
* 公众号用户前缀
*/
String OFFICIAL_ACCOUNT_RANDOM_USER_PREFIX = "WX_";
/**
* 新增用户用户关注微信公众号时触执行创建随机账号如果已经有则修改订阅状态
*
* @param officialAccountUserVO
*/
void save(OfficialAccountUserVO officialAccountUserVO);
/**
* 修改状态
* 修改状态修改订阅状态
*
* @param openId
* @param xmlEventTypeEnum

View File

@ -1,6 +1,7 @@
package ink.wgink.module.wechat.service.official.account.impl;
import ink.wgink.common.base.DefaultBaseService;
import ink.wgink.interfaces.consts.ISystemConstant;
import ink.wgink.module.wechat.dao.official.account.IOfficialAccountUserDao;
import ink.wgink.module.wechat.enums.XmlEventTypeEnum;
import ink.wgink.module.wechat.pojo.dtos.official.account.OfficialAccountUserDTO;
@ -10,10 +11,13 @@ import ink.wgink.module.wechat.service.official.account.IOfficialAccountUserServ
import ink.wgink.pojo.ListPage;
import ink.wgink.pojo.result.SuccessResultList;
import ink.wgink.properties.wechat.official.account.OfficialAccountProperties;
import ink.wgink.service.user.pojo.vos.UserVO;
import ink.wgink.service.user.service.IUserService;
import ink.wgink.util.date.DateUtil;
import ink.wgink.util.map.HashMapUtil;
import ink.wgink.util.string.WStringUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.util.List;
@ -32,10 +36,14 @@ import java.util.Map;
@Service
public class OfficialAccountUserServiceImpl extends DefaultBaseService implements IOfficialAccountUserService {
@Value("${user.default-password:" + ISystemConstant.DEFAULT_PASSWORD + "}")
private String defaultPassword;
@Autowired
private IOfficialAccountUserDao officialAccountUserDao;
@Autowired
private OfficialAccountProperties officialAccountProperties;
@Autowired
private IUserService userService;
@Override
public void save(OfficialAccountUserVO officialAccountUserVO) {
@ -44,9 +52,24 @@ public class OfficialAccountUserServiceImpl extends DefaultBaseService implement
updateStatus(officialAccountUserVO.getOpenId(), XmlEventTypeEnum.SUBSCRIBE);
return;
}
// 创建随机用户
String openId = officialAccountUserVO.getOpenId();
// 随机字符串
String randomUserName = WStringUtil.randomSubStr(openId, 6);
UserVO userVO = new UserVO();
userVO.setUserUsername(OFFICIAL_ACCOUNT_RANDOM_USER_PREFIX + randomUserName);
userVO.setUserName("微信" + randomUserName);
userVO.setUserPassword(defaultPassword);
userVO.setUserState(0);
userVO.setUserType(2);
String userId = userService.saveAndReturnId(userVO, true);
String time = DateUtil.getTime();
officialAccountUserVO.setAppId(officialAccountProperties.getAppId());
// 用户码用于绑定账号时使用
// 绑定用户
officialAccountUserVO.setUserId(userId);
officialAccountUserVO.setUserCode(WStringUtil.randomSubStr(String.valueOf(System.currentTimeMillis()), 6));
// 标记为初始化账号
officialAccountUserVO.setIsInitAccount(1);

View File

@ -1,7 +1,9 @@
package ink.wgink.module.wechat.startup;
import ink.wgink.module.wechat.dao.miniapp.IMiniAppUserDao;
import ink.wgink.module.wechat.dao.official.account.IOfficialAccountUserDao;
import ink.wgink.module.wechat.manager.OfficialAccountAccessTokenManager;
import ink.wgink.properties.wechat.miniapp.MiniAppProperties;
import ink.wgink.properties.wechat.official.account.OfficialAccountProperties;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -25,8 +27,12 @@ import org.springframework.stereotype.Component;
public class WechatStartUp implements ApplicationRunner {
private static final Logger LOG = LoggerFactory.getLogger(WechatStartUp.class);
@Autowired
private MiniAppProperties miniAppProperties;
@Autowired
private OfficialAccountProperties officialAccountProperties;
@Autowired
private IMiniAppUserDao miniAppUserDao;
@Autowired
private IOfficialAccountUserDao officialAccountUserDao;
@Override
@ -35,13 +41,25 @@ public class WechatStartUp implements ApplicationRunner {
new Thread(() -> refreshOfficialAccountAccessToken()).start();
}
/**
* 建表
*/
private void initTable() {
LOG.debug("创建 wechat_official_account_user 表");
officialAccountUserDao.createTable();
if (miniAppProperties.getActive()) {
LOG.debug("创建 wechat_mini_app_user 表");
miniAppUserDao.createTable();
}
if (officialAccountProperties.getActivate()) {
LOG.debug("创建 wechat_official_account_user 表");
officialAccountUserDao.createTable();
}
}
@Scheduled(cron = "0 0/5 * * * ?")
public void refreshOfficialAccountAccessToken() {
if (!officialAccountProperties.getActivate()) {
return;
}
OfficialAccountAccessTokenManager.getInstance().refreshAccessToken(officialAccountProperties);
}

View File

@ -1,10 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="ink.wgink.login.wechat.dao.user.IMiniAppUserDao">
<mapper namespace="ink.wgink.module.wechat.dao.miniapp.IMiniAppUserDao">
<cache flushInterval="3600000"/>
<resultMap id="miniAppUserPO" type="ink.wgink.login.wechat.pojo.pos.user.MiniAppUserPO">
<resultMap id="miniAppUserPO" type="ink.wgink.module.wechat.pojo.pos.miniapp.MiniAppUserPO">
<result column="app_id" property="appId"/>
<result column="open_id" property="openId"/>
<result column="user_id" property="userId"/>

View File

@ -74,7 +74,7 @@ public class UserServiceImpl extends DefaultBaseService implements IUserService
private IUserAdjustmentService userAdjustmentService;
@Autowired
private PasswordEncoder passwordEncoder;
@Value("${user.default-password:88888888}")
@Value("${user.default-password:" + ISystemConstant.DEFAULT_PASSWORD + "}")
private String defaultPassword;
@Autowired
private IFileService fileService;