package com.simple.controller; import cn.binarywang.wx.miniapp.api.WxMaService; import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl; import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult; import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo; import cn.binarywang.wx.miniapp.bean.WxMaUserInfo; import cn.binarywang.wx.miniapp.config.WxMaInMemoryConfig; import com.alibaba.druid.wall.WallConfig; import com.simple.annotation.AuthIgnore; import com.simple.common.ErrorCode; import com.simple.common.IdWorker; import com.simple.common.Result; import com.simple.common.ResultData; import com.simple.domain.po.WxAppinfo; import com.simple.domain.po.WxCUser; import com.simple.domain.po.WxCUserCar; import com.simple.service.WxAppinfoService; import com.simple.service.WxCUserCarService; import com.simple.service.WxCUserService; import com.simple.utils.CheckUtil; import com.simple.utils.IPUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; import me.chanjar.weixin.common.error.WxErrorException; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; import java.math.BigDecimal; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; @RestController @RequestMapping("/api/user") @Api(description = "用户登陆授权相关接口") public class WxUserGrantController extends BaseController { private final static Logger logger = LoggerFactory.getLogger(WxUserGrantController.class); @Autowired private WxCUserService wxCUserService; @Autowired private WxCUserCarService wxCUserCarService; /** * 用户登录 * @param map * @return */ @AuthIgnore @PostMapping("/login") @ApiOperation(value="用户登录", notes="{\"appId\":\"string\",\"code\":\"string\",\"scene\":\"string\",\"sceneAddress\":\"string\",\"latitude\":\"string\",\"longitude\":\"string\"}") public ResultData userLogin(@RequestBody Map map) { logger.debug(map.toString()); Map resultMap = new HashMap(); String appId = map.get("appId"); String code = map.get("code"); String sceneAddress = map.get("sceneAddress"); String longitude = map.get("longitude"); String latitude = map.get("latitude"); //登录凭证不能为空 if (StringUtils.isBlank(appId)) { return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "appId不能为空"); } if (StringUtils.isBlank(code)) { return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "code不能为空"); } // 通过appinfo得到tenant_id WxAppinfo wxAppinfo = getAppInfo(appId); WxMaService wxMaService = getWeappServiceByAppInfo(wxAppinfo); String token = null; String session_key = null; String openId = null; HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest(); String ipaddress = IPUtil.getIpAddr(request); try { WxMaJscode2SessionResult session = wxMaService.jsCode2SessionInfo(code); //获取会话密钥(session_key) session_key = session.getSessionKey(); openId = session.getOpenid(); logger.info("session_key: " + session_key); logger.info("openId: " + openId); resultMap.put("openId", openId); } catch (WxErrorException e) { logger.error(e.getMessage(), e); return new ResultData(ErrorCode.SESSION_KEY_DECODE_ERR, resultMap); } WxCUser user = new WxCUser(); user.setTenantId(wxAppinfo.getTenantId()); user.setAppId(appId); user.setOpenId(openId); try { WxCUser user1 = wxCUserService.getByOpenId(user); if (user1 != null) { user1.createToken(new Date()); token = user1.getToken(); user1.setRegisterIp(ipaddress); user1.setSessionKey(session_key); if (user1.getSceneAddress() == null) user1.setSceneAddress(sceneAddress); user.setLongitude(BigDecimal.valueOf(Double.valueOf(longitude))); user.setLatitude(BigDecimal.valueOf(Double.valueOf(latitude))); // TODO 成长值 wxCUserService.saveOrUpdate(user1); resultMap.put("token", token); } else { user.setTenantId(wxAppinfo.getTenantId()); user.createToken(new Date()); token = user.getToken(); user.setRegisterIp(ipaddress); if (user.getSceneAddress() == null) user.setSceneAddress(sceneAddress); user.setSessionKey(session_key); user.setLongitude(BigDecimal.valueOf(Double.valueOf(longitude))); user.setLatitude(BigDecimal.valueOf(Double.valueOf(latitude))); // TODO 成长值 wxCUserService.saveOrUpdate(user); resultMap.put("token", token); } } catch (Exception e) { logger.error(e.getMessage()); return new ResultData(ErrorCode.DB_FAIL.getCode(), "wx_c_user数据库保存出错", resultMap); } return new ResultData(resultMap); } /** * 获取用户的昵称等信息 * @param map * @return */ @PostMapping("/getUserInfo") @ApiOperation(value="授权后获取用户的昵称,unionId等信息", notes="{\"encryptedData\":\"string\",\"iv\":\"string\"}") public ResultData getUserInfo(@RequestBody Map map) { logger.debug(map.toString()); Map resultMap = new HashMap(); String encryptedData = map.get("encryptedData"); String iv = map.get("iv"); if (StringUtils.isBlank(encryptedData)) { return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "encryptedData不能为空"); } if (StringUtils.isBlank(iv)) { return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "iv不能为空"); } WxCUser user = getUser(); if (user != null) { WxMaService wxMaService = getWeappService(user.getAppId()); logger.debug(user.toString()); String session_key = user.getSessionKey(); try { // 解密用户信息 WxMaUserInfo userInfo = wxMaService.getUserService().getUserInfo(session_key, encryptedData, iv); if (userInfo != null) { logger.debug(userInfo.toString()); user.setUnionId(userInfo.getUnionId()); user.setNickName(userInfo.getNickName()); user.setGender(Integer.parseInt(userInfo.getGender())); user.setAvatarUrl(userInfo.getAvatarUrl()); user.setProvince(userInfo.getProvince()); user.setCity(userInfo.getCity()); user.setLanguage(userInfo.getLanguage()); wxCUserService.saveOrUpdate(user); resultMap.put("openId", user.getOpenId()); resultMap.put("unionId", user.getUnionId()); resultMap.put("msg", "获取用户信息成功!"); return new ResultData(resultMap); } else { return new ResultData(ErrorCode.NICK_NAME_DECODE_ERR, resultMap); } } catch (Exception e) { logger.error(e.getMessage(), e); return new ResultData(ErrorCode.DB_FAIL.getCode(), "解密并保存出错", resultMap); } } else { return new ResultData(ErrorCode.USER_IS_EMPTY); } } /** * 授权后获取用户的手机号等信息 * @param map * @return */ @PostMapping("/getUserPhone") @ApiOperation(value = "授权后获取用户的手机号", notes="{\"encryptedData\":\"string\",\"iv\":\"string\"}") public ResultData getUserPhone(@RequestBody Map map) { logger.debug(map.toString()); Map resultMap = new HashMap(); String encryptedData = map.get("encryptedData"); String iv = map.get("iv"); //登录凭证不能为空 if (StringUtils.isBlank(encryptedData)) { return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "encryptedData 不能为空"); } if (StringUtils.isBlank(iv)) { return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "iv 不能为空"); } WxCUser user = getUser(); WxMaService wxMaService = getWeappService(user.getAppId()); String session_key = user.getSessionKey(); try { // 解密 WxMaPhoneNumberInfo phoneNoInfo = wxMaService.getUserService().getPhoneNoInfo(session_key, encryptedData, iv); if (null != phoneNoInfo) { logger.debug(phoneNoInfo.toString()); user.setPhone(phoneNoInfo.getPhoneNumber()); user.setPurePhone(phoneNoInfo.getPurePhoneNumber()); user.setCountryCode(phoneNoInfo.getCountryCode()); wxCUserService.saveOrUpdate(user); resultMap.put("msg","授权手机成功!"); resultMap.put("phone",phoneNoInfo.getPhoneNumber()); return new ResultData(resultMap); } else { return new ResultData(ErrorCode.PHONE_DECODE_ERR, resultMap); } } catch (Exception e) { this.logger.error(e.getMessage(), e); return new ResultData(ErrorCode.DB_FAIL.getCode(), "解密并保存出错", resultMap); } } /** * 检查用户状态 * @return */ @PostMapping("/checkUserStatus") @ApiOperation(value = "判断是否是老用户", notes="") public ResultData checkUserStatus() { Map resultMap = new HashMap(); WxCUser user = getUser(); if (!StringUtils.isBlank(user.getNickName())) { resultMap.put("nickName", user.getNickName()); } if (StringUtils.isBlank(user.getNickName())) { logger.warn("用户昵称未授权,跳转到用户授权页!"); return new ResultData(ErrorCode.NICK_NAME_NOT_FOUND.getCode(), "用户昵称未授权,请跳转到用户昵称授权页!", resultMap); } return new ResultData(Result.SUCCESS, "是老用户,已完成所有授权", resultMap); } /** * 检查用户状态 * @return */ @PostMapping("/checkPhoneStatus") @ApiOperation(value = "判断是否是老用户", notes="") public ResultData checkPhoneStatus() { Map resultMap = new HashMap(); WxCUser user = getUser(); if (!StringUtils.isBlank(user.getPhone())) { resultMap.put("phone", user.getPhone()); } if (StringUtils.isBlank(user.getPhone())) { logger.warn("用户手机号未授权,跳转到授权手机号页!"); return new ResultData(ErrorCode.PHONE_NOT_FOUND.getCode(), "用户手机号未授权,请跳转到授权手机号页!", resultMap); } if (user.getPhone().contains("*")) { logger.warn("用户手机号已加密,跳转到手工输入手机号页!"); return new ResultData(ErrorCode.PHONE_IS_ENCRYPTED.getCode(), "用户手机号已加密,手工输入手机号页!", resultMap); } return new ResultData(Result.SUCCESS, "是老用户,已完成所有授权", resultMap); } @ApiOperation("获取当前用户信息") @GetMapping("/userinfo") public ResultData getUserInfo() { WxCUser user = getUser(); return new ResultData(Result.SUCCESS,"查询成功",user); } @ApiOperation("当前用户名下是否有车") @GetMapping("/carCount") public ResultData carCount() { WxCUser user = getUser(); WxCUserCar userCar = new WxCUserCar(); userCar.setTenantId(user.getTenantId()); userCar.setCUserId(user.getId()); Integer count = wxCUserCarService.countUserCar(userCar); if (count > 0) { Map returnMap = new HashMap(); String phone = user.getPhone(); if (phone.contains("*")) phone = user.getVerifyCodePhone(); returnMap.put("phone", phone); returnMap.put("count", count); return new ResultData(Result.SUCCESS,"count获取成功", returnMap); } else { Map returnMap = new HashMap(); returnMap.put("count", count); return new ResultData(Result.SUCCESS,"count获取成功", returnMap); } } @ApiOperation("获取当前用户车牌列表") @GetMapping("/carList") public ResultData getCarList() { WxCUser user = getUser(); WxCUserCar userCar = new WxCUserCar(); userCar.setTenantId(user.getTenantId()); userCar.setCUserId(user.getId()); List list = wxCUserCarService.getList(userCar); return new ResultData(Result.SUCCESS,"获取查询成功", list); } /** * 微信消息服务验证 * @param response * @param request * @throws IOException */ @RequestMapping(value = "/signature") @ResponseBody public void signature(HttpServletResponse response, HttpServletRequest request) throws IOException { String signature = request.getParameter("signature"); String timestamp = request.getParameter("timestamp"); String nonce = request.getParameter("nonce"); String echostr = request.getParameter("echostr"); logger.warn("收到的微信服务验证信息"+signature+"\n"+timestamp+"\n"+nonce+"\n"+echostr); PrintWriter out = response.getWriter(); /* // 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败 if (CheckUtil.checkSignature(wp.getToken(), signature, timestamp, nonce)) { out.print(echostr); logger.warn("微信服务验证成功===================="+echostr); System.out.println("微信服务验证成功!"); } */ out.close(); } }