package com.template.controller; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.github.pagehelper.util.StringUtil; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import com.template.annotation.PassToken; import com.template.api.WechatScanLoginControllerAPI; import com.template.common.constanst.Constanst; import com.template.common.result.ResponseStatusEnum; import com.template.common.utils.*; import com.template.model.evaluate.student.SmartEvaluateStudent; import com.template.model.evaluate.student.SmartSubjectManage; import com.template.model.pojo.SmartAuthority; import com.template.model.pojo.SmartUser; import com.template.model.pojo.SmsCode; import com.template.model.result.CommonResult; import com.template.model.result.PageUtils; import com.template.model.tongji.*; import com.template.model.vo.LoginVO; import com.template.model.weixin.AccessToken; import com.template.model.weixin.HttpParame; import com.template.model.weixin.WechatUserUnionID; import com.template.services.*; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.io.UnsupportedEncodingException; import java.math.BigDecimal; import java.net.URLEncoder; import java.text.ParseException; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; /** * Title: WechatScanLoginController * Description: 微信扫码登录controller * * @author fengyong * @date 2018年9月7日 */ @Controller public class WechatScanLoginController implements WechatScanLoginControllerAPI { @Autowired private WechatScanLoginService wechatScanLoginService; @Autowired public SmartUserService smartUserService; @Autowired public SmartAuthorityService smartAuthorityService; @Autowired public SmartAuthorGroupService smartAuthorGroupService; @Autowired public SmsCodeService smsCodeService; /** * Title: list * Description: 重定向到微信扫码登录二维码页面 * 此处显示要微信要扫描的二维码 * * @param model * @return * @throws UnsupportedEncodingException */ @Override @PassToken public String login(Model model) throws UnsupportedEncodingException { Map wechatLoginUrl = wechatScanLoginService.wechatLoginUrl(); String url = wechatLoginUrl.get("url"); System.out.println(url); return "redirect:" + url; } /** * Title: callback * Description: 回调地址处理 * * @param code * @param state * @return * @return */ @Override @PassToken public String callback(String code, String state) throws UnsupportedEncodingException { System.out.println(code+"====="+state); if (code != null && state != null) { // 验证state为了用于防止跨站请求伪造攻击 String decrypt = AesUtil.decrypt(AesUtil.parseHexStr2Byte(state), AesUtil.PASSWORD_SECRET_KEY, 16); if (!decrypt.equals(Constanst.PWD_MD5 + DateUtils.getYYYYMMdd())) { return "redirect:"+HttpParame.FRONT_URI+"/#/login?message=" + URLEncoder.encode("请勿非法进入", "UTF-8"); } AccessToken access = wechatScanLoginService.getAccessToken(code); System.out.println("access:"+access); if (access != null) { String openid = access.getOpenid(); System.out.println("openid: "+openid); SmartUser user = wechatScanLoginService.selectByOpenid(openid); if (user==null) { /*不存在*/ return "redirect:"+HttpParame.FRONT_URI+"/#/login?message=" + URLEncoder.encode("请绑定信息", "UTF-8"); } else { String token = JWTUtil.getToken(user); QueryWrapper queryWrapper1 = new QueryWrapper<>(); queryWrapper1.eq("deleted", 0); queryWrapper1.eq("user_id", user.getId()); List query = smartAuthorityService.getAuthorByKey(queryWrapper1); if (query.size()>0){ return "redirect:"+HttpParame.FRONT_URI+"/#/wanzai/home?token=" + token; } else { return "redirect:"+HttpParame.FRONT_URI+"/#/login?message=" + URLEncoder.encode("无登录权限", "UTF-8"); } } } } return null; } /** * Title: bindingUserMac2 * Description: 跳转到绑定用户系统帐号页面 * @return */ @Override @PassToken public String bindUserMac(String phone,String messageCode) throws UnsupportedEncodingException { if (StringUtils.isBlank(phone) || StringUtils.isBlank(messageCode)){ return "redirect:"+HttpParame.FRONT_URI+"/#/login?message=" + URLEncoder.encode("请输入信息", "UTF-8"); } Map wechatLoginUrl = wechatScanLoginService.wechatBindUrl(phone,messageCode); String url = wechatLoginUrl.get("url"); System.out.println(url); return "redirect:" + url; } @Override @PassToken public String bindcallback(String code, String state, String phone,String messageCode) throws UnsupportedEncodingException { System.out.println(code+"==="+state+"=="+messageCode); if (code != null && state != null) { // 验证state为了用于防止跨站请求伪造攻击 String decrypt = AesUtil.decrypt(AesUtil.parseHexStr2Byte(state), AesUtil.PASSWORD_SECRET_KEY, 16); if (!decrypt.equals(Constanst.PWD_MD5 + DateUtils.getYYYYMMdd())) { return "redirect:"+HttpParame.FRONT_URI+"/#/login?message=" + URLEncoder.encode("请勿非法进入", "UTF-8"); } AccessToken access = wechatScanLoginService.getAccessToken(code); if (access != null) { String openid = access.getOpenid(); QueryWrapper queryWrapper1 = new QueryWrapper<>(); queryWrapper1.eq("deleted", 0); queryWrapper1.eq("is_verify",0); queryWrapper1.eq("phone_number",phone); queryWrapper1.eq("code",code); queryWrapper1.ge("expiration_time", new Date()); List listc = smsCodeService.getSmsCodeByKey(queryWrapper1); if (listc.isEmpty()){ return "redirect:"+HttpParame.FRONT_URI+"/#/login?message=" + URLEncoder.encode("验证码已失效", "UTF-8"); } QueryWrapper queryWrapper2 = new QueryWrapper<>(); queryWrapper2.eq("deleted", 0); queryWrapper2.eq("phone", phone); List userc = smartUserService.list(queryWrapper2); if (userc.isEmpty()){ return "redirect:"+HttpParame.FRONT_URI+"/#/login?message=" + URLEncoder.encode("用户不存在", "UTF-8"); } userc.get(0).setOpenId(openid); int m = wechatScanLoginService.updateSmartUser(userc.get(0)); if (m>0){ String token = JWTUtil.getToken(userc.get(0)); QueryWrapper queryWrapper3 = new QueryWrapper<>(); queryWrapper3.eq("deleted", 0); queryWrapper3.eq("user_id", userc.get(0).getId()); List query = smartAuthorityService.getAuthorByKey(queryWrapper3); if (query.size()>0){ return "redirect:"+HttpParame.FRONT_URI+"/#/wanzai/home?token=" + token; } else { return "redirect:"+HttpParame.FRONT_URI+"/#/login?message=" + URLEncoder.encode("无登录权限", "UTF-8"); } } } } return "redirect:"+HttpParame.FRONT_URI+"/#/login?message=" + URLEncoder.encode("系统异常", "UTF-8"); } @Override @PassToken public String insertMonthMeter(String month){ if (month==null){ month=TimeExchange2.getMonth(); } wechatScanLoginService.insertMonthMeter(month); return "插入完毕"; } @Override @PassToken public String insertDayMeter(String day){ if (day==null){ day=TimeExchange2.getDateStr(); } wechatScanLoginService.insertDayMeter(day); return "插入完毕"; } /** * Description: 用户类别统计 */ @Override @PassToken public CommonResult getUserIdTj(){ List list = wechatScanLoginService.getUserIdTj(); return CommonResult.ok(list); } /** * Description: 用户总数 */ @Override @PassToken public CommonResult getUserIdTjt(){ All list = wechatScanLoginService.getUserIdTjt(); return CommonResult.ok(list); } /** * Description: 水表总计 */ @Override @PassToken public CommonResult getWaterTj(){ DAll list = wechatScanLoginService.getWaterTj(); return CommonResult.ok(list); } /** * Description: 电表总计 */ @Override @PassToken public CommonResult getElcTj(){ DAll list = wechatScanLoginService.getElcTj(); return CommonResult.ok(list); } /** * Description: 每月水费查询 */ @Override @PassToken public CommonResult getMonWater() throws ParseException { List list = wechatScanLoginService.getMonWater(); return CommonResult.ok(list); } /** * Description: 每月电费查询 */ @Override @PassToken public CommonResult getMonElc() throws ParseException { List list = wechatScanLoginService.getMonElc(); return CommonResult.ok(list); } /** * Description: 区域能耗统计 */ @Override @PassToken public CommonResult getMeterMonthPage(@RequestBody MeterMonthData meterMonthData,int currentPage, int pageCount) { PageHelper.startPage(currentPage, pageCount); PageInfo list = wechatScanLoginService.getMeterMonthPage(meterMonthData); return CommonResult.ok(list); } /** * Description: 实时抄表 */ @Override @PassToken public CommonResult getMeterDayPage(@RequestBody MeterMonthData meterMonthData, int currentPage, int pageCount) { PageHelper.startPage(currentPage, pageCount); PageInfo list = wechatScanLoginService.getMeterDayPage(meterMonthData); return CommonResult.ok(list); } /** * Description: 查轨迹 */ @Override @PassToken public CommonResult getPosition() { List> ld = RandomTrackAlgorithm.getPosition(); return CommonResult.ok(ld); } @Override @PassToken public CommonResult vertify(String code){ if (StringUtils.isBlank(code)){ return CommonResult.fail("请传入code"); } String url = "https://api.weixin.qq.com/sns/jscode2session?" + "appid=" + PropertiesUtil.getValue(HttpParame.APPID) + "&secret=" + PropertiesUtil.getValue(HttpParame.SECRET) + "&js_code=" + code + "&grant_type=authorization_code"; String json = HttpClientUtils.getInstance().sendHttpGet(url); Gson gson = new Gson(); HashMap userMap = gson.fromJson(json.toString(), new TypeToken>() {}.getType()); String openid = ""; try { openid = userMap.get("openid").toString(); } catch (Exception e) { return CommonResult.fail("code异常"); } SmartUser user = wechatScanLoginService.selectByOpenid(openid); if (user==null){ return CommonResult.fail("请绑定后再进入"); } String token = JWTUtil.getToken(user); JSONObject jsonObject = new JSONObject(); jsonObject.put("token", token); jsonObject.put("user", user); return CommonResult.ok(jsonObject.toString()); } @Override @PassToken public CommonResult sendMessage(String phone){ QueryWrapper queryWrapper1 = new QueryWrapper<>(); queryWrapper1.eq("deleted", 0); queryWrapper1.eq("phone",phone); queryWrapper1.eq("is_cancel",0); List list = smartUserService.list(queryWrapper1); if (list.isEmpty()){ return CommonResult.fail("该手机无权限登录"); } QueryWrapper queryWrapper2 = new QueryWrapper<>(); queryWrapper2.eq("deleted", 0); queryWrapper2.eq("is_verify",0); queryWrapper2.eq("phone_number",phone); queryWrapper2.ge("expiration_time", new Date()); List listc = smsCodeService.getSmsCodeByKey(queryWrapper2); if (!listc.isEmpty()){ return CommonResult.fail("操作频繁,请稍后再试"); } String code = GetVertifyCode.getRandomNumCode(6); SmsCode smsCode = new SmsCode(); smsCode.setId(UUIDUtil.generateID()); smsCode.setPhoneNumber(phone); smsCode.setCode(code); long time = new Date().getTime() + 60000L; smsCode.setExpirationTime(new Date(time)); smsCode.setIsVerify("0"); smsCode.setDeleted(0); int m = smsCodeService.insertSmsCode(smsCode); if (m>0){ String message = SendSms.sendSms(phone, code); if (message.contains("success")){ return CommonResult.ok("发送成功"); } } return CommonResult.fail("操作失败"); } @Override @PassToken public CommonResult vertifyMessage(String phone,String code, String wxcode){ QueryWrapper queryWrapper1 = new QueryWrapper<>(); queryWrapper1.eq("deleted", 0); queryWrapper1.eq("is_verify",0); queryWrapper1.eq("phone_number",phone); queryWrapper1.eq("code",code); queryWrapper1.ge("expiration_time", new Date()); List listc = smsCodeService.getSmsCodeByKey(queryWrapper1); if (listc.isEmpty()){ return CommonResult.ok("验证码已失效"); } if (StringUtils.isBlank(wxcode)){ return CommonResult.fail("请传入wxcode"); } String url = "https://api.weixin.qq.com/sns/jscode2session?" + "appid=" + PropertiesUtil.getValue(HttpParame.APPID) + "&secret=" + PropertiesUtil.getValue(HttpParame.SECRET) + "&js_code=" + wxcode + "&grant_type=authorization_code"; String json = HttpClientUtils.getInstance().sendHttpGet(url); Gson gson = new Gson(); HashMap userMap = gson.fromJson(json.toString(), new TypeToken>() {}.getType()); String openid = ""; try { openid = userMap.get("openid").toString(); } catch (Exception e) { return CommonResult.fail("code异常"); } QueryWrapper queryWrapper2 = new QueryWrapper<>(); queryWrapper2.eq("deleted", 0); queryWrapper2.eq("phone", phone); List user = smartUserService.list(queryWrapper2); if (user.isEmpty()){ return CommonResult.fail("该用户不存在"); } user.get(0).setOpenId(openid); smartUserService.updateSmartUser(user.get(0)); String token = JWTUtil.getToken(user.get(0)); JSONObject jsonObject = new JSONObject(); jsonObject.put("token", token); jsonObject.put("user", user.get(0)); return CommonResult.ok(jsonObject); } }