WeiXinUserInfoController.java 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405
  1. package com.js.kbt.controller;
  2. import java.io.IOException;
  3. import java.util.HashMap;
  4. import java.util.List;
  5. import java.util.Map;
  6. import javax.annotation.Resource;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9. import javax.servlet.http.HttpSession;
  10. import org.apache.log4j.Logger;
  11. import org.springframework.beans.factory.annotation.Autowired;
  12. import org.springframework.stereotype.Controller;
  13. import org.springframework.web.bind.annotation.RequestMapping;
  14. import org.springframework.web.bind.annotation.RequestParam;
  15. import org.springframework.web.bind.annotation.ResponseBody;
  16. import org.springframework.web.servlet.ModelAndView;
  17. import org.springframework.web.servlet.mvc.support.RedirectAttributes;
  18. import com.alibaba.fastjson.JSONObject;
  19. import com.js.kbt.mapper.MouldDownPacketMapper;
  20. import com.js.kbt.mapper.TbMouldEquipmentMapper;
  21. import com.js.kbt.mapper.TbUserMapper;
  22. import com.js.kbt.model.MouldDownPacket;
  23. import com.js.kbt.model.MouldDownPacketExample;
  24. import com.js.kbt.model.TbMouldEquipment;
  25. import com.js.kbt.model.TbMouldEquipmentExample;
  26. import com.js.kbt.model.TbUser;
  27. import com.js.kbt.model.TbUserExample;
  28. import com.js.kbt.util.CRC16Util;
  29. import com.js.kbt.util.MD5Util;
  30. import com.js.kbt.util.ProjectConst;
  31. import com.js.kbt.util.WeiXinUtils;
  32. import com.js.kbt.util.WeixinPayConstants;
  33. /**
  34. * @author seyason
  35. * @create 2019-08-08
  36. * @desc 获取用户微信openid,绑定
  37. **/
  38. @Controller
  39. public class WeiXinUserInfoController {
  40. @Autowired
  41. private HttpServletRequest request;
  42. @Resource(name = "tbUserMapper")
  43. private TbUserMapper tbUserMapper;
  44. @Resource(name = "mouldDownPacketMapper")
  45. private MouldDownPacketMapper mouldDownPacketMapper;
  46. @Resource
  47. private TbMouldEquipmentMapper tbMouldEquipmentMapper;
  48. // @Autowired
  49. // private WeiXinPlatformService weiXinPlatformService;
  50. Logger log = Logger.getLogger(WeiXinUserInfoController.class);
  51. @ResponseBody
  52. @RequestMapping("/checkAccountStatus")
  53. public void checkAccountStatus(@RequestParam String openid, HttpServletResponse response) throws IOException{
  54. HttpRespMsg msg = new HttpRespMsg();
  55. TbUserExample example = new TbUserExample();
  56. example.createCriteria().andOpenidEqualTo(openid);
  57. if (tbUserMapper.countByExample(example) > 0) {
  58. TbUser user = tbUserMapper.selectByExample(example).get(0);
  59. msg.data = user.getAccount();
  60. } else {
  61. msg.setError("没有找到相应账号");
  62. }
  63. response.setContentType("application/json");
  64. response.setCharacterEncoding("UTF-8");
  65. response.getWriter().println(msg.toJSONStr());
  66. }
  67. @RequestMapping("/getWeiXinOpenid")
  68. public ModelAndView getWeiXinOpenid(@RequestParam(required = false) String code) {
  69. log.info("============!!!!!进入getWeiXinOpenid==========");
  70. ModelAndView modelAndView = new ModelAndView("bind_weixin");
  71. /**
  72. * 进行获取openId,必须的一个参数,这个是当进行了授权页面的时候,再重定向了我们自己的一个页面的时候,
  73. * 会在request页面中,新增这个字段信息,要结合这个ProjectConst.Get_WEIXINPAGE_Code这个常量思考
  74. */
  75. try {
  76. // 得到当前用户的信息(具体信息就看weixinUser这个javabean)
  77. WeiXinUser weiXinUser = getTheCode(request.getSession(), code);
  78. // 如果没有,进行注册
  79. if (weiXinUser != null) {
  80. System.out.println("openid=" + weiXinUser.getOpenId());
  81. String openId = weiXinUser.getOpenId();
  82. modelAndView.addObject("openid", openId);
  83. modelAndView.addObject("isFail", false);
  84. } else {
  85. modelAndView.addObject("isFail", true);
  86. }
  87. } catch (Exception e) {
  88. e.printStackTrace();
  89. modelAndView.addObject("isFail", true);
  90. }
  91. return modelAndView;
  92. }
  93. /**
  94. * 将openid和账号进行绑定,验证密码
  95. * @param openid
  96. * @param account
  97. * @param pwd
  98. * @param response
  99. */
  100. @RequestMapping("/bindAccount")
  101. public void bindAccount(@RequestParam String openid,@RequestParam String account, @RequestParam String pwd,
  102. HttpServletResponse response
  103. ) {
  104. HttpRespMsg msg = new HttpRespMsg();
  105. TbUserExample example = new TbUserExample();
  106. example.createCriteria().andAccountEqualTo(account).andPasswordEqualTo(MD5Util.getPassword(pwd));
  107. if (tbUserMapper.countByExample(example) > 0) {
  108. TbUser user = tbUserMapper.selectByExample(example).get(0);
  109. user.setOpenid(openid);
  110. tbUserMapper.updateByPrimaryKeySelective(user);
  111. } else {
  112. msg.setError("账号密码错误");
  113. }
  114. response.setContentType("application/json");
  115. response.setCharacterEncoding("UTF-8");
  116. try {
  117. response.getWriter().println(msg.toJSONStr());
  118. } catch (IOException e) {
  119. e.printStackTrace();
  120. }
  121. }
  122. /**
  123. * 获取用户的openId
  124. *
  125. * @param session
  126. * @param code
  127. * @return 返回封装的微信用户的对象
  128. */
  129. private WeiXinUser getTheCode(HttpSession session, String code) {
  130. Map<String, String> authInfo = new HashMap<>();
  131. String openId = "";
  132. if (code != null) {
  133. // 调用根据用户的code得到需要的授权信息
  134. authInfo = getAuthInfo(code);
  135. // 获取到openId
  136. openId = authInfo.get("Openid");
  137. }
  138. System.out.println("获取到微信openid==" + openId);
  139. // 获取基础刷新的接口访问凭证(目前还没明白为什么用authInfo.get("AccessToken");这里面的access_token就不行)
  140. String accessToken = authInfo.get("AccessToken");
  141. // 获取到微信用户的信息
  142. WeiXinUser userinfo = getUserInfo(accessToken, openId);
  143. if (userinfo == null && openId != null && !openId.equals("")) {
  144. userinfo = new WeiXinUser();
  145. userinfo.setOpenId(openId);
  146. }
  147. return userinfo;
  148. }
  149. public WeiXinUser getUserInfo(String accessToken, String openId) {
  150. WeiXinUser weixinUserInfo = null;
  151. // 拼接获取用户信息接口的请求地址
  152. // String requestUrl = ProjectConst.GET_WEIXIN_USER_URL.replace("ACCESS_TOKEN",
  153. // accessToken).replace(
  154. // "OPENID", openId);
  155. String requestUrl = ProjectConst.GetPageUsersUrl.replace("ACCESS_TOKEN", accessToken).replace("OPENID", openId);
  156. // 获取用户信息(返回的是Json格式内容)
  157. JSONObject jsonObject = WeiXinUtils.doGetStr(requestUrl);
  158. if (null != jsonObject) {
  159. try {
  160. // 封装获取到的用户信息
  161. weixinUserInfo = new WeiXinUser();
  162. // 用户的标识
  163. weixinUserInfo.setOpenId(jsonObject.getString("openid"));
  164. // 昵称
  165. // weixinUserInfo.setNickname(EmojiHttpServletRequestWraper.filterEmoji(jsonObject.getString("nickname")));
  166. // 用户的性别(1是男性,2是女性,0是未知)
  167. // if (jsonObject.containsKey("sex")) {
  168. // weixinUserInfo.setSex(jsonObject.getInteger("sex"));
  169. // }
  170. // 用户所在国家
  171. weixinUserInfo.setCountry(jsonObject.getString("country"));
  172. // 用户所在省份
  173. weixinUserInfo.setProvince(jsonObject.getString("province"));
  174. // 用户所在城市
  175. weixinUserInfo.setCity(jsonObject.getString("city"));
  176. // 用户头像
  177. weixinUserInfo.setHeadImgUrl(jsonObject.getString("headimgurl"));
  178. } catch (Exception e) {
  179. if (0 == weixinUserInfo.getSubscribe()) {
  180. System.out.println("用户并没有关注本公众号");
  181. } else {
  182. int errorCode = jsonObject.getInteger("errcode");
  183. String errorMsg = jsonObject.getString("errmsg");
  184. System.out.println("由于" + errorCode + "错误码;错误信息为:" + errorMsg + ";导致获取用户信息失败");
  185. }
  186. }
  187. }
  188. return weixinUserInfo;
  189. }
  190. /**
  191. * 进行用户授权,获取到需要的授权字段,比如openId
  192. *
  193. * @param code
  194. * 识别得到用户id必须的一个值 得到网页授权凭证和用户id
  195. * @return
  196. */
  197. public Map<String, String> oauth2GetOpenid(String code) {
  198. // 自己的配置appid(公众号进行查阅)
  199. String appid = WeixinPayConstants.appid;
  200. // 自己的配置APPSECRET;(公众号进行查阅)
  201. String appsecret = WeixinPayConstants.appsecret;
  202. // 拼接用户授权接口信息
  203. String requestUrl = ProjectConst.GET_WEBAUTH_URL.replace("APPID", appid).replace("SECRET", appsecret)
  204. .replace("CODE", code);
  205. // 存储获取到的授权字段信息
  206. Map<String, String> result = new HashMap<String, String>();
  207. try {
  208. JSONObject OpenidJSONO = WeiXinUtils.doGetStr(requestUrl);
  209. // OpenidJSONO可以得到的内容:access_token expires_in refresh_token openid scope
  210. String Openid = String.valueOf(OpenidJSONO.get("openid"));
  211. String AccessToken = String.valueOf(OpenidJSONO.get("access_token"));
  212. // 用户保存的作用域
  213. String Scope = String.valueOf(OpenidJSONO.get("scope"));
  214. String refresh_token = String.valueOf(OpenidJSONO.get("refresh_token"));
  215. result.put("Openid", Openid);
  216. result.put("AccessToken", AccessToken);
  217. result.put("scope", Scope);
  218. result.put("refresh_token", refresh_token);
  219. } catch (Exception e) {
  220. e.printStackTrace();
  221. }
  222. return result;
  223. }
  224. /**
  225. * 获取到微信用户的唯一的OpendID
  226. *
  227. * @param code
  228. * 这是要获取OpendId的必须的一个参数
  229. * @return
  230. */
  231. public Map<String, String> getAuthInfo(String code) {
  232. // 进行授权验证,获取到OpenID字段等信息
  233. Map<String, String> result = oauth2GetOpenid(code);
  234. // 从这里可以得到用户openid
  235. String openId = result.get("Openid");
  236. return result;
  237. }
  238. /**
  239. * 云平台下行配置数据包接口
  240. * lowPowerLimit 低电量报警限值:(1 字节,十六进制)如:1e=31
  241. * hotAlarmLimit 热报警限值:(1 字节,十六进制)如:50=80
  242. * equipmentNo 设备编号(可能是多个或者一个)多个以“,”隔开传 如:"123456"(单个),"123456,456878,123589"(多个)
  243. */
  244. @RequestMapping("/setPacket")
  245. public void bindAccount(HttpServletResponse response,Integer lowPowerLimit,Integer hotAlarmLimit,String equipmentNo) {
  246. HttpRespMsg msg = new HttpRespMsg();
  247. //16进制的转化
  248. String lowPowerLimitStr = Integer.toHexString(lowPowerLimit);
  249. String hotAlarmLimitStr = Integer.toHexString(hotAlarmLimit);
  250. System.out.println("lowPowerLimit"+lowPowerLimit+"hotAlarmLimit"+hotAlarmLimit);
  251. String setPacketMessage = "";
  252. MouldDownPacket mouldDownPacket = new MouldDownPacket();
  253. MouldDownPacketExample exp = new MouldDownPacketExample();
  254. TbMouldEquipmentExample tExp = new TbMouldEquipmentExample();
  255. String[] split = equipmentNo.split(",");
  256. for (String string : split) {
  257. System.out.println("进来了"+string);
  258. exp.createCriteria().andEquipmentNoEqualTo(string);
  259. tExp.createCriteria().andEquipmentNoEqualTo(string);
  260. TbMouldEquipment equipment = tbMouldEquipmentMapper.selectByExample(tExp).get(0);
  261. equipment.setHillNumber(lowPowerLimit+"%");
  262. equipment.setTemperature(hotAlarmLimit);
  263. //更新云模盒的报警温度和电量
  264. tbMouldEquipmentMapper.updateByPrimaryKey(equipment);
  265. List<MouldDownPacket> list = mouldDownPacketMapper.selectByExample(exp);
  266. if(list.size()>0){
  267. mouldDownPacket = list.get(0);
  268. setPacketMessage = downProcessMsg(lowPowerLimitStr,hotAlarmLimitStr);
  269. mouldDownPacket.setPacketStr(setPacketMessage);
  270. mouldDownPacket.setIsUse(0);
  271. mouldDownPacketMapper.updateByPrimaryKey(mouldDownPacket);
  272. }else{
  273. setPacketMessage = downProcessMsg(lowPowerLimitStr,hotAlarmLimitStr);
  274. mouldDownPacket.setEquipmentNo(equipmentNo);
  275. mouldDownPacket.setPacketStr(setPacketMessage);
  276. mouldDownPacketMapper.insertSelective(mouldDownPacket);
  277. }
  278. exp.clear();
  279. tExp.clear();
  280. }
  281. msg.data = setPacketMessage;
  282. response.setContentType("application/json");
  283. response.setCharacterEncoding("UTF-8");
  284. try {
  285. response.getWriter().println(msg.toJSONStr());
  286. } catch (IOException e) {
  287. e.printStackTrace();
  288. }
  289. }
  290. // 下行配置数据包
  291. private String downProcessMsg(String lowPowerLimit,String hotAlarmLimit) {
  292. //"23"不解析
  293. if("23".equals(lowPowerLimit)){
  294. lowPowerLimit="24";
  295. }
  296. if("23".equals(hotAlarmLimit)){
  297. hotAlarmLimit="24";
  298. }
  299. String ret = "FA AF 00 07 02 1e 78 "+lowPowerLimit+" "+hotAlarmLimit+" 00 3C";
  300. ret = ret.replaceAll(" ", "");
  301. String crcCode = CRC16Util.getCRC(ret);
  302. System.out.println("ret===>"+ret);
  303. String lastPart = (ret + crcCode).replaceAll("23", "24").replaceAll(" ", "");
  304. System.out.println("lastPart===>"+lastPart);
  305. return lastPart;
  306. }
  307. /**
  308. * 低位在前的16进制解析
  309. *
  310. * @param rHex
  311. * @return
  312. */
  313. public static int reverseParseHex(String rHex) {
  314. int size = rHex.length() / 2;
  315. StringBuilder sb = new StringBuilder();
  316. for (int i = 0; i < size; i++) {
  317. sb.append(rHex.substring((size - i - 1) * 2, (size - i) * 2));
  318. }
  319. String str = sb.toString();
  320. System.out.println("str"+str);
  321. return Integer.parseInt(str, 16);
  322. }
  323. // public static byte[] strToByte(String data) {
  324. // data = data.replace(" ", "");
  325. // int len = data.length();
  326. // if (!(len % 2 == 0)) {
  327. // byte[] para = new byte[]{0,0,0,0};
  328. // return para;
  329. // }
  330. // int num = len / 2;
  331. // byte[] para = new byte[num];
  332. // for (int i = 0; i < num; i++) {
  333. // int value = Integer.valueOf(data.substring(i * 2, 2 * (i + 1)), 16);
  334. // para[i] = (byte) value;
  335. // }
  336. // for (byte b : para) {
  337. //
  338. // }
  339. // return para;
  340. // }
  341. //
  342. // private static String crc(byte str[],int len){
  343. // int crc = 0xFFFF;
  344. // byte data;
  345. // for(int i = 0 ; i < len ; i++){
  346. // data = str[i];
  347. // for(int j = 0; j < 8; j++){
  348. // if ((((crc&0x8000)>>8)^(data&0x80))!=0){
  349. // crc = ((crc << 1) ^ 0x8005);
  350. // }
  351. // else
  352. // {
  353. // crc <<= 1;
  354. // }
  355. // data <<= 1;
  356. // }
  357. // }
  358. // System.out.println("crc"+crc);
  359. // //结果转换为16进制
  360. // String result = Integer.toHexString(crc).toUpperCase();
  361. // if (result.length() != 4) {
  362. // StringBuffer sb = new StringBuffer("0000");
  363. // result = sb.replace(4 - result.length(), 4, result).toString();
  364. // }
  365. // return result;
  366. // }
  367. public static void main(String[] args) {
  368. String ret = "D5 37";
  369. String part = "FA AF 00 07 02 1e 78"+" 1e"+" "+"50"+" 00 3C";
  370. // byte[] strToByte = strToByte(part);
  371. // String crc1 = crc(part.getBytes(),strToByte.length);
  372. // System.out.println("crc"+crc1);
  373. ret = ret.replaceAll(" ", "");
  374. System.out.println(ret);
  375. // int parseInt = Integer.parseInt(ret, 16);
  376. // int crc = reverseParseHex(ret);
  377. // System.out.println(crc);
  378. // System.out.println(parseInt);
  379. }
  380. }