Commit 915d3a55 authored by muhong's avatar muhong

修改 小程序登录接口

parent 0747b6a3
...@@ -2,7 +2,7 @@ dts: ...@@ -2,7 +2,7 @@ dts:
# 开发者应该设置成自己的wx相关信息 # 开发者应该设置成自己的wx相关信息
wx: wx:
app-id: wx3618eab6c8b144af app-id: wx3618eab6c8b144af
app-secret: 788559035a21b8a75b0c03f9281d5c0a app-secret: 6fee0d7b2197845fed0a3fe8f5a9bd66
mch-id: 1538666666 mch-id: 1538666666
mch-key: 1538xxxxxx-1538xxxxxx-1538xxxxxx mch-key: 1538xxxxxx-1538xxxxxx-1538xxxxxx
notify-url: https://test.dtsshop.com/demo/order/dtsNotify notify-url: https://test.dtsshop.com/demo/order/dtsNotify
...@@ -169,4 +169,6 @@ spring: ...@@ -169,4 +169,6 @@ spring:
server: server:
servlet: servlet:
session: session:
timeout: 720 timeout: 720
\ No newline at end of file
avatar-url: https://cdn.wanwudezhi.com/static/web-static/image/b888cc6cb9c004dc342f573653e38ebd_690x690.png
\ No newline at end of file
...@@ -2,7 +2,7 @@ dts: ...@@ -2,7 +2,7 @@ dts:
# 开发者应该设置成自己的wx相关信息 # 开发者应该设置成自己的wx相关信息
wx: wx:
app-id: wx3618eab6c8b144af app-id: wx3618eab6c8b144af
app-secret: 1a6e073ad84a1a44b6e882f3995bc400 app-secret: 6fee0d7b2197845fed0a3fe8f5a9bd66
mch-id: 1538666666 mch-id: 1538666666
mch-key: 1538xxxxxx-1538xxxxxx-1538xxxxxx mch-key: 1538xxxxxx-1538xxxxxx-1538xxxxxx
notify-url: https://test.dtsshop.com/demo/order/dtsNotify notify-url: https://test.dtsshop.com/demo/order/dtsNotify
...@@ -167,4 +167,6 @@ spring: ...@@ -167,4 +167,6 @@ spring:
server: server:
servlet: servlet:
session: session:
timeout: 720 timeout: 720
\ No newline at end of file
avatar-url: https://cdn.wanwudezhi.com/static/web-static/image/b888cc6cb9c004dc342f573653e38ebd_690x690.png
\ No newline at end of file
package com.wwdz.ch.wx.impl; package com.wwdz.ch.wx.impl;
import cn.binarywang.wx.miniapp.api.WxMaService;
import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.wwdz.ch.core.captcha.CaptchaCodeManager; import com.wwdz.ch.core.captcha.CaptchaCodeManager;
import com.wwdz.ch.core.notify.NotifyService; import com.wwdz.ch.core.notify.NotifyService;
...@@ -12,6 +9,8 @@ import com.wwdz.ch.core.type.Result; ...@@ -12,6 +9,8 @@ import com.wwdz.ch.core.type.Result;
import com.wwdz.ch.core.type.UserTypeEnum; import com.wwdz.ch.core.type.UserTypeEnum;
import com.wwdz.ch.core.util.CharUtil; import com.wwdz.ch.core.util.CharUtil;
import com.wwdz.ch.core.util.RegexUtil; import com.wwdz.ch.core.util.RegexUtil;
import com.wwdz.ch.core.util.UUID;
import com.wwdz.ch.core.util.bcrypt.BCryptPasswordEncoder;
import com.wwdz.ch.db.dao.UserDao; import com.wwdz.ch.db.dao.UserDao;
import com.wwdz.ch.db.domain.User; import com.wwdz.ch.db.domain.User;
import com.wwdz.ch.wx.constant.CacheCodeEnum; import com.wwdz.ch.wx.constant.CacheCodeEnum;
...@@ -22,6 +21,7 @@ import com.wwdz.ch.wx.entity.request.UserRequestDto; ...@@ -22,6 +21,7 @@ import com.wwdz.ch.wx.entity.request.UserRequestDto;
import com.wwdz.ch.wx.service.FavoritesService; import com.wwdz.ch.wx.service.FavoritesService;
import com.wwdz.ch.wx.service.UserService; import com.wwdz.ch.wx.service.UserService;
import com.wwdz.ch.wx.service.UserTokenManager; import com.wwdz.ch.wx.service.UserTokenManager;
import com.wwdz.ch.wx.service.WxLoginService;
import com.wwdz.ch.wx.util.IpUtil; import com.wwdz.ch.wx.util.IpUtil;
import com.wwdz.ch.wx.util.StringUtil; import com.wwdz.ch.wx.util.StringUtil;
import com.wwdz.ch.wx.util.WxResponseCode; import com.wwdz.ch.wx.util.WxResponseCode;
...@@ -29,6 +29,7 @@ import org.apache.commons.lang3.StringUtils; ...@@ -29,6 +29,7 @@ import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
...@@ -47,8 +48,6 @@ public class UserServiceImpl implements UserService { ...@@ -47,8 +48,6 @@ public class UserServiceImpl implements UserService {
@Autowired @Autowired
private UserDao userDao; private UserDao userDao;
@Autowired @Autowired
private WxMaService wxMaService;
@Autowired
private UserTokenManager userTokenManager; private UserTokenManager userTokenManager;
@Autowired @Autowired
private NotifyService notifyService; private NotifyService notifyService;
...@@ -56,54 +55,45 @@ public class UserServiceImpl implements UserService { ...@@ -56,54 +55,45 @@ public class UserServiceImpl implements UserService {
private ApplicationContext applicationContext; private ApplicationContext applicationContext;
@Autowired @Autowired
private FavoritesService favoritesService; private FavoritesService favoritesService;
@Autowired
private WxLoginService wxLoginService;
@Transactional(rollbackFor = Exception.class) @Value("${avatar-url}")
private String avatarUrl;
@Transactional
@Override @Override
public Result loginByWx(UserRequestDto dto, HttpServletRequest request) { public Result loginByWx(UserRequestDto dto, HttpServletRequest request) {
try { try {
String code = dto.getCode(); String mobile = "";
// 获取微信用户的sessionKey和openId
String sessionKey = null;
String openId = null;
try { try {
WxMaJscode2SessionResult result = wxMaService.getUserService().getSessionInfo(code); mobile = wxLoginService.getPhone(dto.getCode());
sessionKey = result.getSessionKey();
openId = result.getOpenid();
} catch (Exception e) { } catch (Exception e) {
logger.error("微信登录,调用官方接口失败:{}", code, e); logger.error("获取微信用户手机号失败", e);
return Result.failed("微信登录失败,获取openid失败"); return Result.failed("获取微信用户手机号失败");
} }
if (sessionKey == null || openId == null) { if (StringUtils.isBlank(mobile)) {
logger.error("微信登录,调用官方接口失败:{}", code); logger.error("获取微信用户手机号失败");
return Result.failed("微信登录失败,获取openid失败"); return Result.failed("获取微信用户手机号失败");
} }
// 获取用户微信绑定的手机号 User user = userDao.queryByMobile(mobile);
String mobile = ""; if (Objects.isNull(user)) {
if (StringUtils.isNotBlank(dto.getEncryptedData()) && StringUtils.isNotBlank(dto.getIv())) {
try {
WxMaPhoneNumberInfo wxMaPhoneNumberInfo = wxMaService.getUserService().getPhoneNoInfo(sessionKey, dto.getEncryptedData(), dto.getIv());
mobile = wxMaPhoneNumberInfo.getPhoneNumber();
} catch (Exception e) {
logger.error("微信登录,调用官方获取手机号接口失败:{}", code, e);
}
}
User user = userDao.queryByOid(openId);
if (user == null) {
user = new User(); user = new User();
user.setUsername(openId); user.setUsername("user" + mobile);
user.setPassword(openId); BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();
user.setWeixinOpenid(openId); user.setPassword(bCryptPasswordEncoder.encode("Aa123456"));
user.setAvatar(dto.getAvatarUrl()); user.setWeixinOpenid("");
user.setNickname("微信用户" + StringUtil.generateRandomString(10)); user.setMobile(mobile);
user.setAvatar(avatarUrl);
user.setNickname("收藏家" + StringUtil.generateRandomString(10));
user.setGender((byte) 0); user.setGender((byte) 0);
user.setUserLevel((byte) 0); user.setUserLevel((byte) 0);
user.setStatus((byte) 0); user.setStatus((byte) 0);
user.setLastLoginTime(new Date()); user.setLastLoginTime(new Date());
user.setLastLoginIp(IpUtil.client(request)); user.setLastLoginIp(IpUtil.client(request));
user.setShareUserId(dto.getShareUserId()); user.setShareUserId(dto.getShareUserId());
user.setMobile(mobile);
userDao.insert(user); userDao.insert(user);
FavoritesRequestDto favoritesRequestDto = new FavoritesRequestDto(); FavoritesRequestDto favoritesRequestDto = new FavoritesRequestDto();
...@@ -113,7 +103,7 @@ public class UserServiceImpl implements UserService { ...@@ -113,7 +103,7 @@ public class UserServiceImpl implements UserService {
user.setLastLoginTime(new Date()); user.setLastLoginTime(new Date());
user.setLastLoginIp(IpUtil.client(request)); user.setLastLoginIp(IpUtil.client(request));
if (userDao.updateById(user) == 0) { if (userDao.updateById(user) == 0) {
return Result.failed(505, "更新用户数据失败"); logger.error("更新用户最后登录信息失败");
} }
} }
...@@ -122,20 +112,21 @@ public class UserServiceImpl implements UserService { ...@@ -122,20 +112,21 @@ public class UserServiceImpl implements UserService {
try { try {
userToken = userTokenManager.generateToken(user.getId()); userToken = userTokenManager.generateToken(user.getId());
} catch (Exception e) { } catch (Exception e) {
logger.error("微信登录失败,生成token失败:{}", user.getId(), e); logger.error("微信快捷登录失败,生成token失败:{}", user.getId(), e);
return Result.failed("微信登录失败,生成token失败"); return Result.failed("微信快捷登录失败,生成token失败");
} }
userToken.setSessionKey(sessionKey); userToken.setSessionKey(UUID.randomUUID().toString().replace("-", ""));
UserInfo userInfo = new UserInfo();
Map<Object, Object> result = new HashMap<Object, Object>(); Map<Object, Object> result = new HashMap<Object, Object>();
result.put("token", userToken.getToken()); result.put("token", userToken.getToken());
result.put("tokenExpire", userToken.getExpireTime().toString()); result.put("tokenExpire", userToken.getExpireTime().toString());
UserInfo userInfo = new UserInfo();
userInfo.setUserId(user.getId()); userInfo.setUserId(user.getId());
userInfo.setPhone(user.getMobile());
userInfo.setAvatarUrl(user.getAvatar());
userInfo.setGender(user.getGender());
userInfo.setNickName(user.getNickname());
userInfo.setWechatId(user.getWechatId()); userInfo.setWechatId(user.getWechatId());
if (!StringUtils.isEmpty(user.getMobile())) {// 手机号存在则设置
userInfo.setPhone(user.getMobile());
}
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
String registerDate = simpleDateFormat.format(Objects.isNull(user.getAddTime()) ? new Date() : user.getAddTime()); String registerDate = simpleDateFormat.format(Objects.isNull(user.getAddTime()) ? new Date() : user.getAddTime());
userInfo.setRegisterDate(registerDate); userInfo.setRegisterDate(registerDate);
...@@ -146,14 +137,13 @@ public class UserServiceImpl implements UserService { ...@@ -146,14 +137,13 @@ public class UserServiceImpl implements UserService {
userInfo.setUserLevelDesc(UserTypeEnum.getInstance(user.getUserLevel()).getDesc()); userInfo.setUserLevelDesc(UserTypeEnum.getInstance(user.getUserLevel()).getDesc());
result.put("userInfo", userInfo); result.put("userInfo", userInfo);
logger.info("【请求结束】微信登录,响应结果:{}", JSONObject.toJSONString(result)); logger.info("【请求结束】手机号登录,响应结果:{}", JSONObject.toJSONString(result));
return Result.success(result); return Result.success(result);
} catch (Exception e){ } catch (Exception e) {
logger.error("微信登录失败", e); logger.error("微信快捷登录失败", e);
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return Result.failed("微信登录失败"); return Result.failed("微信快捷登录失败");
} }
} }
@Override @Override
...@@ -199,59 +189,33 @@ public class UserServiceImpl implements UserService { ...@@ -199,59 +189,33 @@ public class UserServiceImpl implements UserService {
return Result.failed("验证码不正确"); return Result.failed("验证码不正确");
} }
// 获取微信授权信息
String openId = "";
String sessionKey = "";
try {
WxMaJscode2SessionResult result = wxMaService.getUserService().getSessionInfo(dto.getCode());
openId = result.getOpenid();
sessionKey = result.getSessionKey();
} catch (Exception e) {
logger.error("微信登录,调用官方接口失败:{}", dto.getCode(), e);
return Result.failed("手机号登录失败,获取openid失败");
}
if (StringUtils.isBlank(openId)) {
return Result.failed("手机号登录失败,获取openid失败");
}
// 判断手机号用户是否存在 // 判断手机号用户是否存在
User user = userDao.queryByMobile(dto.getMobile()); User user = userDao.queryByMobile(dto.getMobile());
if (Objects.isNull(user)) { if (Objects.isNull(user)) {
User openUser = userDao.queryByOid(openId); user = new User();
if (Objects.isNull(openUser)) { user.setUsername("user" + dto.getMobile());
user = new User(); BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();
user.setUsername(openId); user.setPassword(bCryptPasswordEncoder.encode("Aa123456"));
user.setPassword(openId); user.setWeixinOpenid("");
user.setWeixinOpenid(openId); user.setMobile(dto.getMobile());
user.setMobile(dto.getMobile()); user.setAvatar(avatarUrl);
user.setAvatar(dto.getAvatarUrl()); user.setNickname("收藏家" + StringUtil.generateRandomString(10));
user.setNickname("微信用户" + StringUtil.generateRandomString(10)); user.setGender((byte) 0);
user.setGender((byte) 0); user.setUserLevel((byte) 0);
user.setUserLevel((byte) 0); user.setStatus((byte) 0);
user.setStatus((byte) 0); user.setLastLoginTime(new Date());
user.setLastLoginTime(new Date()); user.setLastLoginIp(IpUtil.client(request));
user.setLastLoginIp(IpUtil.client(request)); user.setShareUserId(dto.getShareUserId());
user.setShareUserId(dto.getShareUserId()); userDao.insert(user);
userDao.insert(user);
FavoritesRequestDto favoritesRequestDto = new FavoritesRequestDto(); FavoritesRequestDto favoritesRequestDto = new FavoritesRequestDto();
favoritesRequestDto.setUserId(user.getId()); favoritesRequestDto.setUserId(user.getId());
favoritesService.addDefault(favoritesRequestDto); favoritesService.addDefault(favoritesRequestDto);
} else {
user = openUser;
user.setMobile(dto.getMobile());
user.setLastLoginTime(new Date());
user.setLastLoginIp(IpUtil.client(request));
if (userDao.updateById(user) == 0) {
return Result.failed(505, "更新用户数据失败");
}
}
} else { } else {
user.setLastLoginTime(new Date()); user.setLastLoginTime(new Date());
user.setLastLoginIp(IpUtil.client(request)); user.setLastLoginIp(IpUtil.client(request));
if (userDao.updateById(user) == 0) { if (userDao.updateById(user) == 0) {
return Result.failed(505, "更新用户数据失败"); logger.error("更新用户最后登录信息失败");
} }
} }
...@@ -263,7 +227,7 @@ public class UserServiceImpl implements UserService { ...@@ -263,7 +227,7 @@ public class UserServiceImpl implements UserService {
logger.error("手机号登录失败,生成token失败:{}", user.getId(), e); logger.error("手机号登录失败,生成token失败:{}", user.getId(), e);
return Result.failed("手机号登录失败,生成token失败"); return Result.failed("手机号登录失败,生成token失败");
} }
userToken.setSessionKey(sessionKey); userToken.setSessionKey(UUID.randomUUID().toString().replace("-", ""));
Map<Object, Object> result = new HashMap<Object, Object>(); Map<Object, Object> result = new HashMap<Object, Object>();
result.put("token", userToken.getToken()); result.put("token", userToken.getToken());
......
package com.wwdz.ch.wx.impl;
import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl;
import com.wwdz.ch.core.util.HttpUtil;
import com.wwdz.ch.wx.service.WxLoginService;
import com.xxdxxs.utils.JsonUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.Map;
@Service
public class WxLoginServiceImpl implements WxLoginService {
private static final Logger logger = LoggerFactory.getLogger(WxMaServiceImpl.class);
private static final String GET_ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/stable_token";
private static final String GET_PHONE_URL = "https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=%s";
@Value("${dts.wx.app-id}")
private String appid;
@Value("${dts.wx.app-secret}")
private String secret;
@Override
public String getPhone(String code) {
logger.info("开始获取access_token----------------");
Map<String, String> tokenParam = new HashMap<>();
tokenParam.put("grant_type", "client_credential");
tokenParam.put("appid", appid);
tokenParam.put("secret", secret);
String tokenResult = HttpUtil.sendPost(GET_ACCESS_TOKEN_URL, tokenParam);
logger.info("获取access_token的结果是:" + tokenResult);
String accessToken = JsonUtils.getValueByPath(tokenResult, "access_token");
logger.info("开始获取phone-----------------------");
String url = String.format(GET_PHONE_URL, accessToken);
Map<String, String> phoneParam = new HashMap<>();
phoneParam.put("code", code);
String phoneResult = HttpUtil.sendPost(url, phoneParam);
logger.info("获取phone的结果是:" + phoneResult);
return JsonUtils.getValueByPath(phoneResult, "phone_info/phoneNumber");
}
}
package com.wwdz.ch.wx.service;
public interface WxLoginService {
String getPhone(String code);
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment