WechatScanLoginController.java 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424
  1. package com.template.controller;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  4. import com.github.pagehelper.PageHelper;
  5. import com.github.pagehelper.PageInfo;
  6. import com.github.pagehelper.util.StringUtil;
  7. import com.google.gson.Gson;
  8. import com.google.gson.reflect.TypeToken;
  9. import com.template.annotation.PassToken;
  10. import com.template.api.WechatScanLoginControllerAPI;
  11. import com.template.common.constanst.Constanst;
  12. import com.template.common.result.ResponseStatusEnum;
  13. import com.template.common.utils.*;
  14. import com.template.model.evaluate.student.SmartEvaluateStudent;
  15. import com.template.model.evaluate.student.SmartSubjectManage;
  16. import com.template.model.pojo.SmartAuthority;
  17. import com.template.model.pojo.SmartUser;
  18. import com.template.model.pojo.SmsCode;
  19. import com.template.model.result.CommonResult;
  20. import com.template.model.result.PageUtils;
  21. import com.template.model.tongji.*;
  22. import com.template.model.vo.LoginVO;
  23. import com.template.model.weixin.AccessToken;
  24. import com.template.model.weixin.HttpParame;
  25. import com.template.model.weixin.WechatUserUnionID;
  26. import com.template.services.*;
  27. import org.apache.commons.lang3.StringUtils;
  28. import org.springframework.beans.factory.annotation.Autowired;
  29. import org.springframework.stereotype.Controller;
  30. import org.springframework.ui.Model;
  31. import org.springframework.web.bind.annotation.GetMapping;
  32. import org.springframework.web.bind.annotation.RequestBody;
  33. import org.springframework.web.bind.annotation.RequestMapping;
  34. import org.springframework.web.bind.annotation.RestController;
  35. import java.io.UnsupportedEncodingException;
  36. import java.math.BigDecimal;
  37. import java.net.URLEncoder;
  38. import java.text.ParseException;
  39. import java.util.Date;
  40. import java.util.HashMap;
  41. import java.util.List;
  42. import java.util.Map;
  43. /**
  44. * Title: WechatScanLoginController
  45. * Description: 微信扫码登录controller
  46. *
  47. * @author fengyong
  48. * @date 2018年9月7日
  49. */
  50. @Controller
  51. public class WechatScanLoginController implements WechatScanLoginControllerAPI {
  52. @Autowired
  53. private WechatScanLoginService wechatScanLoginService;
  54. @Autowired
  55. public SmartUserService smartUserService;
  56. @Autowired
  57. public SmartAuthorityService smartAuthorityService;
  58. @Autowired
  59. public SmartAuthorGroupService smartAuthorGroupService;
  60. @Autowired
  61. public SmsCodeService smsCodeService;
  62. /**
  63. * Title: list
  64. * Description: 重定向到微信扫码登录二维码页面
  65. * 此处显示要微信要扫描的二维码
  66. *
  67. * @param model
  68. * @return
  69. * @throws UnsupportedEncodingException
  70. */
  71. @Override
  72. @PassToken
  73. public String login(Model model) throws UnsupportedEncodingException {
  74. Map<String, String> wechatLoginUrl = wechatScanLoginService.wechatLoginUrl();
  75. String url = wechatLoginUrl.get("url");
  76. System.out.println(url);
  77. return "redirect:" + url;
  78. }
  79. /**
  80. * Title: callback
  81. * Description: 回调地址处理
  82. *
  83. * @param code
  84. * @param state
  85. * @return
  86. * @return
  87. */
  88. @Override
  89. @PassToken
  90. public String callback(String code, String state) throws UnsupportedEncodingException {
  91. System.out.println(code+"====="+state);
  92. if (code != null && state != null) {
  93. // 验证state为了用于防止跨站请求伪造攻击
  94. String decrypt = AesUtil.decrypt(AesUtil.parseHexStr2Byte(state), AesUtil.PASSWORD_SECRET_KEY, 16);
  95. if (!decrypt.equals(Constanst.PWD_MD5 + DateUtils.getYYYYMMdd())) {
  96. return "redirect:"+HttpParame.FRONT_URI+"/#/login?message=" + URLEncoder.encode("请勿非法进入", "UTF-8");
  97. }
  98. AccessToken access = wechatScanLoginService.getAccessToken(code);
  99. System.out.println("access:"+access);
  100. if (access != null) {
  101. String openid = access.getOpenid();
  102. System.out.println("openid: "+openid);
  103. SmartUser user = wechatScanLoginService.selectByOpenid(openid);
  104. if (user==null) { /*不存在*/
  105. return "redirect:"+HttpParame.FRONT_URI+"/#/login?message=" + URLEncoder.encode("请绑定信息", "UTF-8");
  106. } else {
  107. String token = JWTUtil.getToken(user);
  108. QueryWrapper<SmartAuthority> queryWrapper1 = new QueryWrapper<>();
  109. queryWrapper1.eq("deleted", 0);
  110. queryWrapper1.eq("user_id", user.getId());
  111. List<SmartAuthority> query = smartAuthorityService.getAuthorByKey(queryWrapper1);
  112. if (query.size()>0){
  113. return "redirect:"+HttpParame.FRONT_URI+"/#/wanzai/home?token=" + token;
  114. } else {
  115. return "redirect:"+HttpParame.FRONT_URI+"/#/login?message=" + URLEncoder.encode("无登录权限", "UTF-8");
  116. }
  117. }
  118. }
  119. }
  120. return null;
  121. }
  122. /**
  123. * Title: bindingUserMac2
  124. * Description: 跳转到绑定用户系统帐号页面
  125. * @return
  126. */
  127. @Override
  128. @PassToken
  129. public String bindUserMac(String phone,String messageCode) throws UnsupportedEncodingException {
  130. if (StringUtils.isBlank(phone) || StringUtils.isBlank(messageCode)){
  131. return "redirect:"+HttpParame.FRONT_URI+"/#/login?message=" + URLEncoder.encode("请输入信息", "UTF-8");
  132. }
  133. Map<String, String> wechatLoginUrl = wechatScanLoginService.wechatBindUrl(phone,messageCode);
  134. String url = wechatLoginUrl.get("url");
  135. System.out.println(url);
  136. return "redirect:" + url;
  137. }
  138. @Override
  139. @PassToken
  140. public String bindcallback(String code, String state, String phone,String messageCode) throws UnsupportedEncodingException {
  141. System.out.println(code+"==="+state+"=="+messageCode);
  142. if (code != null && state != null) {
  143. // 验证state为了用于防止跨站请求伪造攻击
  144. String decrypt = AesUtil.decrypt(AesUtil.parseHexStr2Byte(state), AesUtil.PASSWORD_SECRET_KEY, 16);
  145. if (!decrypt.equals(Constanst.PWD_MD5 + DateUtils.getYYYYMMdd())) {
  146. return "redirect:"+HttpParame.FRONT_URI+"/#/login?message=" + URLEncoder.encode("请勿非法进入", "UTF-8");
  147. }
  148. AccessToken access = wechatScanLoginService.getAccessToken(code);
  149. if (access != null) {
  150. String openid = access.getOpenid();
  151. QueryWrapper<SmsCode> queryWrapper1 = new QueryWrapper<>();
  152. queryWrapper1.eq("deleted", 0);
  153. queryWrapper1.eq("is_verify",0);
  154. queryWrapper1.eq("phone_number",phone);
  155. queryWrapper1.eq("code",code);
  156. queryWrapper1.ge("expiration_time", new Date());
  157. List<SmsCode> listc = smsCodeService.getSmsCodeByKey(queryWrapper1);
  158. if (listc.isEmpty()){
  159. return "redirect:"+HttpParame.FRONT_URI+"/#/login?message=" + URLEncoder.encode("验证码已失效", "UTF-8");
  160. }
  161. QueryWrapper<SmartUser> queryWrapper2 = new QueryWrapper<>();
  162. queryWrapper2.eq("deleted", 0);
  163. queryWrapper2.eq("phone", phone);
  164. List<SmartUser> userc = smartUserService.list(queryWrapper2);
  165. if (userc.isEmpty()){
  166. return "redirect:"+HttpParame.FRONT_URI+"/#/login?message=" + URLEncoder.encode("用户不存在", "UTF-8");
  167. }
  168. userc.get(0).setOpenId(openid);
  169. int m = wechatScanLoginService.updateSmartUser(userc.get(0));
  170. if (m>0){
  171. String token = JWTUtil.getToken(userc.get(0));
  172. QueryWrapper<SmartAuthority> queryWrapper3 = new QueryWrapper<>();
  173. queryWrapper3.eq("deleted", 0);
  174. queryWrapper3.eq("user_id", userc.get(0).getId());
  175. List<SmartAuthority> query = smartAuthorityService.getAuthorByKey(queryWrapper3);
  176. if (query.size()>0){
  177. return "redirect:"+HttpParame.FRONT_URI+"/#/wanzai/home?token=" + token;
  178. } else {
  179. return "redirect:"+HttpParame.FRONT_URI+"/#/login?message=" + URLEncoder.encode("无登录权限", "UTF-8");
  180. }
  181. }
  182. }
  183. }
  184. return "redirect:"+HttpParame.FRONT_URI+"/#/login?message=" + URLEncoder.encode("系统异常", "UTF-8");
  185. }
  186. @Override
  187. @PassToken
  188. public String insertMonthMeter(String month){
  189. if (month==null){
  190. month=TimeExchange2.getMonth();
  191. }
  192. wechatScanLoginService.insertMonthMeter(month);
  193. return "插入完毕";
  194. }
  195. @Override
  196. @PassToken
  197. public String insertDayMeter(String day){
  198. if (day==null){
  199. day=TimeExchange2.getDateStr();
  200. }
  201. wechatScanLoginService.insertDayMeter(day);
  202. return "插入完毕";
  203. }
  204. /**
  205. * Description: 用户类别统计
  206. */
  207. @Override
  208. @PassToken
  209. public CommonResult getUserIdTj(){
  210. List<Tj> list = wechatScanLoginService.getUserIdTj();
  211. return CommonResult.ok(list);
  212. }
  213. /**
  214. * Description: 用户总数
  215. */
  216. @Override
  217. @PassToken
  218. public CommonResult getUserIdTjt(){
  219. All list = wechatScanLoginService.getUserIdTjt();
  220. return CommonResult.ok(list);
  221. }
  222. /**
  223. * Description: 水表总计
  224. */
  225. @Override
  226. @PassToken
  227. public CommonResult getWaterTj(){
  228. DAll list = wechatScanLoginService.getWaterTj();
  229. return CommonResult.ok(list);
  230. }
  231. /**
  232. * Description: 电表总计
  233. */
  234. @Override
  235. @PassToken
  236. public CommonResult getElcTj(){
  237. DAll list = wechatScanLoginService.getElcTj();
  238. return CommonResult.ok(list);
  239. }
  240. /**
  241. * Description: 每月水费查询
  242. */
  243. @Override
  244. @PassToken
  245. public CommonResult getMonWater() throws ParseException {
  246. List<MonthMeterDetail> list = wechatScanLoginService.getMonWater();
  247. return CommonResult.ok(list);
  248. }
  249. /**
  250. * Description: 每月电费查询
  251. */
  252. @Override
  253. @PassToken
  254. public CommonResult getMonElc() throws ParseException {
  255. List<MonthMeterDetail> list = wechatScanLoginService.getMonElc();
  256. return CommonResult.ok(list);
  257. }
  258. /**
  259. * Description: 区域能耗统计
  260. */
  261. @Override
  262. @PassToken
  263. public CommonResult getMeterMonthPage(@RequestBody MeterMonthData meterMonthData,int currentPage, int pageCount) {
  264. PageHelper.startPage(currentPage, pageCount);
  265. PageInfo<MeterMonthData> list = wechatScanLoginService.getMeterMonthPage(meterMonthData);
  266. return CommonResult.ok(list);
  267. }
  268. /**
  269. * Description: 实时抄表
  270. */
  271. @Override
  272. @PassToken
  273. public CommonResult getMeterDayPage(@RequestBody MeterMonthData meterMonthData, int currentPage, int pageCount) {
  274. PageHelper.startPage(currentPage, pageCount);
  275. PageInfo<MeterMonthData> list = wechatScanLoginService.getMeterDayPage(meterMonthData);
  276. return CommonResult.ok(list);
  277. }
  278. /**
  279. * Description: 查轨迹
  280. */
  281. @Override
  282. @PassToken
  283. public CommonResult getPosition() {
  284. List<List<BigDecimal>> ld = RandomTrackAlgorithm.getPosition();
  285. return CommonResult.ok(ld);
  286. }
  287. @Override
  288. @PassToken
  289. public CommonResult vertify(String code){
  290. if (StringUtils.isBlank(code)){
  291. return CommonResult.fail("请传入code");
  292. }
  293. String url = "https://api.weixin.qq.com/sns/jscode2session?" +
  294. "appid=" + PropertiesUtil.getValue(HttpParame.APPID) +
  295. "&secret=" + PropertiesUtil.getValue(HttpParame.SECRET) +
  296. "&js_code=" + code +
  297. "&grant_type=authorization_code";
  298. String json = HttpClientUtils.getInstance().sendHttpGet(url);
  299. Gson gson = new Gson();
  300. HashMap<String, String> userMap = gson.fromJson(json.toString(), new TypeToken<HashMap<String, String>>() {}.getType());
  301. String openid = "";
  302. try {
  303. openid = userMap.get("openid").toString();
  304. } catch (Exception e) {
  305. return CommonResult.fail("code异常");
  306. }
  307. SmartUser user = wechatScanLoginService.selectByOpenid(openid);
  308. if (user==null){
  309. return CommonResult.fail("请绑定后再进入");
  310. }
  311. String token = JWTUtil.getToken(user);
  312. JSONObject jsonObject = new JSONObject();
  313. jsonObject.put("token", token);
  314. jsonObject.put("user", user);
  315. return CommonResult.ok(jsonObject.toString());
  316. }
  317. @Override
  318. @PassToken
  319. public CommonResult sendMessage(String phone){
  320. QueryWrapper<SmartUser> queryWrapper1 = new QueryWrapper<>();
  321. queryWrapper1.eq("deleted", 0);
  322. queryWrapper1.eq("phone",phone);
  323. queryWrapper1.eq("is_cancel",0);
  324. List<SmartUser> list = smartUserService.list(queryWrapper1);
  325. if (list.isEmpty()){
  326. return CommonResult.fail("该手机无权限登录");
  327. }
  328. QueryWrapper<SmsCode> queryWrapper2 = new QueryWrapper<>();
  329. queryWrapper2.eq("deleted", 0);
  330. queryWrapper2.eq("is_verify",0);
  331. queryWrapper2.eq("phone_number",phone);
  332. queryWrapper2.ge("expiration_time", new Date());
  333. List<SmsCode> listc = smsCodeService.getSmsCodeByKey(queryWrapper2);
  334. if (!listc.isEmpty()){
  335. return CommonResult.fail("操作频繁,请稍后再试");
  336. }
  337. String code = GetVertifyCode.getRandomNumCode(6);
  338. SmsCode smsCode = new SmsCode();
  339. smsCode.setId(UUIDUtil.generateID());
  340. smsCode.setPhoneNumber(phone);
  341. smsCode.setCode(code);
  342. long time = new Date().getTime() + 60000L;
  343. smsCode.setExpirationTime(new Date(time));
  344. smsCode.setIsVerify("0");
  345. smsCode.setDeleted(0);
  346. int m = smsCodeService.insertSmsCode(smsCode);
  347. if (m>0){
  348. String message = SendSms.sendSms(phone, code);
  349. if (message.contains("success")){
  350. return CommonResult.ok("发送成功");
  351. }
  352. }
  353. return CommonResult.fail("操作失败");
  354. }
  355. @Override
  356. @PassToken
  357. public CommonResult vertifyMessage(String phone,String code, String wxcode){
  358. QueryWrapper<SmsCode> queryWrapper1 = new QueryWrapper<>();
  359. queryWrapper1.eq("deleted", 0);
  360. queryWrapper1.eq("is_verify",0);
  361. queryWrapper1.eq("phone_number",phone);
  362. queryWrapper1.eq("code",code);
  363. queryWrapper1.ge("expiration_time", new Date());
  364. List<SmsCode> listc = smsCodeService.getSmsCodeByKey(queryWrapper1);
  365. if (listc.isEmpty()){
  366. return CommonResult.ok("验证码已失效");
  367. }
  368. if (StringUtils.isBlank(wxcode)){
  369. return CommonResult.fail("请传入wxcode");
  370. }
  371. String url = "https://api.weixin.qq.com/sns/jscode2session?" +
  372. "appid=" + PropertiesUtil.getValue(HttpParame.APPID) +
  373. "&secret=" + PropertiesUtil.getValue(HttpParame.SECRET) +
  374. "&js_code=" + wxcode +
  375. "&grant_type=authorization_code";
  376. String json = HttpClientUtils.getInstance().sendHttpGet(url);
  377. Gson gson = new Gson();
  378. HashMap<String, String> userMap = gson.fromJson(json.toString(), new TypeToken<HashMap<String, String>>() {}.getType());
  379. String openid = "";
  380. try {
  381. openid = userMap.get("openid").toString();
  382. } catch (Exception e) {
  383. return CommonResult.fail("code异常");
  384. }
  385. QueryWrapper<SmartUser> queryWrapper2 = new QueryWrapper<>();
  386. queryWrapper2.eq("deleted", 0);
  387. queryWrapper2.eq("phone", phone);
  388. List<SmartUser> user = smartUserService.list(queryWrapper2);
  389. if (user.isEmpty()){
  390. return CommonResult.fail("该用户不存在");
  391. }
  392. user.get(0).setOpenId(openid);
  393. smartUserService.updateSmartUser(user.get(0));
  394. String token = JWTUtil.getToken(user.get(0));
  395. JSONObject jsonObject = new JSONObject();
  396. jsonObject.put("token", token);
  397. jsonObject.put("user", user.get(0));
  398. return CommonResult.ok(jsonObject);
  399. }
  400. }