LoginServiceImpl.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. package com.caimei.service.impl;
  2. import com.caimei.components.RedisService;
  3. import com.caimei.mapper.AuthMapper;
  4. import com.caimei.mapper.ClubMapper;
  5. import com.caimei.mapper.LoginMapper;
  6. import com.caimei.mapper.ShopMapper;
  7. import com.caimei.model.ResponseJson;
  8. import com.caimei.model.po.ClubUserPo;
  9. import com.caimei.model.po.CmBrandAuthPo;
  10. import com.caimei.model.vo.WxClubUserVo;
  11. import com.caimei.service.LoginService;
  12. import com.caimei.utils.CodeUtil;
  13. import com.caimei.utils.SmsUtils;
  14. import com.caimei.utils.WxUtils;
  15. import lombok.extern.slf4j.Slf4j;
  16. import org.apache.commons.lang3.StringUtils;
  17. import org.springframework.stereotype.Service;
  18. import javax.annotation.Resource;
  19. import java.util.Date;
  20. import java.util.Map;
  21. import java.util.UUID;
  22. /**
  23. * Description
  24. *
  25. * @author : Aslee
  26. * @date : 2021/7/15
  27. */
  28. @Slf4j
  29. @Service
  30. public class LoginServiceImpl implements LoginService {
  31. @Resource
  32. private RedisService redisService;
  33. @Resource
  34. private LoginMapper loginMapper;
  35. @Resource
  36. private ShopMapper shopMapper;
  37. @Resource
  38. private ClubMapper clubMapper;
  39. @Resource
  40. private AuthMapper authMapper;
  41. @Override
  42. public ResponseJson<WxClubUserVo> loginByAuthorization(String code, String appId) {
  43. if (StringUtils.isEmpty(code)) {
  44. return ResponseJson.error("参数异常,请输入code", null);
  45. }
  46. if (StringUtils.isEmpty(code)) {
  47. return ResponseJson.error("参数异常,请输入appId", null);
  48. }
  49. // 获取供应商公众号appId对应的appSecret
  50. String appSecret = shopMapper.getAppSecretByAppId(appId);
  51. if (StringUtils.isEmpty(appSecret)) {
  52. return ResponseJson.error("参数异常,该公众号不存在", null);
  53. }
  54. Map<String,String> infoMap;
  55. try {
  56. infoMap = WxUtils.getAccessToken(code, appId, appSecret);
  57. } catch (Exception e) {
  58. log.info("微信服务器异常", e);
  59. return ResponseJson.error(-1, "微信服务器异常", null);
  60. }
  61. if ("-1".equals(infoMap.get("code"))) {
  62. return ResponseJson.error(infoMap.get("errmsg"), null);
  63. }
  64. //解析相应内容(转换成json对象)
  65. String openId = infoMap.get("openId");
  66. String accessToken = infoMap.get("accessToken");
  67. log.info("微信授权,openId:>>>>>>>>>>>" + openId);
  68. WxClubUserVo clubUser = loginMapper.findClubUserByOpenId(openId);
  69. if (null == clubUser) {
  70. clubUser = new WxClubUserVo();
  71. clubUser.setOpenId(openId);
  72. clubUser.setAccessToken(accessToken);
  73. return ResponseJson.error(-2, "未绑定微信", clubUser);
  74. }
  75. clubUser.setAccessToken(accessToken);
  76. // 登录成功redis保存token
  77. redisService.set(accessToken, openId, 60L * 60 * 4);
  78. return ResponseJson.success(clubUser);
  79. }
  80. @Override
  81. public ResponseJson sendVerifyCode(String mobile, String appId, Integer type) {
  82. if (StringUtils.isEmpty(mobile)) {
  83. return ResponseJson.error("参数异常,请输入手机号");
  84. }
  85. if (StringUtils.isEmpty(appId)) {
  86. return ResponseJson.error("参数异常,请输入appId");
  87. }
  88. if (2 == type) {
  89. // 服务号校验手机号是否已被使用
  90. Integer clubUserId = clubMapper.checkMobile(mobile, appId);
  91. if (null != clubUserId) {
  92. return ResponseJson.error("该手机号已使用,请重新输入");
  93. }
  94. }
  95. // 获取供应商名称
  96. String shopName = shopMapper.getShopNameByAppId(appId);
  97. if (StringUtils.isEmpty(shopName)) {
  98. return ResponseJson.error("供应商不存在");
  99. } else {
  100. if (shopName.contains("上海品辉")) {
  101. shopName = "上海品辉";
  102. }
  103. }
  104. String verifyCode = CodeUtil.generateCodeInt(6);
  105. String content = "欢迎登录" + shopName + "会员,您的短信验证码为:" + verifyCode + ",该验证码 5 分钟内有效,请勿泄漏于他人。";
  106. Boolean sendSms = SmsUtils.sendSms(11, mobile, content);
  107. if (!sendSms) {
  108. log.info("会员登录验证码发送失败,手机号:" + mobile);
  109. return ResponseJson.error("发送失败,请确认手机号无误");
  110. } else {
  111. log.info("会员登录验证码发送成功,手机号:" + mobile + ",验证码:" + verifyCode);
  112. }
  113. redisService.set("code:" + mobile, verifyCode, 300L);
  114. return ResponseJson.success("发送成功");
  115. }
  116. @Override
  117. public ResponseJson<WxClubUserVo> loginByInvitationCode(String mobile, String verifyCode, String invitationCode, String accessToken, String openId, String appId) throws Exception {
  118. if (StringUtils.isEmpty(mobile)) {
  119. return ResponseJson.error("参数异常,请输入手机号", null);
  120. }
  121. if (StringUtils.isEmpty(verifyCode)) {
  122. return ResponseJson.error("参数异常,请输入验证码", null);
  123. }
  124. if (StringUtils.isEmpty(invitationCode)) {
  125. return ResponseJson.error("参数异常,请输入邀请码", null);
  126. }
  127. if (StringUtils.isEmpty(accessToken)) {
  128. return ResponseJson.error("参数异常,请输入accessToken", null);
  129. }
  130. if (StringUtils.isEmpty(openId)) {
  131. return ResponseJson.error("参数异常,请输入openId", null);
  132. }
  133. if (StringUtils.isEmpty(appId)) {
  134. return ResponseJson.error("参数异常,请输入appId", null);
  135. }
  136. // 校验验证码是否正确
  137. String redisVerifyCode = null == redisService.get("code:" + mobile) ? null : redisService.get("code:" + mobile).toString();
  138. if (!verifyCode.equals(redisVerifyCode)) {
  139. return ResponseJson.error("验证码错误,请重新输入", null);
  140. }
  141. // 校验邀请码是否有效
  142. ClubUserPo clubUserPo = loginMapper.findByInvitationCode(invitationCode);
  143. if (null == clubUserPo || 2 == clubUserPo.getStatus() || clubUserPo.getInvitationCodeTime().compareTo(new Date()) < 0) {
  144. return ResponseJson.error("邀请码已失效", null);
  145. }
  146. // 校验机构和供应商的状态是否为已上线
  147. CmBrandAuthPo clubPo = authMapper.getAuthById(clubUserPo.getAuthId());
  148. Integer shopStatus = shopMapper.getShopStatus(clubPo.getAuthUserId());
  149. if (1 != clubPo.getStatus() || 1 != shopStatus) {
  150. return ResponseJson.error("登录失败", null);
  151. }
  152. // 校验appId是否和机构所属供应商的appId相同
  153. String dbAppId = shopMapper.getAppId(clubPo.getAuthUserId());
  154. if (StringUtils.isEmpty(dbAppId) || !appId.equals(dbAppId)) {
  155. return ResponseJson.error("登录失败", null);
  156. }
  157. Map<String, String> userInfo = WxUtils.getUserInfo(accessToken, openId);
  158. String nickName = userInfo.get("nickName");
  159. loginMapper.bindClubUser(mobile, nickName, openId, invitationCode);
  160. WxClubUserVo clubUser = new WxClubUserVo();
  161. clubUser.setClubUserId(clubUserPo.getId());
  162. clubUser.setAuthId(clubUserPo.getAuthId());
  163. clubUser.setAuthUserId(clubPo.getAuthUserId());
  164. clubUser.setMobile(mobile);
  165. clubUser.setOpenId(openId);
  166. clubUser.setAccessToken(accessToken);
  167. // 登录成功redis保存token
  168. redisService.set(accessToken, openId, 60L * 60 * 4);
  169. return ResponseJson.success(clubUser);
  170. }
  171. @Override
  172. public ResponseJson<WxClubUserVo> loginByVerifyCode(String mobile, String verifyCode, String appId) {
  173. if (StringUtils.isEmpty(mobile)) {
  174. return ResponseJson.error("参数异常,请输入手机号", null);
  175. }
  176. if (StringUtils.isEmpty(verifyCode)) {
  177. return ResponseJson.error("参数异常,请输入验证码", null);
  178. }
  179. if (StringUtils.isEmpty(appId)) {
  180. return ResponseJson.error("参数异常,请输入appId", null);
  181. }
  182. // 校验验证码是否正确
  183. String redisVerifyCode = null == redisService.get("code:" + mobile) ? null : redisService.get("code:" + mobile).toString();
  184. if (!verifyCode.equals(redisVerifyCode)) {
  185. return ResponseJson.error("验证码错误,请重新输入", null);
  186. }
  187. // 获取手机号对应机构用户
  188. WxClubUserVo clubUser = clubMapper.getWxClubUser(mobile, appId);
  189. if (null == clubUser) {
  190. clubUser = new WxClubUserVo();
  191. clubUser.setMobile(mobile);
  192. return ResponseJson.error(-2,"未注册,请填写邀请码注册", clubUser);
  193. }
  194. // 校验机构和供应商的状态是否为已上线
  195. CmBrandAuthPo clubPo = authMapper.getAuthById(clubUser.getAuthId());
  196. Integer shopStatus = shopMapper.getShopStatus(clubPo.getAuthUserId());
  197. if (1 != clubPo.getStatus() || 1 != shopStatus) {
  198. return ResponseJson.error("登录失败", null);
  199. }
  200. // 登录成功redis保存token
  201. String accessToken = UUID.randomUUID().toString();
  202. redisService.set(accessToken, mobile + "," + appId, 60L * 60 * 24);
  203. clubUser.setAccessToken(accessToken);
  204. return ResponseJson.success(clubUser);
  205. }
  206. @Override
  207. public ResponseJson<WxClubUserVo> loginByInvitationCode(String mobile, String invitationCode, String appId) {
  208. if (StringUtils.isEmpty(mobile)) {
  209. return ResponseJson.error("参数异常,请输入手机号", null);
  210. }
  211. if (StringUtils.isEmpty(invitationCode)) {
  212. return ResponseJson.error("参数异常,请输入邀请码", null);
  213. }
  214. if (StringUtils.isEmpty(appId)) {
  215. return ResponseJson.error("参数异常,请输入appId", null);
  216. }
  217. // 校验邀请码是否有效
  218. ClubUserPo clubUserPo = loginMapper.findByInvitationCode(invitationCode);
  219. if (null == clubUserPo || 2 == clubUserPo.getStatus() || clubUserPo.getInvitationCodeTime().compareTo(new Date()) < 0) {
  220. return ResponseJson.error("邀请码已失效", null);
  221. }
  222. // 校验机构和供应商的状态是否为已上线
  223. CmBrandAuthPo clubPo = authMapper.getAuthById(clubUserPo.getAuthId());
  224. Integer shopStatus = shopMapper.getShopStatus(clubPo.getAuthUserId());
  225. if (1 != clubPo.getStatus() || 1 != shopStatus) {
  226. return ResponseJson.error("登录失败", null);
  227. }
  228. // 校验appId是否和机构所属供应商的appId相同
  229. String dbAppId = shopMapper.getAppId(clubPo.getAuthUserId());
  230. if (StringUtils.isEmpty(dbAppId) || !appId.equals(dbAppId)) {
  231. return ResponseJson.error("登录失败", null);
  232. }
  233. loginMapper.bindClubUser(mobile, null, null, invitationCode);
  234. WxClubUserVo clubUser = new WxClubUserVo();
  235. clubUser.setClubUserId(clubUserPo.getId());
  236. clubUser.setAuthId(clubUserPo.getAuthId());
  237. clubUser.setAuthUserId(clubPo.getAuthUserId());
  238. clubUser.setMobile(mobile);
  239. // 登录成功redis保存token
  240. String accessToken = UUID.randomUUID().toString();
  241. redisService.set(accessToken, mobile + "," + appId, 60L * 60 * 24);
  242. clubUser.setAccessToken(accessToken);
  243. return ResponseJson.success(clubUser);
  244. }
  245. }