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

365 строки
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. HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
  81. String ipaddress = IPUtil.getIpAddr(request);
  82. try {
  83. WxMaJscode2SessionResult session = wxMaService.jsCode2SessionInfo(code);
  84. //获取会话密钥(session_key)
  85. session_key = session.getSessionKey();
  86. openId = session.getOpenid();
  87. logger.info("session_key: " + session_key);
  88. logger.info("openId: " + openId);
  89. resultMap.put("openId", openId);
  90. } catch (WxErrorException e) {
  91. logger.error(e.getMessage(), e);
  92. return new ResultData(ErrorCode.SESSION_KEY_DECODE_ERR, resultMap);
  93. }
  94. WxCUser user = new WxCUser();
  95. user.setTenantId(wxAppinfo.getTenantId());
  96. user.setAppId(appId);
  97. user.setOpenId(openId);
  98. try {
  99. WxCUser user1 = wxCUserService.getByOpenId(user);
  100. if (user1 != null) {
  101. user1.createToken(new Date());
  102. token = user1.getToken();
  103. user1.setRegisterIp(ipaddress);
  104. user1.setSessionKey(session_key);
  105. if (user1.getSceneAddress() == null)
  106. user1.setSceneAddress(sceneAddress);
  107. user.setLongitude(BigDecimal.valueOf(Double.valueOf(longitude)));
  108. user.setLatitude(BigDecimal.valueOf(Double.valueOf(latitude)));
  109. // TODO 成长值
  110. wxCUserService.saveOrUpdate(user1);
  111. resultMap.put("token", token);
  112. } else {
  113. user.setTenantId(wxAppinfo.getTenantId());
  114. user.createToken(new Date());
  115. token = user.getToken();
  116. user.setRegisterIp(ipaddress);
  117. if (user.getSceneAddress() == null)
  118. user.setSceneAddress(sceneAddress);
  119. user.setSessionKey(session_key);
  120. user.setLongitude(BigDecimal.valueOf(Double.valueOf(longitude)));
  121. user.setLatitude(BigDecimal.valueOf(Double.valueOf(latitude)));
  122. // TODO 成长值
  123. wxCUserService.saveOrUpdate(user);
  124. resultMap.put("token", token);
  125. }
  126. } catch (Exception e) {
  127. logger.error(e.getMessage());
  128. return new ResultData(ErrorCode.DB_FAIL.getCode(), "wx_c_user数据库保存出错", resultMap);
  129. }
  130. return new ResultData(resultMap);
  131. }
  132. /**
  133. * 获取用户的昵称等信息
  134. * @param map
  135. * @return
  136. */
  137. @PostMapping("/getUserInfo")
  138. @ApiOperation(value="授权后获取用户的昵称,unionId等信息", notes="{\"encryptedData\":\"string\",\"iv\":\"string\"}")
  139. public ResultData getUserInfo(@RequestBody Map<String, String> map) {
  140. logger.debug(map.toString());
  141. Map resultMap = new HashMap();
  142. String encryptedData = map.get("encryptedData");
  143. String iv = map.get("iv");
  144. if (StringUtils.isBlank(encryptedData)) {
  145. return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "encryptedData不能为空");
  146. }
  147. if (StringUtils.isBlank(iv)) {
  148. return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "iv不能为空");
  149. }
  150. WxCUser user = getUser();
  151. if (user != null) {
  152. WxMaService wxMaService = getWeappService(user.getAppId());
  153. logger.debug(user.toString());
  154. String session_key = user.getSessionKey();
  155. try {
  156. // 解密用户信息
  157. WxMaUserInfo userInfo = wxMaService.getUserService().getUserInfo(session_key, encryptedData, iv);
  158. if (userInfo != null) {
  159. logger.debug(userInfo.toString());
  160. user.setUnionId(userInfo.getUnionId());
  161. user.setNickName(userInfo.getNickName());
  162. user.setGender(Integer.parseInt(userInfo.getGender()));
  163. user.setAvatarUrl(userInfo.getAvatarUrl());
  164. user.setProvince(userInfo.getProvince());
  165. user.setCity(userInfo.getCity());
  166. user.setLanguage(userInfo.getLanguage());
  167. wxCUserService.saveOrUpdate(user);
  168. resultMap.put("openId", user.getOpenId());
  169. resultMap.put("unionId", user.getUnionId());
  170. resultMap.put("msg", "获取用户信息成功!");
  171. return new ResultData(resultMap);
  172. } else {
  173. return new ResultData(ErrorCode.NICK_NAME_DECODE_ERR, resultMap);
  174. }
  175. } catch (Exception e) {
  176. logger.error(e.getMessage(), e);
  177. return new ResultData(ErrorCode.DB_FAIL.getCode(), "解密并保存出错", resultMap);
  178. }
  179. } else {
  180. return new ResultData(ErrorCode.USER_IS_EMPTY);
  181. }
  182. }
  183. /**
  184. * 授权后获取用户的手机号等信息
  185. * @param map
  186. * @return
  187. */
  188. @PostMapping("/getUserPhone")
  189. @ApiOperation(value = "授权后获取用户的手机号", notes="{\"encryptedData\":\"string\",\"iv\":\"string\"}")
  190. public ResultData getUserPhone(@RequestBody Map<String, String> map) {
  191. logger.debug(map.toString());
  192. Map resultMap = new HashMap();
  193. String encryptedData = map.get("encryptedData");
  194. String iv = map.get("iv");
  195. //登录凭证不能为空
  196. if (StringUtils.isBlank(encryptedData)) {
  197. return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "encryptedData 不能为空");
  198. }
  199. if (StringUtils.isBlank(iv)) {
  200. return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "iv 不能为空");
  201. }
  202. WxCUser user = getUser();
  203. WxMaService wxMaService = getWeappService(user.getAppId());
  204. String session_key = user.getSessionKey();
  205. try {
  206. // 解密
  207. WxMaPhoneNumberInfo phoneNoInfo = wxMaService.getUserService().getPhoneNoInfo(session_key, encryptedData, iv);
  208. if (null != phoneNoInfo) {
  209. logger.debug(phoneNoInfo.toString());
  210. user.setPhone(phoneNoInfo.getPhoneNumber());
  211. user.setPurePhone(phoneNoInfo.getPurePhoneNumber());
  212. user.setCountryCode(phoneNoInfo.getCountryCode());
  213. wxCUserService.saveOrUpdate(user);
  214. resultMap.put("msg","授权手机成功!");
  215. resultMap.put("phone",phoneNoInfo.getPhoneNumber());
  216. return new ResultData(resultMap);
  217. } else {
  218. return new ResultData(ErrorCode.PHONE_DECODE_ERR, resultMap);
  219. }
  220. } catch (Exception e) {
  221. this.logger.error(e.getMessage(), e);
  222. return new ResultData(ErrorCode.DB_FAIL.getCode(), "解密并保存出错", resultMap);
  223. }
  224. }
  225. /**
  226. * 检查用户状态
  227. * @return
  228. */
  229. @PostMapping("/checkUserStatus")
  230. @ApiOperation(value = "判断是否是老用户", notes="")
  231. public ResultData checkUserStatus() {
  232. Map resultMap = new HashMap();
  233. WxCUser user = getUser();
  234. if (!StringUtils.isBlank(user.getNickName())) {
  235. resultMap.put("nickName", user.getNickName());
  236. }
  237. if (StringUtils.isBlank(user.getNickName())) {
  238. logger.warn("用户昵称未授权,跳转到用户授权页!");
  239. return new ResultData(ErrorCode.NICK_NAME_NOT_FOUND.getCode(), "用户昵称未授权,请跳转到用户昵称授权页!", resultMap);
  240. }
  241. return new ResultData(Result.SUCCESS, "是老用户,已完成所有授权", resultMap);
  242. }
  243. /**
  244. * 检查用户状态
  245. * @return
  246. */
  247. @PostMapping("/checkPhoneStatus")
  248. @ApiOperation(value = "判断是否是老用户", notes="")
  249. public ResultData checkPhoneStatus() {
  250. Map resultMap = new HashMap();
  251. WxCUser user = getUser();
  252. if (!StringUtils.isBlank(user.getPhone())) {
  253. resultMap.put("phone", user.getPhone());
  254. }
  255. if (StringUtils.isBlank(user.getPhone())) {
  256. logger.warn("用户手机号未授权,跳转到授权手机号页!");
  257. return new ResultData(ErrorCode.PHONE_NOT_FOUND.getCode(), "用户手机号未授权,请跳转到授权手机号页!", resultMap);
  258. }
  259. if (user.getPhone().contains("*")) {
  260. logger.warn("用户手机号已加密,跳转到手工输入手机号页!");
  261. return new ResultData(ErrorCode.PHONE_IS_ENCRYPTED.getCode(), "用户手机号已加密,手工输入手机号页!", resultMap);
  262. }
  263. return new ResultData(Result.SUCCESS, "是老用户,已完成所有授权", resultMap);
  264. }
  265. @ApiOperation("获取当前用户信息")
  266. @GetMapping("/userinfo")
  267. public ResultData getUserInfo() {
  268. WxCUser user = getUser();
  269. return new ResultData(Result.SUCCESS,"查询成功",user);
  270. }
  271. @ApiOperation("当前用户名下是否有车")
  272. @GetMapping("/carCount")
  273. public ResultData carCount() {
  274. WxCUser user = getUser();
  275. WxCUserCar userCar = new WxCUserCar();
  276. userCar.setTenantId(user.getTenantId());
  277. userCar.setCUserId(user.getId());
  278. Integer count = wxCUserCarService.countUserCar(userCar);
  279. if (count > 0) {
  280. Map returnMap = new HashMap();
  281. String phone = user.getPhone();
  282. if (phone.contains("*"))
  283. phone = user.getVerifyCodePhone();
  284. returnMap.put("phone", phone);
  285. returnMap.put("count", count);
  286. return new ResultData(Result.SUCCESS,"count获取成功", returnMap);
  287. } else {
  288. Map returnMap = new HashMap();
  289. returnMap.put("count", count);
  290. return new ResultData(Result.SUCCESS,"count获取成功", returnMap);
  291. }
  292. }
  293. @ApiOperation("获取当前用户车牌列表")
  294. @GetMapping("/carList")
  295. public ResultData getCarList() {
  296. WxCUser user = getUser();
  297. WxCUserCar userCar = new WxCUserCar();
  298. userCar.setTenantId(user.getTenantId());
  299. userCar.setCUserId(user.getId());
  300. List<WxCUserCar> list = wxCUserCarService.getList(userCar);
  301. return new ResultData(Result.SUCCESS,"获取查询成功", list);
  302. }
  303. /**
  304. * 微信消息服务验证
  305. * @param response
  306. * @param request
  307. * @throws IOException
  308. */
  309. @RequestMapping(value = "/signature")
  310. @ResponseBody
  311. public void signature(HttpServletResponse response, HttpServletRequest request) throws IOException {
  312. String signature = request.getParameter("signature");
  313. String timestamp = request.getParameter("timestamp");
  314. String nonce = request.getParameter("nonce");
  315. String echostr = request.getParameter("echostr");
  316. logger.warn("收到的微信服务验证信息"+signature+"\n"+timestamp+"\n"+nonce+"\n"+echostr);
  317. PrintWriter out = response.getWriter();
  318. /*
  319. // 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败
  320. if (CheckUtil.checkSignature(wp.getToken(), signature, timestamp, nonce)) {
  321. out.print(echostr);
  322. logger.warn("微信服务验证成功===================="+echostr);
  323. System.out.println("微信服务验证成功!");
  324. }
  325. */
  326. out.close();
  327. }
  328. }