diff --git a/server/like-front/src/main/java/com/mdd/front/controller/UserController.java b/server/like-front/src/main/java/com/mdd/front/controller/UserController.java index c88b8848..d405cf98 100644 --- a/server/like-front/src/main/java/com/mdd/front/controller/UserController.java +++ b/server/like-front/src/main/java/com/mdd/front/controller/UserController.java @@ -2,8 +2,6 @@ package com.mdd.front.controller; import com.mdd.common.aop.NotLogin; import com.mdd.common.core.AjaxResult; -import com.mdd.common.exception.LoginException; -import com.mdd.common.exception.OperateException; import com.mdd.front.LikeFrontThreadLocal; import com.mdd.front.service.IUserService; import com.mdd.front.validate.users.*; @@ -96,4 +94,24 @@ public class UserController { return AjaxResult.success(); } + + + @PostMapping("/bindMnp") + @ApiOperation(value="绑定小程序") + public AjaxResult bindMnp(@Validated @RequestBody UserBindWechatValidate BindMnpValidate) { + Integer userId = LikeFrontThreadLocal.getUserId(); + iUserService.bindMnp(BindMnpValidate, userId); + return AjaxResult.success(); + } + + + @PostMapping("/bindOa") + @ApiOperation(value="绑定微信公众号") + public AjaxResult bindOa(@Validated @RequestBody UserBindWechatValidate BindOaValidate) { + Integer userId = LikeFrontThreadLocal.getUserId(); + iUserService.bindOa(BindOaValidate, userId); + return AjaxResult.success(); + } + + } diff --git a/server/like-front/src/main/java/com/mdd/front/service/IUserService.java b/server/like-front/src/main/java/com/mdd/front/service/IUserService.java index 579fec85..92305066 100644 --- a/server/like-front/src/main/java/com/mdd/front/service/IUserService.java +++ b/server/like-front/src/main/java/com/mdd/front/service/IUserService.java @@ -1,9 +1,6 @@ package com.mdd.front.service; -import com.mdd.front.validate.users.NewUserUpdateValidate; -import com.mdd.front.validate.users.UserForgetPwdValidate; -import com.mdd.front.validate.users.UserPhoneBindValidate; -import com.mdd.front.validate.users.UserUpdateValidate; +import com.mdd.front.validate.users.*; import com.mdd.front.vo.users.UserCenterVo; import com.mdd.front.vo.users.UserInfoVo; @@ -83,4 +80,21 @@ public interface IUserService { * @param userId 用户id */ void updateNewUserInfo(NewUserUpdateValidate newUserUpdateValidate, Integer userId); + + /** + * 绑定微信小程序 + * + * @param bindMnpValidate + * @param userId + */ + void bindMnp(UserBindWechatValidate bindMnpValidate, Integer userId); + + + /** + * 绑定微信公众号 + * + * @param bindOaValidate + * @param userId + */ + void bindOa(UserBindWechatValidate bindOaValidate, Integer userId); } diff --git a/server/like-front/src/main/java/com/mdd/front/service/impl/UserServiceImpl.java b/server/like-front/src/main/java/com/mdd/front/service/impl/UserServiceImpl.java index a8869134..f67d382d 100644 --- a/server/like-front/src/main/java/com/mdd/front/service/impl/UserServiceImpl.java +++ b/server/like-front/src/main/java/com/mdd/front/service/impl/UserServiceImpl.java @@ -2,6 +2,7 @@ package com.mdd.front.service.impl; import cn.binarywang.wx.miniapp.api.WxMaService; import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl; +import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult; import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo; import cn.binarywang.wx.miniapp.config.impl.WxMaDefaultConfigImpl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -17,13 +18,12 @@ import com.mdd.common.plugin.notice.NoticeCheck; import com.mdd.common.util.*; import com.mdd.front.LikeFrontThreadLocal; import com.mdd.front.service.IUserService; -import com.mdd.front.validate.users.NewUserUpdateValidate; -import com.mdd.front.validate.users.UserForgetPwdValidate; -import com.mdd.front.validate.users.UserPhoneBindValidate; -import com.mdd.front.validate.users.UserUpdateValidate; +import com.mdd.front.validate.users.*; import com.mdd.front.vo.users.UserCenterVo; import com.mdd.front.vo.users.UserInfoVo; +import me.chanjar.weixin.common.bean.oauth2.WxOAuth2AccessToken; import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.mp.api.WxMpService; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.util.Assert; @@ -321,4 +321,97 @@ public class UserServiceImpl implements IUserService { userMapper.updateById(user); } + + /** + * 绑定小程序 + * + * @param bindMnpValidate + * @param userId + */ + @Override + public void bindMnp(UserBindWechatValidate bindMnpValidate, Integer userId) { + try { + // 通过code获取微信信息 + String code = bindMnpValidate.getCode(); + WxMaService wxMaService = WeChatUtils.mnp(); + WxMaJscode2SessionResult sessionResult = wxMaService.getUserService().getSessionInfo(code); + String openId = sessionResult.getOpenid(); + String uniId = sessionResult.getUnionid(); + String unionId = uniId == null ? "0" : uniId; + + // 授权校验,未授权创建授权,已授权返回 + bindWechatAuth(openId, unionId, ClientEnum.MNP.getCode(), userId); + + } catch (WxErrorException e) { + throw new OperateException(e.getError().getErrorCode() + ", " + e.getError().getErrorMsg()); + } + } + + + /** + * 绑定公众号 + * + * @param bindOaValidate + * @param userId + */ + @Override + public void bindOa(UserBindWechatValidate bindOaValidate, Integer userId) { + try { + // 通过code获取微信信息 + WxMpService wxMpService = WeChatUtils.official(); + WxOAuth2AccessToken wxOAuth2AccessToken = wxMpService.getOAuth2Service().getAccessToken(bindOaValidate.getCode()); + String uniId = wxOAuth2AccessToken.getUnionId(); + String openId = wxOAuth2AccessToken.getOpenId(); + String unionId = uniId == null ? "0" : uniId; + + // 授权校验,未授权创建授权,已授权返回 + bindWechatAuth(openId, unionId, ClientEnum.OA.getCode(), userId); + + } catch (WxErrorException e) { + throw new OperateException(e.getError().getErrorCode() + ", " + e.getError().getErrorMsg()); + } + } + + + /** + * 绑定微信授权 + * + * @param openId + * @param unionId + * @param terminal + * @param userId + */ + public void bindWechatAuth(String openId, String unionId, Integer terminal, Integer userId) { + // 授权表中查找授权记录 + UserAuth userAuthOpenId = userAuthMapper.selectOne(new QueryWrapper() + .eq("openid", openId) + .last("limit 1")); + + if (userAuthOpenId != null) { + // 该微信已绑定 + throw new OperateException("该微信已绑定"); + } + + // 已有授权,返回已绑定微信。 没有授权,绑定微信 + if (!StringUtils.isBlank(unionId)) { + UserAuth userAuthUnionId = userAuthMapper.selectOne(new QueryWrapper() + .eq("unionid", unionId) + .last("limit 1")); + + if (userAuthUnionId != null && !userId.equals(userAuthUnionId.getUserId())) { + // 该微信已绑定 + throw new OperateException("该微信已绑定"); + } + } else { + UserAuth authModel = new UserAuth(); + authModel.setUserId(userId); + authModel.setUnionid(unionId); + authModel.setOpenid(openId); + authModel.setTerminal(terminal); + authModel.setCreateTime(System.currentTimeMillis() / 1000); + authModel.setUpdateTime(System.currentTimeMillis() / 1000); + userAuthMapper.insert(authModel); + } + } + } diff --git a/server/like-front/src/main/java/com/mdd/front/validate/users/UserBindWechatValidate.java b/server/like-front/src/main/java/com/mdd/front/validate/users/UserBindWechatValidate.java new file mode 100644 index 00000000..0e7b73ef --- /dev/null +++ b/server/like-front/src/main/java/com/mdd/front/validate/users/UserBindWechatValidate.java @@ -0,0 +1,20 @@ +package com.mdd.front.validate.users; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +@Data +@ApiModel("绑定微信小程序或公众号") +public class UserBindWechatValidate implements Serializable { + + private static final long serialVersionUID = 1L; + + @NotNull(message = "code参数缺失") + @ApiModelProperty(value = "微信code", required = true) + private String code; + +}