diff --git a/coolstore-partner-common/src/main/java/com/cool/store/constants/CommonConstants.java b/coolstore-partner-common/src/main/java/com/cool/store/constants/CommonConstants.java index c54ae5efa..6dfd1f3a7 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/constants/CommonConstants.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/constants/CommonConstants.java @@ -26,6 +26,11 @@ public class CommonConstants { public static final int NORMAL_LOCK_TIMES = 60 * 1000; + /** + * 短期token过期时间,单位秒 + */ + public static final int SHORT_TERM_TOKEN_EXPIRE = 60 * 5; + public static final int AN_HOUR_SECONDS = 3600; //十秒 public static final int TEN_SECONDS = 10000; @@ -55,6 +60,11 @@ public class CommonConstants { public static final String ZXJP_MINI_PROGRAM_LOGIN_FLAG = "zxjp_mini_program_login_flag:{0}"; + /** + * 小程序短期token key + */ + public static final String ZXJP_MIN_PROGRAM_SHORT_TERM_LOGIN_FLAG = "zxjp_mini_program_short_term_login_flag:{0}"; + public static final String ROOT_DEPT_ID_STR = "1"; public static final Integer DEAL_RECORD_MAX_SIZE = 1000; diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/wx/MiniProgramFreeLoginDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/wx/MiniProgramFreeLoginDTO.java new file mode 100644 index 000000000..14041c0ca --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/wx/MiniProgramFreeLoginDTO.java @@ -0,0 +1,21 @@ +package com.cool.store.dto.wx; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + *

+ * 小程序免登DTO + *

+ * + * @author wangff + * @since 2025/9/18 + */ +@Data +public class MiniProgramFreeLoginDTO { + @ApiModelProperty("手机号") + @NotBlank(message = "手机号不能为空") + private String mobile; +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/WechatMiniAppService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/WechatMiniAppService.java index fa329957e..d77703d46 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/WechatMiniAppService.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/WechatMiniAppService.java @@ -1,6 +1,7 @@ package com.cool.store.service; import com.cool.store.dto.wx.MiniAppUrlLinkReqDTO; +import com.cool.store.dto.wx.MiniProgramFreeLoginDTO; import com.cool.store.dto.wx.MiniProgramLoginDTO; import com.cool.store.request.MobileUpdateRequest; import com.cool.store.vo.PartnerUserInfoVO; @@ -28,4 +29,18 @@ public interface WechatMiniAppService { String getMiniAppUrl(); String getMiniAppUrlLink(MiniAppUrlLinkReqDTO miniAppUrlLinkReqDTO); + + /** + * 通过手机号获取短期token + * @param param 小程序免登DTO + * @return Token + */ + String getShortTermTokenByMobile(MiniProgramFreeLoginDTO param); + + /** + * 通过短期token获取用户信息 + * @param token 短期token + * @return 用户信息VO + */ + PartnerUserInfoVO getUserInfoByShortTermToken(String token); } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/WechatMiniAppServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/WechatMiniAppServiceImpl.java index dcdec32f3..169b77771 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/WechatMiniAppServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/WechatMiniAppServiceImpl.java @@ -17,6 +17,7 @@ import com.cool.store.utils.UUIDUtils; import com.cool.store.vo.PartnerUserInfoVO; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.apache.shiro.crypto.SecureRandomNumberGenerator; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; @@ -252,4 +253,30 @@ public class WechatMiniAppServiceImpl implements WechatMiniAppService { return null; } + @Override + public String getShortTermTokenByMobile(MiniProgramFreeLoginDTO param) { + HyPartnerUserInfoDO hyPartnerUserInfoDO = hyPartnerUserInfoDAO.selectByMobile(param.getMobile()); + if (Objects.isNull(hyPartnerUserInfoDO)) { + return ""; + } + PartnerUserInfoVO userInfoVO = BeanUtil.toBean(hyPartnerUserInfoDO, PartnerUserInfoVO.class); + fillLineInfo(userInfoVO, hyPartnerUserInfoDO.getPartnerId()); + String token = new SecureRandomNumberGenerator().nextBytes().toHex(); + String key = MessageFormat.format(CommonConstants.ZXJP_MIN_PROGRAM_SHORT_TERM_LOGIN_FLAG, token); + redisUtilPool.setString(key, JSONObject.toJSONString(userInfoVO), CommonConstants.SHORT_TERM_TOKEN_EXPIRE); + return token; + } + + @Override + public PartnerUserInfoVO getUserInfoByShortTermToken(String token) { + String key = MessageFormat.format(CommonConstants.ZXJP_MIN_PROGRAM_SHORT_TERM_LOGIN_FLAG, token); + String userStr = redisUtilPool.getString(key); + if (StringUtils.isNotBlank(userStr)) { + PartnerUserInfoVO userInfoVO = JSONObject.parseObject(userStr, PartnerUserInfoVO.class); + redisUtilPool.delKey(key); + return userInfoVO; + } + return null; + } + } diff --git a/coolstore-partner-web/src/main/java/com/cool/store/config/SignValidateFilter.java b/coolstore-partner-web/src/main/java/com/cool/store/config/SignValidateFilter.java index d96af4e4a..5fb922201 100644 --- a/coolstore-partner-web/src/main/java/com/cool/store/config/SignValidateFilter.java +++ b/coolstore-partner-web/src/main/java/com/cool/store/config/SignValidateFilter.java @@ -59,7 +59,8 @@ public class SignValidateFilter implements Filter { "/zxjp/mini/program/v1/partnerManage/openArea/areaApplyQuery", "/zxjp/**/api/audit/result", "/zxjp/**/api/license", - "/zxjp/mini/line/getRegionPayPic" + "/zxjp/mini/line/getRegionPayPic", + "/zxjp/mini/miniProgram/getUserInfoByToken" ); diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/OpenApiController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/OpenApiController.java index 5f67fa4e6..583927355 100644 --- a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/OpenApiController.java +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/OpenApiController.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.cool.store.context.PartnerUserHolder; import com.cool.store.dto.*; import com.cool.store.dto.store.StoreUserPositionDTO; +import com.cool.store.dto.wx.MiniProgramFreeLoginDTO; import com.cool.store.request.OpenApiStoreRequest; import com.cool.store.request.StoreCodeDTO; import com.cool.store.request.*; @@ -49,6 +50,8 @@ public class OpenApiController { StoreService storeService; @Resource MessageTemplateService messageTemplateService; + @Resource + WechatMiniAppService wechatMiniAppService; @PostMapping("/statusRefresh") public ApiResponse statusRefresh(@RequestBody StatusRefreshDTO statusRefreshDTO){ @@ -176,4 +179,10 @@ public class OpenApiController { public ApiResponse handleMessage(@RequestBody @Validated ThirdHandleMessageRequest request) { return messageTemplateService.thirdHandleMessage(request); } + + @ApiOperation("根据手机号获取短期token") + @PostMapping("/getShortTermToken") + public ApiResponse getTokenByMobile(@RequestBody @Validated MiniProgramFreeLoginDTO param) { + return ApiResponse.success(wechatMiniAppService.getShortTermTokenByMobile(param)); + } } diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniProgramAppController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniProgramAppController.java index fa6c0f6f4..6cd6686d4 100644 --- a/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniProgramAppController.java +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniProgramAppController.java @@ -7,6 +7,7 @@ import com.cool.store.response.ResponseResult; import com.cool.store.service.WechatMiniAppService; import com.cool.store.vo.PartnerUserInfoVO; import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; import org.springframework.web.bind.annotation.*; @@ -65,4 +66,11 @@ public class MiniProgramAppController { PartnerUserInfoVO userInfoVO = PartnerUserHolder.getUser(); return ResponseResult.success(userInfoVO); } + + @ApiOperation("根据短期token获取用户信息") + @ApiImplicitParam(name = "token", value = "短期token", required = true, dataType = "String", paramType = "query") + @GetMapping("/getUserInfoByToken") + public ResponseResult getUserInfoByToken(String token) { + return ResponseResult.success(wechatMiniAppService.getUserInfoByShortTermToken(token)); + } }