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