Commit 915d3a55 authored by muhong's avatar muhong

修改 小程序登录接口

parent 0747b6a3
......@@ -2,7 +2,7 @@ dts:
# 开发者应该设置成自己的wx相关信息
wx:
app-id: wx3618eab6c8b144af
app-secret: 788559035a21b8a75b0c03f9281d5c0a
app-secret: 6fee0d7b2197845fed0a3fe8f5a9bd66
mch-id: 1538666666
mch-key: 1538xxxxxx-1538xxxxxx-1538xxxxxx
notify-url: https://test.dtsshop.com/demo/order/dtsNotify
......@@ -170,3 +170,5 @@ server:
servlet:
session:
timeout: 720
avatar-url: https://cdn.wanwudezhi.com/static/web-static/image/b888cc6cb9c004dc342f573653e38ebd_690x690.png
\ No newline at end of file
......@@ -2,7 +2,7 @@ dts:
# 开发者应该设置成自己的wx相关信息
wx:
app-id: wx3618eab6c8b144af
app-secret: 1a6e073ad84a1a44b6e882f3995bc400
app-secret: 6fee0d7b2197845fed0a3fe8f5a9bd66
mch-id: 1538666666
mch-key: 1538xxxxxx-1538xxxxxx-1538xxxxxx
notify-url: https://test.dtsshop.com/demo/order/dtsNotify
......@@ -168,3 +168,5 @@ server:
servlet:
session:
timeout: 720
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;
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.wwdz.ch.core.captcha.CaptchaCodeManager;
import com.wwdz.ch.core.notify.NotifyService;
......@@ -12,6 +9,8 @@ import com.wwdz.ch.core.type.Result;
import com.wwdz.ch.core.type.UserTypeEnum;
import com.wwdz.ch.core.util.CharUtil;
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.domain.User;
import com.wwdz.ch.wx.constant.CacheCodeEnum;
......@@ -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.UserService;
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.StringUtil;
import com.wwdz.ch.wx.util.WxResponseCode;
......@@ -29,6 +29,7 @@ import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
......@@ -47,8 +48,6 @@ public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Autowired
private WxMaService wxMaService;
@Autowired
private UserTokenManager userTokenManager;
@Autowired
private NotifyService notifyService;
......@@ -56,54 +55,45 @@ public class UserServiceImpl implements UserService {
private ApplicationContext applicationContext;
@Autowired
private FavoritesService favoritesService;
@Autowired
private WxLoginService wxLoginService;
@Transactional(rollbackFor = Exception.class)
@Value("${avatar-url}")
private String avatarUrl;
@Transactional
@Override
public Result loginByWx(UserRequestDto dto, HttpServletRequest request) {
try {
String code = dto.getCode();
// 获取微信用户的sessionKey和openId
String sessionKey = null;
String openId = null;
try {
WxMaJscode2SessionResult result = wxMaService.getUserService().getSessionInfo(code);
sessionKey = result.getSessionKey();
openId = result.getOpenid();
} catch (Exception e) {
logger.error("微信登录,调用官方接口失败:{}", code, e);
return Result.failed("微信登录失败,获取openid失败");
}
if (sessionKey == null || openId == null) {
logger.error("微信登录,调用官方接口失败:{}", code);
return Result.failed("微信登录失败,获取openid失败");
}
// 获取用户微信绑定的手机号
String mobile = "";
if (StringUtils.isNotBlank(dto.getEncryptedData()) && StringUtils.isNotBlank(dto.getIv())) {
try {
WxMaPhoneNumberInfo wxMaPhoneNumberInfo = wxMaService.getUserService().getPhoneNoInfo(sessionKey, dto.getEncryptedData(), dto.getIv());
mobile = wxMaPhoneNumberInfo.getPhoneNumber();
mobile = wxLoginService.getPhone(dto.getCode());
} catch (Exception e) {
logger.error("微信登录,调用官方获取手机号接口失败:{}", code, e);
logger.error("获取微信用户手机号失败", e);
return Result.failed("获取微信用户手机号失败");
}
if (StringUtils.isBlank(mobile)) {
logger.error("获取微信用户手机号失败");
return Result.failed("获取微信用户手机号失败");
}
User user = userDao.queryByOid(openId);
if (user == null) {
User user = userDao.queryByMobile(mobile);
if (Objects.isNull(user)) {
user = new User();
user.setUsername(openId);
user.setPassword(openId);
user.setWeixinOpenid(openId);
user.setAvatar(dto.getAvatarUrl());
user.setNickname("微信用户" + StringUtil.generateRandomString(10));
user.setUsername("user" + mobile);
BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();
user.setPassword(bCryptPasswordEncoder.encode("Aa123456"));
user.setWeixinOpenid("");
user.setMobile(mobile);
user.setAvatar(avatarUrl);
user.setNickname("收藏家" + StringUtil.generateRandomString(10));
user.setGender((byte) 0);
user.setUserLevel((byte) 0);
user.setStatus((byte) 0);
user.setLastLoginTime(new Date());
user.setLastLoginIp(IpUtil.client(request));
user.setShareUserId(dto.getShareUserId());
user.setMobile(mobile);
userDao.insert(user);
FavoritesRequestDto favoritesRequestDto = new FavoritesRequestDto();
......@@ -113,7 +103,7 @@ public class UserServiceImpl implements UserService {
user.setLastLoginTime(new Date());
user.setLastLoginIp(IpUtil.client(request));
if (userDao.updateById(user) == 0) {
return Result.failed(505, "更新用户数据失败");
logger.error("更新用户最后登录信息失败");
}
}
......@@ -122,20 +112,21 @@ public class UserServiceImpl implements UserService {
try {
userToken = userTokenManager.generateToken(user.getId());
} catch (Exception e) {
logger.error("微信登录失败,生成token失败:{}", user.getId(), e);
return Result.failed("微信登录失败,生成token失败");
logger.error("微信快捷登录失败,生成token失败:{}", user.getId(), e);
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>();
result.put("token", userToken.getToken());
result.put("tokenExpire", userToken.getExpireTime().toString());
UserInfo userInfo = new UserInfo();
userInfo.setUserId(user.getId());
userInfo.setWechatId(user.getWechatId());
if (!StringUtils.isEmpty(user.getMobile())) {// 手机号存在则设置
userInfo.setPhone(user.getMobile());
}
userInfo.setAvatarUrl(user.getAvatar());
userInfo.setGender(user.getGender());
userInfo.setNickName(user.getNickname());
userInfo.setWechatId(user.getWechatId());
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
String registerDate = simpleDateFormat.format(Objects.isNull(user.getAddTime()) ? new Date() : user.getAddTime());
userInfo.setRegisterDate(registerDate);
......@@ -146,14 +137,13 @@ public class UserServiceImpl implements UserService {
userInfo.setUserLevelDesc(UserTypeEnum.getInstance(user.getUserLevel()).getDesc());
result.put("userInfo", userInfo);
logger.info("【请求结束】微信登录,响应结果:{}", JSONObject.toJSONString(result));
logger.info("【请求结束】手机号登录,响应结果:{}", JSONObject.toJSONString(result));
return Result.success(result);
} catch (Exception e){
logger.error("微信登录失败", e);
} catch (Exception e) {
logger.error("微信快捷登录失败", e);
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return Result.failed("微信登录失败");
return Result.failed("微信快捷登录失败");
}
}
@Override
......@@ -199,34 +189,17 @@ public class UserServiceImpl implements UserService {
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());
if (Objects.isNull(user)) {
User openUser = userDao.queryByOid(openId);
if (Objects.isNull(openUser)) {
user = new User();
user.setUsername(openId);
user.setPassword(openId);
user.setWeixinOpenid(openId);
user.setUsername("user" + dto.getMobile());
BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();
user.setPassword(bCryptPasswordEncoder.encode("Aa123456"));
user.setWeixinOpenid("");
user.setMobile(dto.getMobile());
user.setAvatar(dto.getAvatarUrl());
user.setNickname("微信用户" + StringUtil.generateRandomString(10));
user.setAvatar(avatarUrl);
user.setNickname("收藏家" + StringUtil.generateRandomString(10));
user.setGender((byte) 0);
user.setUserLevel((byte) 0);
user.setStatus((byte) 0);
......@@ -238,20 +211,11 @@ public class UserServiceImpl implements UserService {
FavoritesRequestDto favoritesRequestDto = new FavoritesRequestDto();
favoritesRequestDto.setUserId(user.getId());
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 {
user.setLastLoginTime(new Date());
user.setLastLoginIp(IpUtil.client(request));
if (userDao.updateById(user) == 0) {
return Result.failed(505, "更新用户数据失败");
logger.error("更新用户最后登录信息失败");
}
}
......@@ -263,7 +227,7 @@ public class UserServiceImpl implements UserService {
logger.error("手机号登录失败,生成token失败:{}", user.getId(), e);
return Result.failed("手机号登录失败,生成token失败");
}
userToken.setSessionKey(sessionKey);
userToken.setSessionKey(UUID.randomUUID().toString().replace("-", ""));
Map<Object, Object> result = new HashMap<Object, Object>();
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