绑定微信小程序或公众号

This commit is contained in:
mofung1 2023-03-20 10:32:18 +08:00
parent fd8e0d5fc8
commit a3aafaf552
4 changed files with 155 additions and 10 deletions

View File

@ -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<Object> bindMnp(@Validated @RequestBody UserBindWechatValidate BindMnpValidate) {
Integer userId = LikeFrontThreadLocal.getUserId();
iUserService.bindMnp(BindMnpValidate, userId);
return AjaxResult.success();
}
@PostMapping("/bindOa")
@ApiOperation(value="绑定微信公众号")
public AjaxResult<Object> bindOa(@Validated @RequestBody UserBindWechatValidate BindOaValidate) {
Integer userId = LikeFrontThreadLocal.getUserId();
iUserService.bindOa(BindOaValidate, userId);
return AjaxResult.success();
}
}

View File

@ -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);
}

View File

@ -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<UserAuth>()
.eq("openid", openId)
.last("limit 1"));
if (userAuthOpenId != null) {
// 该微信已绑定
throw new OperateException("该微信已绑定");
}
// 已有授权返回已绑定微信 没有授权绑定微信
if (!StringUtils.isBlank(unionId)) {
UserAuth userAuthUnionId = userAuthMapper.selectOne(new QueryWrapper<UserAuth>()
.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);
}
}
}

View File

@ -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;
}