Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 
 
 

370 строки
15 KiB

  1. package com.simple.controller;
  2. import cn.binarywang.wx.miniapp.api.WxMaService;
  3. import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl;
  4. import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
  5. import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
  6. import cn.binarywang.wx.miniapp.bean.WxMaUserInfo;
  7. import cn.binarywang.wx.miniapp.config.WxMaInMemoryConfig;
  8. import com.alibaba.druid.wall.WallConfig;
  9. import com.simple.annotation.AuthIgnore;
  10. import com.simple.common.ErrorCode;
  11. import com.simple.common.IdWorker;
  12. import com.simple.common.Result;
  13. import com.simple.common.ResultData;
  14. import com.simple.domain.po.WxAppinfo;
  15. import com.simple.domain.po.WxCUser;
  16. import com.simple.domain.po.WxCUserCar;
  17. import com.simple.service.WxAppinfoService;
  18. import com.simple.service.WxCUserCarService;
  19. import com.simple.service.WxCUserService;
  20. import com.simple.utils.CheckUtil;
  21. import com.simple.utils.IPUtil;
  22. import io.swagger.annotations.Api;
  23. import io.swagger.annotations.ApiImplicitParam;
  24. import io.swagger.annotations.ApiOperation;
  25. import me.chanjar.weixin.common.error.WxErrorException;
  26. import org.apache.commons.lang3.StringUtils;
  27. import org.slf4j.Logger;
  28. import org.slf4j.LoggerFactory;
  29. import org.springframework.beans.factory.annotation.Autowired;
  30. import org.springframework.web.bind.annotation.*;
  31. import org.springframework.web.context.request.RequestContextHolder;
  32. import org.springframework.web.context.request.ServletRequestAttributes;
  33. import javax.servlet.http.HttpServletRequest;
  34. import javax.servlet.http.HttpServletResponse;
  35. import java.io.IOException;
  36. import java.io.PrintWriter;
  37. import java.math.BigDecimal;
  38. import java.util.Date;
  39. import java.util.HashMap;
  40. import java.util.List;
  41. import java.util.Map;
  42. @RestController
  43. @RequestMapping("/api/user")
  44. @Api(description = "用户登陆授权相关接口")
  45. public class WxUserGrantController extends BaseController {
  46. private final static Logger logger = LoggerFactory.getLogger(WxUserGrantController.class);
  47. @Autowired
  48. private WxCUserService wxCUserService;
  49. @Autowired
  50. private WxCUserCarService wxCUserCarService;
  51. /**
  52. * 用户登录
  53. * @param map
  54. * @return
  55. */
  56. @AuthIgnore
  57. @PostMapping("/login")
  58. @ApiOperation(value="用户登录", notes="{\"appId\":\"string\",\"code\":\"string\",\"scene\":\"string\",\"sceneAddress\":\"string\",\"latitude\":\"string\",\"longitude\":\"string\"}")
  59. public ResultData userLogin(@RequestBody Map<String, String> map) {
  60. logger.debug(map.toString());
  61. Map resultMap = new HashMap();
  62. String appId = map.get("appId");
  63. String code = map.get("code");
  64. String sceneAddress = map.get("sceneAddress");
  65. String longitude = map.get("longitude");
  66. String latitude = map.get("latitude");
  67. //登录凭证不能为空
  68. if (StringUtils.isBlank(appId)) {
  69. return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "appId不能为空");
  70. }
  71. if (StringUtils.isBlank(code)) {
  72. return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "code不能为空");
  73. }
  74. // 通过appinfo得到tenant_id
  75. WxAppinfo wxAppinfo = getAppInfo(appId);
  76. WxMaService wxMaService = getWeappServiceByAppInfo(wxAppinfo);
  77. String token = null;
  78. String session_key = null;
  79. String openId = null;
  80. try {
  81. WxMaJscode2SessionResult session = wxMaService.jsCode2SessionInfo(code);
  82. //获取会话密钥(session_key)
  83. session_key = session.getSessionKey();
  84. openId = session.getOpenid();
  85. logger.info("session_key: " + session_key + ", openId: " + openId);
  86. resultMap.put("openId", openId);
  87. } catch (WxErrorException e) {
  88. logger.error(e.getMessage(), e);
  89. return new ResultData(ErrorCode.SESSION_KEY_DECODE_ERR, resultMap);
  90. }
  91. HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
  92. String ipaddress = IPUtil.getIpAddr(request);
  93. WxCUser user = new WxCUser();
  94. user.setTenantId(wxAppinfo.getTenantId());
  95. user.setAppId(appId);
  96. user.setOpenId(openId);
  97. try {
  98. WxCUser user1 = wxCUserService.getByOpenId(user);
  99. if (user1 != null) {
  100. user1.createToken(new Date());
  101. token = user1.getToken();
  102. user1.setRegisterIp(ipaddress);
  103. user1.setSessionKey(session_key);
  104. if (user1.getSceneAddress() == null)
  105. user1.setSceneAddress(sceneAddress);
  106. if (!StringUtils.isBlank(longitude))
  107. user.setLongitude(BigDecimal.valueOf(Double.valueOf(longitude)));
  108. if (!StringUtils.isBlank(latitude))
  109. user.setLatitude(BigDecimal.valueOf(Double.valueOf(latitude)));
  110. // TODO 成长值
  111. wxCUserService.saveOrUpdate(user1);
  112. resultMap.put("token", token);
  113. } else {
  114. user.setTenantId(wxAppinfo.getTenantId());
  115. user.createToken(new Date());
  116. token = user.getToken();
  117. user.setRegisterIp(ipaddress);
  118. if (user.getSceneAddress() == null)
  119. user.setSceneAddress(sceneAddress);
  120. user.setSessionKey(session_key);
  121. if (!StringUtils.isBlank(longitude))
  122. user.setLongitude(BigDecimal.valueOf(Double.valueOf(longitude)));
  123. if (!StringUtils.isBlank(latitude))
  124. user.setLatitude(BigDecimal.valueOf(Double.valueOf(latitude)));
  125. // TODO 成长值
  126. wxCUserService.saveOrUpdate(user);
  127. resultMap.put("token", token);
  128. }
  129. } catch (Exception e) {
  130. logger.error(e.getMessage());
  131. return new ResultData(ErrorCode.DB_FAIL.getCode(), "wx_c_user数据库保存出错", resultMap);
  132. }
  133. return new ResultData(resultMap);
  134. }
  135. /**
  136. * 获取用户的昵称等信息
  137. * @param map
  138. * @return
  139. */
  140. @PostMapping("/getUserInfo")
  141. @ApiOperation(value="授权后获取用户的昵称,unionId等信息", notes="{\"encryptedData\":\"string\",\"iv\":\"string\"}")
  142. public ResultData getUserInfo(@RequestBody Map<String, String> map) {
  143. logger.debug(map.toString());
  144. Map resultMap = new HashMap();
  145. String encryptedData = map.get("encryptedData");
  146. String iv = map.get("iv");
  147. if (StringUtils.isBlank(encryptedData)) {
  148. return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "encryptedData不能为空");
  149. }
  150. if (StringUtils.isBlank(iv)) {
  151. return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "iv不能为空");
  152. }
  153. WxCUser user = getUser();
  154. if (user != null) {
  155. WxMaService wxMaService = getWeappService(user.getAppId());
  156. logger.debug(user.toString());
  157. String session_key = user.getSessionKey();
  158. try {
  159. // 解密用户信息
  160. WxMaUserInfo userInfo = wxMaService.getUserService().getUserInfo(session_key, encryptedData, iv);
  161. if (userInfo != null) {
  162. logger.debug(userInfo.toString());
  163. user.setUnionId(userInfo.getUnionId());
  164. user.setNickName(userInfo.getNickName());
  165. user.setGender(Integer.parseInt(userInfo.getGender()));
  166. user.setAvatarUrl(userInfo.getAvatarUrl());
  167. user.setProvince(userInfo.getProvince());
  168. user.setCity(userInfo.getCity());
  169. user.setLanguage(userInfo.getLanguage());
  170. wxCUserService.saveOrUpdate(user);
  171. resultMap.put("openId", user.getOpenId());
  172. resultMap.put("unionId", user.getUnionId());
  173. resultMap.put("msg", "获取用户信息成功!");
  174. return new ResultData(resultMap);
  175. } else {
  176. return new ResultData(ErrorCode.NICK_NAME_DECODE_ERR, resultMap);
  177. }
  178. } catch (Exception e) {
  179. logger.error(e.getMessage(), e);
  180. return new ResultData(ErrorCode.DB_FAIL.getCode(), "解密并保存出错", resultMap);
  181. }
  182. } else {
  183. return new ResultData(ErrorCode.USER_IS_EMPTY);
  184. }
  185. }
  186. /**
  187. * 授权后获取用户的手机号等信息
  188. * @param map
  189. * @return
  190. */
  191. @PostMapping("/getUserPhone")
  192. @ApiOperation(value = "授权后获取用户的手机号", notes="{\"encryptedData\":\"string\",\"iv\":\"string\"}")
  193. public ResultData getUserPhone(@RequestBody Map<String, String> map) {
  194. logger.debug(map.toString());
  195. Map resultMap = new HashMap();
  196. String encryptedData = map.get("encryptedData");
  197. String iv = map.get("iv");
  198. //登录凭证不能为空
  199. if (StringUtils.isBlank(encryptedData)) {
  200. return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "encryptedData 不能为空");
  201. }
  202. if (StringUtils.isBlank(iv)) {
  203. return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "iv 不能为空");
  204. }
  205. WxCUser user = getUser();
  206. WxMaService wxMaService = getWeappService(user.getAppId());
  207. String session_key = user.getSessionKey();
  208. try {
  209. // 解密
  210. WxMaPhoneNumberInfo phoneNoInfo = wxMaService.getUserService().getPhoneNoInfo(session_key, encryptedData, iv);
  211. if (null != phoneNoInfo) {
  212. logger.debug(phoneNoInfo.toString());
  213. user.setPhone(phoneNoInfo.getPhoneNumber());
  214. user.setPurePhone(phoneNoInfo.getPurePhoneNumber());
  215. user.setCountryCode(phoneNoInfo.getCountryCode());
  216. wxCUserService.saveOrUpdate(user);
  217. resultMap.put("msg","授权手机成功!");
  218. resultMap.put("phone",phoneNoInfo.getPhoneNumber());
  219. return new ResultData(resultMap);
  220. } else {
  221. return new ResultData(ErrorCode.PHONE_DECODE_ERR, resultMap);
  222. }
  223. } catch (Exception e) {
  224. this.logger.error(e.getMessage(), e);
  225. return new ResultData(ErrorCode.DB_FAIL.getCode(), "解密并保存出错", resultMap);
  226. }
  227. }
  228. /**
  229. * 检查用户状态
  230. * @return
  231. */
  232. @PostMapping("/checkUserStatus")
  233. @ApiOperation(value = "判断是否是老用户", notes="")
  234. public ResultData checkUserStatus() {
  235. Map resultMap = new HashMap();
  236. WxCUser user = getUser();
  237. if (!StringUtils.isBlank(user.getNickName())) {
  238. resultMap.put("nickName", user.getNickName());
  239. }
  240. if (StringUtils.isBlank(user.getNickName())) {
  241. logger.warn("用户昵称未授权,跳转到用户授权页!");
  242. return new ResultData(ErrorCode.NICK_NAME_NOT_FOUND.getCode(), "用户昵称未授权,请跳转到用户昵称授权页!", resultMap);
  243. }
  244. return new ResultData(Result.SUCCESS, "是老用户,已完成所有授权", resultMap);
  245. }
  246. /**
  247. * 检查用户状态
  248. * @return
  249. */
  250. @PostMapping("/checkPhoneStatus")
  251. @ApiOperation(value = "判断是否是老用户", notes="")
  252. public ResultData checkPhoneStatus() {
  253. Map resultMap = new HashMap();
  254. WxCUser user = getUser();
  255. if (!StringUtils.isBlank(user.getPhone())) {
  256. resultMap.put("phone", user.getPhone());
  257. }
  258. if (StringUtils.isBlank(user.getPhone())) {
  259. logger.warn("用户手机号未授权,跳转到授权手机号页!");
  260. return new ResultData(ErrorCode.PHONE_NOT_FOUND.getCode(), "用户手机号未授权,请跳转到授权手机号页!", resultMap);
  261. }
  262. if (user.getPhone().contains("*")) {
  263. logger.warn("用户手机号已加密,跳转到手工输入手机号页!");
  264. return new ResultData(ErrorCode.PHONE_IS_ENCRYPTED.getCode(), "用户手机号已加密,手工输入手机号页!", resultMap);
  265. }
  266. return new ResultData(Result.SUCCESS, "是老用户,已完成所有授权", resultMap);
  267. }
  268. @ApiOperation("获取当前用户信息")
  269. @GetMapping("/userinfo")
  270. public ResultData getUserInfo() {
  271. WxCUser user = getUser();
  272. return new ResultData(Result.SUCCESS,"查询成功",user);
  273. }
  274. @ApiOperation("当前用户名下是否有车")
  275. @GetMapping("/carCount")
  276. public ResultData carCount() {
  277. WxCUser user = getUser();
  278. WxCUserCar userCar = new WxCUserCar();
  279. userCar.setTenantId(user.getTenantId());
  280. userCar.setCUserId(user.getId());
  281. Integer count = wxCUserCarService.countUserCar(userCar);
  282. if (count > 0) {
  283. Map returnMap = new HashMap();
  284. String phone = user.getPhone();
  285. if (phone.contains("*"))
  286. phone = user.getVerifyCodePhone();
  287. returnMap.put("phone", phone);
  288. returnMap.put("count", count);
  289. return new ResultData(Result.SUCCESS,"count获取成功", returnMap);
  290. } else {
  291. Map returnMap = new HashMap();
  292. returnMap.put("count", count);
  293. return new ResultData(Result.SUCCESS,"count获取成功", returnMap);
  294. }
  295. }
  296. @ApiOperation("获取当前用户车牌列表")
  297. @GetMapping("/carList")
  298. public ResultData getCarList() {
  299. WxCUser user = getUser();
  300. WxCUserCar userCar = new WxCUserCar();
  301. userCar.setTenantId(user.getTenantId());
  302. userCar.setCUserId(user.getId());
  303. List<WxCUserCar> list = wxCUserCarService.getList(userCar);
  304. return new ResultData(Result.SUCCESS,"获取查询成功", list);
  305. }
  306. /**
  307. * 微信消息服务验证
  308. * @param response
  309. * @param request
  310. * @throws IOException
  311. */
  312. @RequestMapping(value = "/signature")
  313. @ResponseBody
  314. public void signature(HttpServletResponse response, HttpServletRequest request) throws IOException {
  315. String signature = request.getParameter("signature");
  316. String timestamp = request.getParameter("timestamp");
  317. String nonce = request.getParameter("nonce");
  318. String echostr = request.getParameter("echostr");
  319. logger.warn("收到的微信服务验证信息"+signature+"\n"+timestamp+"\n"+nonce+"\n"+echostr);
  320. PrintWriter out = response.getWriter();
  321. /*
  322. // 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败
  323. if (CheckUtil.checkSignature(wp.getToken(), signature, timestamp, nonce)) {
  324. out.print(echostr);
  325. logger.warn("微信服务验证成功===================="+echostr);
  326. System.out.println("微信服务验证成功!");
  327. }
  328. */
  329. out.close();
  330. }
  331. }