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.service.WxAppinfoService; import com.simple.service.WxCUserService; import com.simple.utils.IPUtil; 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 java.util.Date; import java.util.HashMap; import java.util.Map; @RestController @RequestMapping("/api/user") public class WxUserGrantController extends BaseController { private final static Logger logger = LoggerFactory.getLogger(WxUserGrantController.class); @Autowired private WxCUserService wxCUserService; /** * 用户登录 * @param map * @return */ @AuthIgnore @PostMapping("/login") @ApiOperation(value="用户登录", notes="{\"appId\":\"string\",\"code\":\"string\",\"scene\":\"string\",\"sceneAddress\":\"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 scene = map.get("scene"); String sceneAddress = map.get("sceneAddress"); //登录凭证不能为空 if (StringUtils.isBlank(appId)) { return new ResultData(ErrorCode.PARAMETER_NOT_NULL.getCode(), "appId不能为空"); } if (StringUtils.isBlank(code)) { return new ResultData(ErrorCode.PARAMETER_NOT_NULL.getCode(), "code不能为空"); } // 通过appinfo得到tenant_id WxAppinfo wxAppinfo = getAppInfo(appId); WxMaService wxMaService = getWeappService(appId); 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.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.getScene() == null) user1.setScene(scene); if (user1.getSceneAddress() == null) user1.setSceneAddress(sceneAddress); wxCUserService.saveOrUpdate(user1); resultMap.put("token", token); } else { user.setTenantId(wxAppinfo.getTenantId()); user.createToken(new Date()); token = user.getToken(); user.setRegisterIp(ipaddress); if (user.getScene() == null) user.setScene(scene); if (user.getSceneAddress() == null) user.setSceneAddress(sceneAddress); user.setSessionKey(session_key); 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.PARAMETER_NOT_NULL.getCode(), "encryptedData不能为空"); } if (StringUtils.isBlank(iv)) { return new ResultData(ErrorCode.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.PARAMETER_NOT_NULL.getCode(), "encryptedData 不能为空"); } if (StringUtils.isBlank(iv)) { return new ResultData(ErrorCode.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); } } @ApiOperation("获取用户信息") @GetMapping("/findById") public ResultData getUserInfo() { WxCUser user = getUser(); return new ResultData(Result.SUCCESS,"查询成功",user); } }