| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 |
- package vip.xiaonuo.weixin.miniapp.controller;
- import cn.binarywang.wx.miniapp.api.WxMaService;
- import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
- import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
- import cn.binarywang.wx.miniapp.bean.WxMaUserInfo;
- import cn.binarywang.wx.miniapp.util.WxMaConfigHolder;
- import io.swagger.v3.oas.annotations.Operation;
- import jakarta.annotation.Resource;
- import jakarta.validation.Valid;
- import lombok.AllArgsConstructor;
- import lombok.extern.slf4j.Slf4j;
- import me.chanjar.weixin.common.error.WxErrorException;
- import org.apache.commons.lang3.StringUtils;
- import org.springframework.web.bind.annotation.*;
- import vip.xiaonuo.auth.core.enums.SaClientTypeEnum;
- import vip.xiaonuo.auth.modular.login.param.AuthAccountPasswordLoginParam;
- import vip.xiaonuo.auth.modular.login.service.AuthService;
- import vip.xiaonuo.common.pojo.CommonResult;
- import vip.xiaonuo.sys.modular.user.result.SysLoginUser;
- import vip.xiaonuo.sys.modular.user.service.SysUserService;
- import vip.xiaonuo.weixin.miniapp.model.JfcloudWxMaJscode2SessionResult;
- import vip.xiaonuo.weixin.util.JsonUtils;
- import java.util.Objects;
- /**
- * 微信小程序用户接口
- *
- * @author <a href="https://github.com/binarywang">Binary Wang</a>
- */
- @RestController
- @AllArgsConstructor
- @Slf4j
- @RequestMapping("/wx/user/{appid}")
- public class WxMaUserController {
- private final WxMaService wxMaService;
- private final SysUserService sysUserService;
- @Resource
- private AuthService authService;
- /**
- * 登陆接口
- */
- @GetMapping("/login")
- public String login(@PathVariable String appid, String code) {
- if (StringUtils.isBlank(code)) {
- return "empty jscode";
- }
- if (!wxMaService.switchover(appid)) {
- throw new IllegalArgumentException(String.format("未找到对应appid=[%s]的配置,请核实!", appid));
- }
- try {
- WxMaJscode2SessionResult session = wxMaService.getUserService().getSessionInfo(code);
- String openid = session.getOpenid();
- SysLoginUser loginUser = sysUserService.getUserByOpenId(openid);
- JfcloudWxMaJscode2SessionResult jfcloudWxMaJscode2SessionResult = new JfcloudWxMaJscode2SessionResult();
- jfcloudWxMaJscode2SessionResult.setOpenid(session.getOpenid());
- // jfcloudWxMaJscode2SessionResult.setSessionKey(session.getSessionKey());
- if (!Objects.isNull(loginUser)) {
- //非新用户,直接登录返回token
- String token = authService.doLoginByOpenId(openid, loginUser);
- //TODO 可以增加自己的逻辑,关联业务相关数据
- jfcloudWxMaJscode2SessionResult.setUser(loginUser);
- jfcloudWxMaJscode2SessionResult.setToken(token);
- jfcloudWxMaJscode2SessionResult.setOpenid(session.getOpenid());
- }
- return JsonUtils.toJson(jfcloudWxMaJscode2SessionResult);
- } catch (WxErrorException e) {
- log.error(e.getMessage(), e);
- return e.toString();
- } finally {
- WxMaConfigHolder.remove();//清理ThreadLocal
- }
- }
- @Operation(summary = "小程序密码登录")
- @PostMapping("/mini/login")
- public CommonResult<String> doMiniLogin(@RequestBody @Valid AuthAccountPasswordLoginParam authAccountPasswordLoginParam) {
- return CommonResult.data(authService.doMiniLogin(authAccountPasswordLoginParam, SaClientTypeEnum.B.getValue()));
- }
- /**
- * <pre>
- * 获取用户信息接口
- * </pre>
- */
- @GetMapping("/info")
- public String info(@PathVariable String appid, String sessionKey, String signature, String rawData, String encryptedData, String iv) {
- if (!wxMaService.switchover(appid)) {
- throw new IllegalArgumentException(String.format("未找到对应appid=[%s]的配置,请核实!", appid));
- }
- // 用户信息校验
- if (!wxMaService.getUserService().checkUserInfo(sessionKey, rawData, signature)) {
- WxMaConfigHolder.remove();//清理ThreadLocal
- return "user check failed";
- }
- // 解密用户信息
- WxMaUserInfo userInfo = wxMaService.getUserService().getUserInfo(sessionKey, encryptedData, iv);
- WxMaConfigHolder.remove();//清理ThreadLocal
- return JsonUtils.toJson(userInfo);
- }
- /**
- * <pre>
- * 获取用户绑定手机号信息
- * </pre>
- */
- @GetMapping("/phone")
- public String phone(@PathVariable String appid, String sessionKey, String signature, String rawData, String encryptedData, String iv) {
- if (!wxMaService.switchover(appid)) {
- throw new IllegalArgumentException(String.format("未找到对应appid=[%s]的配置,请核实!", appid));
- }
- // 用户信息校验
- if (!wxMaService.getUserService().checkUserInfo(sessionKey, rawData, signature)) {
- WxMaConfigHolder.remove();//清理ThreadLocal
- return "user check failed";
- }
- // 解密
- WxMaPhoneNumberInfo phoneNoInfo = wxMaService.getUserService().getPhoneNoInfo(sessionKey, encryptedData, iv);
- WxMaConfigHolder.remove();//清理ThreadLocal
- return JsonUtils.toJson(phoneNoInfo);
- }
- }
|