WxMaUserController.java 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. package vip.xiaonuo.weixin.miniapp.controller;
  2. import cn.binarywang.wx.miniapp.api.WxMaService;
  3. import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
  4. import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
  5. import cn.binarywang.wx.miniapp.bean.WxMaUserInfo;
  6. import cn.binarywang.wx.miniapp.util.WxMaConfigHolder;
  7. import io.swagger.v3.oas.annotations.Operation;
  8. import jakarta.annotation.Resource;
  9. import jakarta.validation.Valid;
  10. import lombok.AllArgsConstructor;
  11. import lombok.extern.slf4j.Slf4j;
  12. import me.chanjar.weixin.common.error.WxErrorException;
  13. import org.apache.commons.lang3.StringUtils;
  14. import org.springframework.web.bind.annotation.*;
  15. import vip.xiaonuo.auth.core.enums.SaClientTypeEnum;
  16. import vip.xiaonuo.auth.modular.login.param.AuthAccountPasswordLoginParam;
  17. import vip.xiaonuo.auth.modular.login.service.AuthService;
  18. import vip.xiaonuo.common.pojo.CommonResult;
  19. import vip.xiaonuo.sys.modular.user.result.SysLoginUser;
  20. import vip.xiaonuo.sys.modular.user.service.SysUserService;
  21. import vip.xiaonuo.weixin.miniapp.model.JfcloudWxMaJscode2SessionResult;
  22. import vip.xiaonuo.weixin.util.JsonUtils;
  23. import java.util.Objects;
  24. /**
  25. * 微信小程序用户接口
  26. *
  27. * @author <a href="https://github.com/binarywang">Binary Wang</a>
  28. */
  29. @RestController
  30. @AllArgsConstructor
  31. @Slf4j
  32. @RequestMapping("/wx/user/{appid}")
  33. public class WxMaUserController {
  34. private final WxMaService wxMaService;
  35. private final SysUserService sysUserService;
  36. @Resource
  37. private AuthService authService;
  38. /**
  39. * 登陆接口
  40. */
  41. @GetMapping("/login")
  42. public String login(@PathVariable String appid, String code) {
  43. if (StringUtils.isBlank(code)) {
  44. return "empty jscode";
  45. }
  46. if (!wxMaService.switchover(appid)) {
  47. throw new IllegalArgumentException(String.format("未找到对应appid=[%s]的配置,请核实!", appid));
  48. }
  49. try {
  50. WxMaJscode2SessionResult session = wxMaService.getUserService().getSessionInfo(code);
  51. String openid = session.getOpenid();
  52. SysLoginUser loginUser = sysUserService.getUserByOpenId(openid);
  53. JfcloudWxMaJscode2SessionResult jfcloudWxMaJscode2SessionResult = new JfcloudWxMaJscode2SessionResult();
  54. jfcloudWxMaJscode2SessionResult.setOpenid(session.getOpenid());
  55. // jfcloudWxMaJscode2SessionResult.setSessionKey(session.getSessionKey());
  56. if (!Objects.isNull(loginUser)) {
  57. //非新用户,直接登录返回token
  58. String token = authService.doLoginByOpenId(openid, loginUser);
  59. //TODO 可以增加自己的逻辑,关联业务相关数据
  60. jfcloudWxMaJscode2SessionResult.setUser(loginUser);
  61. jfcloudWxMaJscode2SessionResult.setToken(token);
  62. jfcloudWxMaJscode2SessionResult.setOpenid(session.getOpenid());
  63. }
  64. return JsonUtils.toJson(jfcloudWxMaJscode2SessionResult);
  65. } catch (WxErrorException e) {
  66. log.error(e.getMessage(), e);
  67. return e.toString();
  68. } finally {
  69. WxMaConfigHolder.remove();//清理ThreadLocal
  70. }
  71. }
  72. @Operation(summary = "小程序密码登录")
  73. @PostMapping("/mini/login")
  74. public CommonResult<String> doMiniLogin(@RequestBody @Valid AuthAccountPasswordLoginParam authAccountPasswordLoginParam) {
  75. return CommonResult.data(authService.doMiniLogin(authAccountPasswordLoginParam, SaClientTypeEnum.B.getValue()));
  76. }
  77. /**
  78. * <pre>
  79. * 获取用户信息接口
  80. * </pre>
  81. */
  82. @GetMapping("/info")
  83. public String info(@PathVariable String appid, String sessionKey, String signature, String rawData, String encryptedData, String iv) {
  84. if (!wxMaService.switchover(appid)) {
  85. throw new IllegalArgumentException(String.format("未找到对应appid=[%s]的配置,请核实!", appid));
  86. }
  87. // 用户信息校验
  88. if (!wxMaService.getUserService().checkUserInfo(sessionKey, rawData, signature)) {
  89. WxMaConfigHolder.remove();//清理ThreadLocal
  90. return "user check failed";
  91. }
  92. // 解密用户信息
  93. WxMaUserInfo userInfo = wxMaService.getUserService().getUserInfo(sessionKey, encryptedData, iv);
  94. WxMaConfigHolder.remove();//清理ThreadLocal
  95. return JsonUtils.toJson(userInfo);
  96. }
  97. /**
  98. * <pre>
  99. * 获取用户绑定手机号信息
  100. * </pre>
  101. */
  102. @GetMapping("/phone")
  103. public String phone(@PathVariable String appid, String sessionKey, String signature, String rawData, String encryptedData, String iv) {
  104. if (!wxMaService.switchover(appid)) {
  105. throw new IllegalArgumentException(String.format("未找到对应appid=[%s]的配置,请核实!", appid));
  106. }
  107. // 用户信息校验
  108. if (!wxMaService.getUserService().checkUserInfo(sessionKey, rawData, signature)) {
  109. WxMaConfigHolder.remove();//清理ThreadLocal
  110. return "user check failed";
  111. }
  112. // 解密
  113. WxMaPhoneNumberInfo phoneNoInfo = wxMaService.getUserService().getPhoneNoInfo(sessionKey, encryptedData, iv);
  114. WxMaConfigHolder.remove();//清理ThreadLocal
  115. return JsonUtils.toJson(phoneNoInfo);
  116. }
  117. }