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 Binary Wang
*/
@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 doMiniLogin(@RequestBody @Valid AuthAccountPasswordLoginParam authAccountPasswordLoginParam) {
return CommonResult.data(authService.doMiniLogin(authAccountPasswordLoginParam, SaClientTypeEnum.B.getValue()));
}
/**
*
* 获取用户信息接口
*
*/
@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);
}
/**
*
* 获取用户绑定手机号信息
*
*/
@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);
}
}