WeiXinUserInfoController.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327
  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.TbUserMapper;
  21. import com.js.kbt.model.MouldDownPacket;
  22. import com.js.kbt.model.MouldDownPacketExample;
  23. import com.js.kbt.model.PacketMessage;
  24. import com.js.kbt.model.TbUser;
  25. import com.js.kbt.model.TbUserExample;
  26. import com.js.kbt.util.MD5Util;
  27. import com.js.kbt.util.ProjectConst;
  28. import com.js.kbt.util.WeiXinUtils;
  29. import com.js.kbt.util.WeixinPayConstants;
  30. /**
  31. * @author seyason
  32. * @create 2019-08-08
  33. * @desc 获取用户微信openid,绑定
  34. **/
  35. @Controller
  36. public class WeiXinUserInfoController {
  37. @Autowired
  38. private HttpServletRequest request;
  39. @Resource(name = "tbUserMapper")
  40. private TbUserMapper tbUserMapper;
  41. @Resource(name = "packetMessage")
  42. private PacketMessage packetMessage;
  43. @Resource(name = "mouldDownPacketMapper")
  44. private MouldDownPacketMapper mouldDownPacketMapper;
  45. // @Autowired
  46. // private WeiXinPlatformService weiXinPlatformService;
  47. Logger log = Logger.getLogger(WeiXinUserInfoController.class);
  48. @ResponseBody
  49. @RequestMapping("/checkAccountStatus")
  50. public void checkAccountStatus(@RequestParam String openid, HttpServletResponse response) throws IOException{
  51. HttpRespMsg msg = new HttpRespMsg();
  52. TbUserExample example = new TbUserExample();
  53. example.createCriteria().andOpenidEqualTo(openid);
  54. if (tbUserMapper.countByExample(example) > 0) {
  55. TbUser user = tbUserMapper.selectByExample(example).get(0);
  56. msg.data = user.getAccount();
  57. } else {
  58. msg.setError("没有找到相应账号");
  59. }
  60. response.setContentType("application/json");
  61. response.setCharacterEncoding("UTF-8");
  62. response.getWriter().println(msg.toJSONStr());
  63. }
  64. @RequestMapping("/getWeiXinOpenid")
  65. public ModelAndView getWeiXinOpenid(@RequestParam(required = false) String code) {
  66. log.info("============!!!!!进入getWeiXinOpenid==========");
  67. ModelAndView modelAndView = new ModelAndView("bind_weixin");
  68. /**
  69. * 进行获取openId,必须的一个参数,这个是当进行了授权页面的时候,再重定向了我们自己的一个页面的时候,
  70. * 会在request页面中,新增这个字段信息,要结合这个ProjectConst.Get_WEIXINPAGE_Code这个常量思考
  71. */
  72. try {
  73. // 得到当前用户的信息(具体信息就看weixinUser这个javabean)
  74. WeiXinUser weiXinUser = getTheCode(request.getSession(), code);
  75. // 如果没有,进行注册
  76. if (weiXinUser != null) {
  77. System.out.println("openid=" + weiXinUser.getOpenId());
  78. String openId = weiXinUser.getOpenId();
  79. modelAndView.addObject("openid", openId);
  80. modelAndView.addObject("isFail", false);
  81. } else {
  82. modelAndView.addObject("isFail", true);
  83. }
  84. } catch (Exception e) {
  85. e.printStackTrace();
  86. modelAndView.addObject("isFail", true);
  87. }
  88. return modelAndView;
  89. }
  90. /**
  91. * 将openid和账号进行绑定,验证密码
  92. * @param openid
  93. * @param account
  94. * @param pwd
  95. * @param response
  96. */
  97. @RequestMapping("/bindAccount")
  98. public void bindAccount(@RequestParam String openid,@RequestParam String account, @RequestParam String pwd,
  99. HttpServletResponse response
  100. ) {
  101. HttpRespMsg msg = new HttpRespMsg();
  102. TbUserExample example = new TbUserExample();
  103. example.createCriteria().andAccountEqualTo(account).andPasswordEqualTo(MD5Util.getPassword(pwd));
  104. if (tbUserMapper.countByExample(example) > 0) {
  105. TbUser user = tbUserMapper.selectByExample(example).get(0);
  106. user.setOpenid(openid);
  107. tbUserMapper.updateByPrimaryKeySelective(user);
  108. } else {
  109. msg.setError("账号密码错误");
  110. }
  111. response.setContentType("application/json");
  112. response.setCharacterEncoding("UTF-8");
  113. try {
  114. response.getWriter().println(msg.toJSONStr());
  115. } catch (IOException e) {
  116. e.printStackTrace();
  117. }
  118. }
  119. /**
  120. * 获取用户的openId
  121. *
  122. * @param session
  123. * @param code
  124. * @return 返回封装的微信用户的对象
  125. */
  126. private WeiXinUser getTheCode(HttpSession session, String code) {
  127. Map<String, String> authInfo = new HashMap<>();
  128. String openId = "";
  129. if (code != null) {
  130. // 调用根据用户的code得到需要的授权信息
  131. authInfo = getAuthInfo(code);
  132. // 获取到openId
  133. openId = authInfo.get("Openid");
  134. }
  135. System.out.println("获取到微信openid==" + openId);
  136. // 获取基础刷新的接口访问凭证(目前还没明白为什么用authInfo.get("AccessToken");这里面的access_token就不行)
  137. String accessToken = authInfo.get("AccessToken");
  138. // 获取到微信用户的信息
  139. WeiXinUser userinfo = getUserInfo(accessToken, openId);
  140. if (userinfo == null && openId != null && !openId.equals("")) {
  141. userinfo = new WeiXinUser();
  142. userinfo.setOpenId(openId);
  143. }
  144. return userinfo;
  145. }
  146. public WeiXinUser getUserInfo(String accessToken, String openId) {
  147. WeiXinUser weixinUserInfo = null;
  148. // 拼接获取用户信息接口的请求地址
  149. // String requestUrl = ProjectConst.GET_WEIXIN_USER_URL.replace("ACCESS_TOKEN",
  150. // accessToken).replace(
  151. // "OPENID", openId);
  152. String requestUrl = ProjectConst.GetPageUsersUrl.replace("ACCESS_TOKEN", accessToken).replace("OPENID", openId);
  153. // 获取用户信息(返回的是Json格式内容)
  154. JSONObject jsonObject = WeiXinUtils.doGetStr(requestUrl);
  155. if (null != jsonObject) {
  156. try {
  157. // 封装获取到的用户信息
  158. weixinUserInfo = new WeiXinUser();
  159. // 用户的标识
  160. weixinUserInfo.setOpenId(jsonObject.getString("openid"));
  161. // 昵称
  162. // weixinUserInfo.setNickname(EmojiHttpServletRequestWraper.filterEmoji(jsonObject.getString("nickname")));
  163. // 用户的性别(1是男性,2是女性,0是未知)
  164. // if (jsonObject.containsKey("sex")) {
  165. // weixinUserInfo.setSex(jsonObject.getInteger("sex"));
  166. // }
  167. // 用户所在国家
  168. weixinUserInfo.setCountry(jsonObject.getString("country"));
  169. // 用户所在省份
  170. weixinUserInfo.setProvince(jsonObject.getString("province"));
  171. // 用户所在城市
  172. weixinUserInfo.setCity(jsonObject.getString("city"));
  173. // 用户头像
  174. weixinUserInfo.setHeadImgUrl(jsonObject.getString("headimgurl"));
  175. } catch (Exception e) {
  176. if (0 == weixinUserInfo.getSubscribe()) {
  177. System.out.println("用户并没有关注本公众号");
  178. } else {
  179. int errorCode = jsonObject.getInteger("errcode");
  180. String errorMsg = jsonObject.getString("errmsg");
  181. System.out.println("由于" + errorCode + "错误码;错误信息为:" + errorMsg + ";导致获取用户信息失败");
  182. }
  183. }
  184. }
  185. return weixinUserInfo;
  186. }
  187. /**
  188. * 进行用户授权,获取到需要的授权字段,比如openId
  189. *
  190. * @param code
  191. * 识别得到用户id必须的一个值 得到网页授权凭证和用户id
  192. * @return
  193. */
  194. public Map<String, String> oauth2GetOpenid(String code) {
  195. // 自己的配置appid(公众号进行查阅)
  196. String appid = WeixinPayConstants.appid;
  197. // 自己的配置APPSECRET;(公众号进行查阅)
  198. String appsecret = WeixinPayConstants.appsecret;
  199. // 拼接用户授权接口信息
  200. String requestUrl = ProjectConst.GET_WEBAUTH_URL.replace("APPID", appid).replace("SECRET", appsecret)
  201. .replace("CODE", code);
  202. // 存储获取到的授权字段信息
  203. Map<String, String> result = new HashMap<String, String>();
  204. try {
  205. JSONObject OpenidJSONO = WeiXinUtils.doGetStr(requestUrl);
  206. // OpenidJSONO可以得到的内容:access_token expires_in refresh_token openid scope
  207. String Openid = String.valueOf(OpenidJSONO.get("openid"));
  208. String AccessToken = String.valueOf(OpenidJSONO.get("access_token"));
  209. // 用户保存的作用域
  210. String Scope = String.valueOf(OpenidJSONO.get("scope"));
  211. String refresh_token = String.valueOf(OpenidJSONO.get("refresh_token"));
  212. result.put("Openid", Openid);
  213. result.put("AccessToken", AccessToken);
  214. result.put("scope", Scope);
  215. result.put("refresh_token", refresh_token);
  216. } catch (Exception e) {
  217. e.printStackTrace();
  218. }
  219. return result;
  220. }
  221. /**
  222. * 获取到微信用户的唯一的OpendID
  223. *
  224. * @param code
  225. * 这是要获取OpendId的必须的一个参数
  226. * @return
  227. */
  228. public Map<String, String> getAuthInfo(String code) {
  229. // 进行授权验证,获取到OpenID字段等信息
  230. Map<String, String> result = oauth2GetOpenid(code);
  231. // 从这里可以得到用户openid
  232. String openId = result.get("Openid");
  233. return result;
  234. }
  235. /**
  236. * 云平台下行配置数据包接口
  237. * lowPowerLimit 低电量报警限值:(1 字节,十六进制)如:1e
  238. * hotAlarmLimit 热报警限值:(1 字节,十六进制)如:50
  239. * equipmentNo 设备编号
  240. */
  241. @RequestMapping("/setPacket")
  242. public void bindAccount(HttpServletResponse response,String lowPowerLimit,String hotAlarmLimit,String equipmentNo) {
  243. HttpRespMsg msg = new HttpRespMsg();
  244. String setPacketMessage = "";
  245. MouldDownPacket mouldDownPacket = new MouldDownPacket();
  246. MouldDownPacketExample exp = new MouldDownPacketExample();
  247. exp.createCriteria().andEquipmentNoEqualTo(equipmentNo);
  248. List<MouldDownPacket> list = mouldDownPacketMapper.selectByExample(exp);
  249. if(list.size()>0){
  250. mouldDownPacket = list.get(0);
  251. setPacketMessage = downProcessMsg(lowPowerLimit,hotAlarmLimit);
  252. mouldDownPacket.setPacketStr(setPacketMessage);
  253. mouldDownPacket.setIsUse(0);
  254. mouldDownPacketMapper.updateByPrimaryKey(mouldDownPacket);
  255. }else{
  256. setPacketMessage = downProcessMsg(lowPowerLimit,hotAlarmLimit);
  257. mouldDownPacket.setEquipmentNo(equipmentNo);
  258. mouldDownPacket.setPacketStr(setPacketMessage);
  259. mouldDownPacketMapper.insertSelective(mouldDownPacket);
  260. }
  261. response.setContentType("application/json");
  262. response.setCharacterEncoding("UTF-8");
  263. try {
  264. response.getWriter().println(msg.toJSONStr());
  265. } catch (IOException e) {
  266. e.printStackTrace();
  267. }
  268. }
  269. // 下行配置数据包
  270. private String downProcessMsg(String lowPowerLimit,String hotAlarmLimit) {
  271. //"23"不解析
  272. if("23".equals(lowPowerLimit)){
  273. lowPowerLimit="24";
  274. }
  275. if("23".equals(hotAlarmLimit)){
  276. hotAlarmLimit="24";
  277. }
  278. String ret = "FA AF 00 07 02 1e 78 lowPowerLimit hotAlarmLimit 00 3C";
  279. ret.replace("lowPowerLimit", lowPowerLimit);
  280. ret.replace("hotAlarmLimit", hotAlarmLimit);
  281. ret.replaceAll(" ", "");
  282. //16 位 CRC 校验(低位在前;高位在后)
  283. int crc = reverseParseHex(ret);
  284. String crcString = crc + "";
  285. ret = ret + crcString;
  286. return ret;
  287. }
  288. /**
  289. * 低位在前的16进制解析
  290. *
  291. * @param rHex
  292. * @return
  293. */
  294. public static int reverseParseHex(String rHex) {
  295. int size = rHex.length() / 2;
  296. StringBuilder sb = new StringBuilder();
  297. for (int i = 0; i < size; i++) {
  298. sb.append(rHex.substring((size - i - 1) * 2, (size - i) * 2));
  299. }
  300. String str = sb.toString();
  301. return Integer.parseInt(str, 16);
  302. }
  303. }