Explorar el Código

后台可通过微信登录

zoujiajian hace 4 meses
padre
commit
335826fa32

+ 4 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/CmsUser.java

@@ -62,4 +62,8 @@ public class CmsUser extends BaseEntity{
 	@DbIgnore
 	@TableField(exist = false)
 	private String roleIds;
+
+    private String unionid;
+
+    private String openId;
 }

+ 14 - 0
netflix-dao/src/main/java/com/cyksj/model/request/CmsUserBindWxReq.java

@@ -0,0 +1,14 @@
+package com.cyksj.model.request;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class CmsUserBindWxReq {
+    private String bindWxKey;
+
+    private String phone;
+
+    private String code;
+}

+ 106 - 0
netflix-web/src/main/java/com/cyksj/web/controller/manage/cms/CmsAdminUserController.java

@@ -5,29 +5,42 @@ import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.lang.Validator;
+import cn.hutool.core.util.RandomUtil;
 import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.common.annotation.Log;
 import com.cyksj.common.constant.Constant;
 import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.common.snowflake.Sequence;
 import com.cyksj.common.util.Codec;
+import com.cyksj.common.util.Jsons;
+import com.cyksj.config.wxlogin.WxOpenPlatYHLXLoginConfig;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.BusinessType;
 import com.cyksj.enums.GatewayApiCode;
 import com.cyksj.enums.GatewayResponse;
 import com.cyksj.mapper.PhoneCodeMapper;
 import com.cyksj.mapper.manage.cms.CmsUserMapper;
+import com.cyksj.model.dto.AuthRedirect;
+import com.cyksj.model.dto.AuthToken;
+import com.cyksj.model.dto.CpsAuthDto;
+import com.cyksj.model.dto.GzhOAuth2UserInfo;
 import com.cyksj.model.entity.CmsUser;
 import com.cyksj.model.entity.PhoneCode;
 import com.cyksj.model.manage.dto.AdminInfo;
+import com.cyksj.model.request.CmsUserBindWxReq;
 import com.cyksj.model.request.CmsUserReq;
 import com.cyksj.model.views.CmsUserVO;
+import com.cyksj.redis.RedisService;
+import com.cyksj.service.authorization.AuthorizationService;
 import com.cyksj.service.mange.CmsAccountService;
 import com.cyksj.service.mange.business.UserBusinessRateService;
 import com.cyksj.service.mange.cms.CmsUserManager;
 import com.cyksj.service.mange.cms.manager.service.CacheService;
+import com.cyksj.service.wechat.WeChatService;
 import com.ejlchina.searcher.BeanSearcher;
 import com.ejlchina.searcher.SearchResult;
 import com.ejlchina.searcher.util.MapBuilder;
