|
- 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<String, String> 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<String, String> 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<String, String> 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);
- }
-
- }
|