You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

243 lines
9.5 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.service.WxAppinfoService;
  17. import com.simple.service.WxCUserService;
  18. import com.simple.utils.IPUtil;
  19. import io.swagger.annotations.ApiImplicitParam;
  20. import io.swagger.annotations.ApiOperation;
  21. import me.chanjar.weixin.common.error.WxErrorException;
  22. import org.apache.commons.lang3.StringUtils;
  23. import org.slf4j.Logger;
  24. import org.slf4j.LoggerFactory;
  25. import org.springframework.beans.factory.annotation.Autowired;
  26. import org.springframework.web.bind.annotation.*;
  27. import org.springframework.web.context.request.RequestContextHolder;
  28. import org.springframework.web.context.request.ServletRequestAttributes;
  29. import javax.servlet.http.HttpServletRequest;
  30. import java.util.Date;
  31. import java.util.HashMap;
  32. import java.util.Map;
  33. @RestController
  34. @RequestMapping("/api/user")
  35. public class WxUserGrantController extends BaseController {
  36. private final static Logger logger = LoggerFactory.getLogger(WxUserGrantController.class);
  37. @Autowired
  38. private WxCUserService wxCUserService;
  39. /**
  40. * 用户登录
  41. * @param map
  42. * @return
  43. */
  44. @AuthIgnore
  45. @PostMapping("/login")
  46. @ApiOperation(value="用户登录", notes="{\"appId\":\"string\",\"code\":\"string\",\"scene\":\"string\",\"sceneAddress\":\"string\"}")
  47. public ResultData userLogin(@RequestBody Map<String, String> map) {
  48. logger.debug(map.toString());
  49. Map resultMap = new HashMap();
  50. String appId = map.get("appId");
  51. String code = map.get("code");
  52. String scene = map.get("scene");
  53. String sceneAddress = map.get("sceneAddress");
  54. //登录凭证不能为空
  55. if (StringUtils.isBlank(appId)) {
  56. return new ResultData(ErrorCode.PARAMETER_NOT_NULL.getCode(), "appId不能为空");
  57. }
  58. if (StringUtils.isBlank(code)) {
  59. return new ResultData(ErrorCode.PARAMETER_NOT_NULL.getCode(), "code不能为空");
  60. }
  61. // 通过appinfo得到tenant_id
  62. WxAppinfo wxAppinfo = getAppInfo(appId);
  63. WxMaService wxMaService = getWeappService(appId);
  64. String token = null;
  65. String session_key = null;
  66. String openId = null;
  67. HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
  68. String ipaddress = IPUtil.getIpAddr(request);
  69. try {
  70. WxMaJscode2SessionResult session = wxMaService.jsCode2SessionInfo(code);
  71. //获取会话密钥(session_key)
  72. session_key = session.getSessionKey();
  73. openId = session.getOpenid();
  74. logger.info("session_key: " + session_key);
  75. logger.info("openId: " + openId);
  76. resultMap.put("openId", openId);
  77. } catch (WxErrorException e) {
  78. logger.error(e.getMessage(), e);
  79. return new ResultData(ErrorCode.SESSION_KEY_DECODE_ERR, resultMap);
  80. }
  81. WxCUser user = new WxCUser();
  82. user.setAppId(appId);
  83. user.setOpenId(openId);
  84. try {
  85. WxCUser user1 = wxCUserService.getByOpenId(user);
  86. if (user1 != null) {
  87. user1.createToken(new Date());
  88. token = user1.getToken();
  89. user1.setRegisterIp(ipaddress);
  90. user1.setSessionKey(session_key);
  91. if (user1.getScene() == null)
  92. user1.setScene(scene);
  93. if (user1.getSceneAddress() == null)
  94. user1.setSceneAddress(sceneAddress);
  95. wxCUserService.saveOrUpdate(user1);
  96. resultMap.put("token", token);
  97. } else {
  98. user.setTenantId(wxAppinfo.getTenantId());
  99. user.createToken(new Date());
  100. token = user.getToken();
  101. user.setRegisterIp(ipaddress);
  102. if (user.getScene() == null)
  103. user.setScene(scene);
  104. if (user.getSceneAddress() == null)
  105. user.setSceneAddress(sceneAddress);
  106. user.setSessionKey(session_key);
  107. wxCUserService.saveOrUpdate(user);
  108. resultMap.put("token", token);
  109. }
  110. } catch (Exception e) {
  111. logger.error(e.getMessage());
  112. return new ResultData(ErrorCode.DB_FAIL.getCode(), "wx_c_user数据库保存出错", resultMap);
  113. }
  114. return new ResultData(resultMap);
  115. }
  116. /**
  117. * 获取用户的昵称等信息
  118. * @param map
  119. * @return
  120. */
  121. @PostMapping("/getUserInfo")
  122. @ApiOperation(value="授权后获取用户的昵称,unionId等信息", notes="{\"encryptedData\":\"string\",\"iv\":\"string\"}")
  123. public ResultData getUserInfo(@RequestBody Map<String, String> map) {
  124. logger.debug(map.toString());
  125. Map resultMap = new HashMap();
  126. String encryptedData = map.get("encryptedData");
  127. String iv = map.get("iv");
  128. if (StringUtils.isBlank(encryptedData)) {
  129. return new ResultData(ErrorCode.PARAMETER_NOT_NULL.getCode(), "encryptedData不能为空");
  130. }
  131. if (StringUtils.isBlank(iv)) {
  132. return new ResultData(ErrorCode.PARAMETER_NOT_NULL.getCode(), "iv不能为空");
  133. }
  134. WxCUser user = getUser();
  135. if (user != null) {
  136. WxMaService wxMaService = getWeappService(user.getAppId());
  137. logger.debug(user.toString());
  138. String session_key = user.getSessionKey();
  139. try {
  140. // 解密用户信息
  141. WxMaUserInfo userInfo = wxMaService.getUserService().getUserInfo(session_key, encryptedData, iv);
  142. if (userInfo != null) {
  143. logger.debug(userInfo.toString());
  144. user.setUnionId(userInfo.getUnionId());
  145. user.setNickName(userInfo.getNickName());
  146. user.setGender(Integer.parseInt(userInfo.getGender()));
  147. user.setAvatarUrl(userInfo.getAvatarUrl());
  148. user.setProvince(userInfo.getProvince());
  149. user.setCity(userInfo.getCity());
  150. user.setLanguage(userInfo.getLanguage());
  151. wxCUserService.saveOrUpdate(user);
  152. resultMap.put("openId", user.getOpenId());
  153. resultMap.put("unionId", user.getUnionId());
  154. resultMap.put("msg", "获取用户信息成功!");
  155. return new ResultData(resultMap);
  156. } else {
  157. return new ResultData(ErrorCode.NICK_NAME_DECODE_ERR, resultMap);
  158. }
  159. } catch (Exception e) {
  160. logger.error(e.getMessage(), e);
  161. return new ResultData(ErrorCode.DB_FAIL.getCode(), "解密并保存出错", resultMap);
  162. }
  163. } else {
  164. return new ResultData(ErrorCode.USER_IS_EMPTY);
  165. }
  166. }
  167. /**
  168. * 授权后获取用户的手机号等信息
  169. * @param map
  170. * @return
  171. */
  172. @PostMapping("/getUserPhone")
  173. @ApiOperation(value = "授权后获取用户的手机号", notes="{\"encryptedData\":\"string\",\"iv\":\"string\"}")
  174. public ResultData getUserPhone(@RequestBody Map<String, String> map) {
  175. logger.debug(map.toString());
  176. Map resultMap = new HashMap();
  177. String encryptedData = map.get("encryptedData");
  178. String iv = map.get("iv");
  179. //登录凭证不能为空
  180. if (StringUtils.isBlank(encryptedData)) {
  181. return new ResultData(ErrorCode.PARAMETER_NOT_NULL.getCode(), "encryptedData 不能为空");
  182. }
  183. if (StringUtils.isBlank(iv)) {
  184. return new ResultData(ErrorCode.PARAMETER_NOT_NULL.getCode(), "iv 不能为空");
  185. }
  186. WxCUser user = getUser();
  187. WxMaService wxMaService = getWeappService(user.getAppId());
  188. String session_key = user.getSessionKey();
  189. try {
  190. // 解密
  191. WxMaPhoneNumberInfo phoneNoInfo = wxMaService.getUserService().getPhoneNoInfo(session_key, encryptedData, iv);
  192. if (null != phoneNoInfo) {
  193. logger.debug(phoneNoInfo.toString());
  194. user.setPhone(phoneNoInfo.getPhoneNumber());
  195. user.setPurePhone(phoneNoInfo.getPurePhoneNumber());
  196. user.setCountryCode(phoneNoInfo.getCountryCode());
  197. wxCUserService.saveOrUpdate(user);
  198. resultMap.put("msg","授权手机成功!");
  199. resultMap.put("phone",phoneNoInfo.getPhoneNumber());
  200. return new ResultData(resultMap);
  201. } else {
  202. return new ResultData(ErrorCode.PHONE_DECODE_ERR, resultMap);
  203. }
  204. } catch (Exception e) {
  205. this.logger.error(e.getMessage(), e);
  206. return new ResultData(ErrorCode.DB_FAIL.getCode(), "解密并保存出错", resultMap);
  207. }
  208. }
  209. @ApiOperation("获取用户信息")
  210. @GetMapping("/findById")
  211. public ResultData getUserInfo() {
  212. WxCUser user = getUser();
  213. return new ResultData(Result.SUCCESS,"查询成功",user);
  214. }
  215. }