@@ -42,7 +55,9 @@ import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 import java.util.Date;
+import java.util.Optional;
 
 /*
  *项目名: netflix
@@ -71,6 +86,16 @@ public class CmsAdminUserController {
 
 	private final UserBusinessRateService userBusinessRateService;
 
+    private static final Sequence SEQUENCE = new Sequence(0);
+
+    private final RedisService redisService;
+
+    private final AuthorizationService authorizationService;
+
+    private final WxOpenPlatYHLXLoginConfig wxOpenPlatYHLXLoginConfig;
+
+    private final WeChatService weChatService;
+
 	@PostMapping(value = "/login")
 	public Result<String> login(@RequestBody CmsUser adminRequest) throws Exception {
 		CmsUser admin = cmsUserMapper.selectOne(
@@ -313,4 +338,85 @@ public class CmsAdminUserController {
 		SearchResult<CmsUserVO> search = beanSearcher.search(CmsUserVO.class, builder.build());
 		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
 	}
+
+
+    /**
+     * cps后台微信授权登录
+     */
+    @GetMapping("/wx/authLogin")
+    public Result<CpsAuthDto> wxAuthorize(String redirectUrl) throws Exception {
+        CpsAuthDto cpsAuthDto = new CpsAuthDto();
+        Long mappingId = SEQUENCE.nextId();
+        String authState = mappingId.toString();
+        redisService.set(authState, authState, 60 * 60 * 24L);
+        AuthRedirect redirect = new AuthRedirect().setMappingId(mappingId);
+        redirect.setUrl(redirectUrl);
+        String state = Codec.DoBase64.custom().setData(Jsons.toJson(redirect)).encodeAsText();
+        String wxAuthUrl = authorizationService.createWxAuthLoginUrl(state, wxOpenPlatYHLXLoginConfig.getAppId(), wxOpenPlatYHLXLoginConfig.getCpsRedirectUri());
+        cpsAuthDto.setAuthUrl(wxAuthUrl);
+        cpsAuthDto.setAuthState(authState);
+        return GatewayResponse.SUCCESS.newBuilder().toResult(cpsAuthDto);
+    }
+
+    /**
+     * 网页微信授权后跳转
+     */
+    @GetMapping("/wx/authLogin/baseRedirect")
+    public void wxAuthLoginRedirect(String code, String state, HttpServletResponse response) throws Exception {
+        if (StrUtil.isEmpty(state)) throw BusinessRuntimeException.getInstance("授权错误,请重新授权");
+        String json = Codec.DoBase64.custom().setData(state).decodeAsText();
+        AuthRedirect re = Jsons.parseObject(json, AuthRedirect.class);
+        AuthToken token = weChatService.getAuthToken(code, wxOpenPlatYHLXLoginConfig.getAppId());
+        GzhOAuth2UserInfo userinfo = weChatService.getUserInfo(token.getAccessToken(), token.getOpenid());
+        String unionId = userinfo.getUnionid();
+        String openId = userinfo.getOpenid();
+        CmsUser user = Optional.ofNullable(
+                        cmsUserMapper.selectOne(new LambdaQueryWrapper<CmsUser>().eq(CmsUser::getUnionid, unionId)
+                                .orderByAsc(CmsUser::getId)
+                                .last("limit 1")))
+                .orElseGet(() -> cmsUserMapper.selectOne(new LambdaQueryWrapper<CmsUser>().eq(CmsUser::getOpenId, openId)
+                        .orderByAsc(CmsUser::getId)
+                        .last("limit 1")));
+
+        if (user == null){
+            JSONObject jsonObject = new JSONObject();
+            jsonObject.put("openid", openId);
+            jsonObject.put("unionid", unionId);
+            String bindWxKey = RandomUtil.randomString(10);
+            redisService.set("cms_bind_wx:" + bindWxKey, jsonObject.toString(), 12 * 60L);
+
+            throw BusinessRuntimeException.getInstance("请绑定登录信息");
+        }
+
+        StpUtil.login(user.getId());
+        String cmsToken = StpUtil.getTokenValue();
+        String url = re.getUrl();
+        if (StrUtil.isNotBlank(url)) {
+            response.sendRedirect(url.contains("?") ? url + "&t=" + cmsToken : url + "?t=" + cmsToken);
+        }
+    }
+
+    /**
+     * 绑定微信用户
+     */
+    @PostMapping("/bind/wx")
+    public Result<AdminInfo> bindWx(@RequestBody CmsUserBindWxReq bindWxReq) throws Exception {
+        String bindWxKey = bindWxReq.getBindWxKey();
+        Object o = redisService.get("cms_bind_wx:" + bindWxKey);
+        if (o == null) {
+            throw BusinessRuntimeException.getInstance("绑定操作已失效,请重新扫码");
+        }
+        String phone = bindWxReq.getPhone();
+        String code = bindWxReq.getCode();
+        Result<AdminInfo> loginInfo = getLoginInfo(phone, code);
+
+        //绑定
+        CmsUser admin = cmsUserMapper.selectOne(
+                new QueryWrapper<CmsUser>().lambda().eq(CmsUser::getPhone, phone).last("limit 1"));
+        JSONObject jsonObject = Jsons.parseObject(o.toString(), JSONObject.class);
+        admin.setUnionid(jsonObject.get("unionid").toString());
+        admin.setOpenId(jsonObject.get("openid").toString());
+        cmsUserMapper.updateById(admin);
+        return loginInfo;
+    }
 }

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
netflix-web/src/main/resources/application-prd.yml


+ 1 - 0
netflix-web/src/main/resources/application-pre.yml

@@ -147,6 +147,7 @@ wx-login:
   cpsWebRedirectUri: https://cps.nf.video/test/cps/homePage
   userMirrorShopRedirectUri: https://bestaistore.com/8082/api/mirrorShop/manage/wx/authLogin/baseRedirect
   userMirrorShopLoginUrl: https://bestaistore.com/mirrorTest/web/
+  manageRedirectUri: https://cps.nf.video/8082/api/manage/user/wx/authLogin/baseRedirect
   remark: 银河录像网页微信登录
 
 wx-shop-login:

Algunos archivos no se mostraron porque demasiados archivos cambiaron en este cambio