package com.ics.controller.mobile; 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 cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.aliyun.oss.ServiceException; import com.ics.admin.domain.IcsCustomerStaff; import com.ics.admin.service.IIcsCustomerStaffService; import com.ics.common.annotation.LoginUser; import com.ics.common.constant.Constants; import com.ics.common.core.controller.BaseController; import com.ics.common.core.domain.R; import com.ics.common.exception.user.UserPasswordNotMatchException; import com.ics.common.utils.DateUtils; import com.ics.common.utils.MessageUtils; import com.ics.common.utils.RandomUtil; import com.ics.common.utils.StringUtils; import com.ics.common.utils.bean.BeanUtils; import com.ics.service.IWxAppLoginService; import com.ics.system.domain.User; import com.ics.system.domain.form.LoginRequest; import com.ics.system.log.publish.PublishFactory; import com.ics.system.service.IAccessTokenService; import com.ics.system.service.IUserService; import com.ics.system.util.PasswordUtils; import lombok.extern.slf4j.Slf4j; import me.chanjar.weixin.common.error.WxErrorException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.concurrent.TimeUnit; /** * 微信用户直接登录 * * @author jack */ @Slf4j @RestController public class WxLoginAPIController extends BaseController { @Autowired private IIcsCustomerStaffService icsCustomerStaffService; @Autowired private IAccessTokenService tokenService; @Autowired private WxMaService wxMaService; @Autowired private RedisTemplate redisTemplate; String smallWxAccessTokenKey = "smallWxAccessToken"; String smallWxUserPassword = "123456"; @PostMapping("/weixin/login") public R login(@RequestBody Map paramMap) { // 参数 String jsCode = paramMap.get("jsCode"); // 必填 if (org.apache.commons.lang3.StringUtils.isBlank(jsCode)) { throw new RuntimeException("请传递jsCode"); } // 小程序登录 JSONObject sessionObject = SmallWxOkHttp.code2Session(jsCode); String openid = sessionObject.getString("openid"); String unionid = sessionObject.getString("unionid"); // R ajax = R.ok(); // 校验用户是否存在 IcsCustomerStaff sysUser = icsCustomerStaffService.selectUserByOpenid(openid); // 用户存在直接获取token if (sysUser != null) { String phonenumber = sysUser.getMobile(); User user = new User(); PublishFactory.recordLoginInfo(sysUser.getUsername(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")); BeanUtils.copyBeanProp(user, sysUser); Map token = tokenService.createToken(user); ajax.put(Constants.TOKEN, token); // ajax.put(Constants.TOKEN, token); ajax.put("user", sysUser); ajax.put("openid", openid); return ajax; } else { // 用户不存在返回openid进行注册登录 ajax.put("openid", openid); return ajax; } } @PostMapping("/social_user_login/login") public R social(@RequestBody Map paramMap) { try { // 参数 String code = paramMap.get("code"); String openid = paramMap.get("openid"); // 必填 if (StringUtils.isBlank(code)) { throw new RuntimeException("请传递code"); } if (StringUtils.isBlank(openid)) { throw new RuntimeException("请传递openid"); } // 获取微信小程序 AccessToken String smallWxAccessToken = getSmallWxAccessToken(); // 获取手机号 JSONObject jsonObj = SmallWxOkHttp.getPhoneNumber(code, openid, smallWxAccessToken); JSONObject phoneInfo = jsonObj.getJSONObject("phone_info"); // 手机号 String phoneNumber = phoneInfo.getString("phoneNumber"); IcsCustomerStaff icsCustomerStaff = new IcsCustomerStaff(); icsCustomerStaff.setMobile(phoneNumber); List list = icsCustomerStaffService.selectIcsCustomerStaffList(icsCustomerStaff); if(list.size()>0){ User user = new User(); PublishFactory.recordLoginInfo(list.get(0).getUsername(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")); BeanUtils.copyBeanProp(user,list.get(0)); Map token = tokenService.createToken(user); R ajax = R.ok(); ajax.put(Constants.TOKEN, token); // ajax.put(Constants.TOKEN, token); ajax.put("user", user); ajax.put("openid", openid); return ajax; }else { // 新增用户信息 icsCustomerStaff.setUsername(phoneNumber); icsCustomerStaff.setDataType(Constants.CUSTOMER_VISIT); icsCustomerStaff.setOpenid(openid); icsCustomerStaff.setGender("0"); icsCustomerStaff.setStatus("0"); int i = icsCustomerStaffService.insertIcsCustomerStaff(icsCustomerStaff); return toAjax(i); } } catch (Exception e) { log.error(e.getMessage(), e); return R.error("获取微信用户数据失败"); } } /** * 获取微信小程序AccessToken */ public String getSmallWxAccessToken() { // 从缓存获取微信小程序 AccessToken String smallWxAccessToken = redisTemplate.opsForValue().get(smallWxAccessTokenKey); if (StringUtils.isBlank(smallWxAccessToken)) { smallWxAccessToken = SmallWxOkHttp.getAccessToken(); redisTemplate.opsForValue().set(smallWxAccessTokenKey, smallWxAccessToken, 7200, TimeUnit.SECONDS); } return smallWxAccessToken; } @PostMapping("/wx/getUserInfo") public R login(@RequestBody String mobile) { try { //检查是否是否存在 IcsCustomerStaff icsCustomerStaff = new IcsCustomerStaff(); icsCustomerStaff.setMobile(mobile); List list = icsCustomerStaffService.selectIcsCustomerStaffList(icsCustomerStaff); if(list.size()>0){ IcsCustomerStaff icsCustomerStaff1 = list.get(0); return R.ok().put("data",icsCustomerStaff1); }else { return R.error("获取微信用户数据失败"); } } catch (Exception e) { return R.error("获取微信用户数据失败"); } } }