用户登录优化,修改为不使用短信验证码的方案了。
This commit is contained in:
@@ -33,6 +33,7 @@ public class PlatformIdAOP {
|
||||
PlatformKey platformKey = method.getAnnotation(PlatformKey.class);
|
||||
if(platformKey != null){
|
||||
PlatformContext.changeKey(platformKey.value());
|
||||
PlatformContext.set("platform_id",1);
|
||||
}
|
||||
NoPlatform noPlatform = method.getAnnotation(NoPlatform.class);
|
||||
if(noPlatform != null){
|
||||
|
||||
@@ -59,7 +59,8 @@ public class LoginOrRegisterController extends BaseApiController {
|
||||
* 手机号和验证码登录
|
||||
*/
|
||||
@RequestMapping(value = "/member/login" , method = RequestMethod.POST)
|
||||
public ResponseDTO register(@RequestParam("mobile")String mobile,@RequestParam("captcha")String captcha){
|
||||
@Deprecated
|
||||
public ResponseDTO register(@RequestParam("mobile")String mobile,@RequestParam("captcha")String captcha){
|
||||
|
||||
return ResponseDTO.ok().addAttribute("authorization",loginRegisterService.loginByMobile(mobile,captcha));
|
||||
}
|
||||
@@ -68,6 +69,7 @@ public class LoginOrRegisterController extends BaseApiController {
|
||||
* 微信授权登录
|
||||
*/
|
||||
@RequestMapping(value = "/member/login/wx" , method = RequestMethod.POST)
|
||||
@Deprecated
|
||||
public ResponseDTO loginWx(@RequestParam("code") String code, @RequestParam("nickname") String nickname,
|
||||
@RequestParam("avatar") String avatar){
|
||||
String openId = wechatService.getXcxOpenId(code); //查询openId:
|
||||
@@ -79,11 +81,13 @@ public class LoginOrRegisterController extends BaseApiController {
|
||||
}
|
||||
|
||||
/**
|
||||
* 绑定手机号
|
||||
* 微信小程序手机号一键登录
|
||||
* loginCode: wx.login获取的code,用于获取openId
|
||||
* phoneCode: wx.getPhoneNumber获取的code,用于获取手机号
|
||||
*/
|
||||
@RequestMapping(value = "/member/login/wx/phone" , method = RequestMethod.POST)
|
||||
public ResponseDTO phone(BindMobileDTO bindMobileDTO){
|
||||
MemberTokenDTO memberTokenDTO = loginRegisterService.bildMobile(bindMobileDTO);
|
||||
MemberTokenDTO memberTokenDTO = loginRegisterService.loginWithPhoneCode(bindMobileDTO);
|
||||
return ResponseDTO.ok()
|
||||
.addAttribute("authorization",memberTokenDTO);
|
||||
}
|
||||
|
||||
@@ -25,8 +25,9 @@ public class UploadController extends BaseApiController {
|
||||
@RequestMapping("/upload/avatar")
|
||||
@AccessToken
|
||||
public ResponseDTO uploadImg(@RequestParam("image") MultipartFile file) throws IOException {
|
||||
Integer loginMemberId = getLoginMemberId();
|
||||
String imgUrl = ossClientUtil.uploadImg(file);
|
||||
loginRegisterService.updateInformation(getLoginMemberId(),null,imgUrl);
|
||||
loginRegisterService.updateInformation(loginMemberId,null,imgUrl);
|
||||
return ResponseDTO.ok();
|
||||
}
|
||||
|
||||
|
||||
@@ -7,10 +7,12 @@ import com.sv.api.context.PlatformContext;
|
||||
import com.sv.dto.api.BindMobileDTO;
|
||||
import com.sv.dto.api.MemberInformationDTO;
|
||||
import com.sv.dto.api.MemberTokenDTO;
|
||||
import com.sv.dto.api.wechat.WechatLoginResult;
|
||||
import com.sv.entity.Member;
|
||||
import com.sv.entity.MemberAuth;
|
||||
import com.sv.exception.api.ExceptionCodeTemplate;
|
||||
import com.sv.api.util.OSSHelper;
|
||||
import com.sv.api.service.impl.wechat.WechatService;
|
||||
import com.sv.service.api.MemberAuthService;
|
||||
import com.sv.service.api.MemberService;
|
||||
import com.sv.service.api.MemberTokenService;
|
||||
@@ -21,6 +23,7 @@ import com.ydd.framework.core.common.utils.ValidationUtils;
|
||||
import com.ydd.framework.core.entity.enums.DeletedEnum;
|
||||
import com.ydd.framework.core.exception.ServiceException;
|
||||
import com.ydd.framework.core.service.impl.BaseServiceImpl;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.apache.http.HttpEntity;
|
||||
import org.apache.http.HttpResponse;
|
||||
import org.apache.http.client.config.RequestConfig;
|
||||
@@ -60,11 +63,14 @@ public class LoginRegisterServiceImpl extends BaseServiceImpl {
|
||||
|
||||
@Resource
|
||||
private OSSClientUtil ossClientUtil;
|
||||
@Resource
|
||||
private WechatService wechatService;
|
||||
|
||||
/**
|
||||
* 手机号注册
|
||||
*/
|
||||
@Transactional
|
||||
@Deprecated
|
||||
public MemberTokenDTO registerByMobile(String mobile,String captcha,String name,Integer sex,Integer age,String address){
|
||||
ValidationUtils.assertNotBlank(mobile, "请输入手机号码");
|
||||
VenueValidateUtils.assertMobile(mobile);
|
||||
@@ -100,6 +106,7 @@ public class LoginRegisterServiceImpl extends BaseServiceImpl {
|
||||
* 手机号和验证码登录
|
||||
*/
|
||||
@Transactional
|
||||
@Deprecated
|
||||
public MemberTokenDTO loginByMobile(String mobile, String captcha){
|
||||
// 参数校验
|
||||
ValidationUtils.assertNotBlank(mobile, "请输入手机号码");
|
||||
@@ -216,85 +223,85 @@ public class LoginRegisterServiceImpl extends BaseServiceImpl {
|
||||
/**
|
||||
* 绑定手机号
|
||||
*/
|
||||
public MemberTokenDTO bildMobile(BindMobileDTO bindMobileDTO){
|
||||
// 参数校验
|
||||
ValidationUtils.assertNotBlank(bindMobileDTO.getMobile(), "请输入手机号码");
|
||||
VenueValidateUtils.assertMobile(bindMobileDTO.getMobile());
|
||||
ValidationUtils.assertNotNull(bindMobileDTO.getNickname());
|
||||
ValidationUtils.assertNotNull(bindMobileDTO.getAvatar());
|
||||
ValidationUtils.assertNotNull(bindMobileDTO.getOpenId());
|
||||
ValidationUtils.assertNotBlank(bindMobileDTO.getCaptcha(), "请输入验证码");
|
||||
// 校验验证码是否正确
|
||||
captchaCacheService.assertCaptcha(bindMobileDTO.getMobile(), ApiConstants.PHONE_SMS_CAPTCHA_PREFIX, bindMobileDTO.getCaptcha());
|
||||
|
||||
MemberTokenDTO memberTokenDTO = null;
|
||||
Member member = memberService.findByMobile(bindMobileDTO.getMobile());
|
||||
// 不存在直接注册
|
||||
if (member == null){
|
||||
// 根据手机号码创建新用户
|
||||
member = memberService.createByMobile(bindMobileDTO.getMobile(),bindMobileDTO.getName(),
|
||||
bindMobileDTO.getSex(),bindMobileDTO.getAge(),bindMobileDTO.getAddress(),PlatformContext.getValue());
|
||||
// 修改用户图像
|
||||
updateInformation(member.getId(),bindMobileDTO.getNickname(),bindMobileDTO.getAvatar());
|
||||
// 删除验证码
|
||||
captchaCacheService.remove(bindMobileDTO.getMobile(), ApiConstants.REGISTER_SMS_CAPTCHA_PREFIX);
|
||||
|
||||
// 查询认证
|
||||
MemberAuth memberAuth = memberAuthService.findByMobile(bindMobileDTO.getMobile());
|
||||
if (memberAuth == null){
|
||||
// 创建用户登录认证
|
||||
memberAuth = memberAuthService.createByMobileByOpenId(member.getId(),member.getPlatformId(),
|
||||
bindMobileDTO.getMobile(),bindMobileDTO.getOpenId());
|
||||
}
|
||||
|
||||
// 查询访问凭证,并强制更新
|
||||
memberTokenDTO = memberTokenService.findDTOByMemberId(memberAuth.getMemberId(), Boolean.TRUE);
|
||||
}else {
|
||||
if (DeletedEnum.YES.value.equals(member.getDeleted())) {
|
||||
throw new ServiceException(ExceptionCodeTemplate.NONE_MEMBER_INFORMATION);
|
||||
}
|
||||
if(member.getStatus().intValue() == MemberStatusEnum.DISABLE.value.intValue()){
|
||||
throw new ServiceException(ExceptionCodeTemplate.MEMBER_ERROR);
|
||||
}
|
||||
|
||||
// 查询用户登录的方式(member_auth表中)
|
||||
memberTokenDTO = checkLogin(member.getId(),bindMobileDTO.getOpenId(),member,bindMobileDTO);
|
||||
}
|
||||
|
||||
return memberTokenDTO;
|
||||
}
|
||||
// public MemberTokenDTO bildMobile(BindMobileDTO bindMobileDTO){
|
||||
// // 参数校验
|
||||
//// ValidationUtils.assertNotBlank(bindMobileDTO.getMobile(), "请输入手机号码");
|
||||
// VenueValidateUtils.assertMobile(bindMobileDTO.getMobile());
|
||||
// ValidationUtils.assertNotNull(bindMobileDTO.getNickname());
|
||||
// ValidationUtils.assertNotNull(bindMobileDTO.getAvatar());
|
||||
// ValidationUtils.assertNotNull(bindMobileDTO.getOpenId());
|
||||
//// ValidationUtils.assertNotBlank(bindMobileDTO.getCaptcha(), "请输入验证码");
|
||||
// // 校验验证码是否正确
|
||||
//// captchaCacheService.assertCaptcha(bindMobileDTO.getMobile(), ApiConstants.PHONE_SMS_CAPTCHA_PREFIX, bindMobileDTO.getCaptcha());
|
||||
//
|
||||
// MemberTokenDTO memberTokenDTO = null;
|
||||
// Member member = memberService.findByMobile(bindMobileDTO.getMobile());
|
||||
// // 不存在直接注册
|
||||
// if (member == null){
|
||||
// // 根据手机号码创建新用户
|
||||
// member = memberService.createByMobile(bindMobileDTO.getMobile(),bindMobileDTO.getName(),
|
||||
// bindMobileDTO.getSex(),bindMobileDTO.getAge(),bindMobileDTO.getAddress(),PlatformContext.getValue());
|
||||
// // 修改用户图像
|
||||
// updateInformation(member.getId(),bindMobileDTO.getNickname(),bindMobileDTO.getAvatar());
|
||||
// // 删除验证码
|
||||
// captchaCacheService.remove(bindMobileDTO.getMobile(), ApiConstants.REGISTER_SMS_CAPTCHA_PREFIX);
|
||||
//
|
||||
// // 查询认证
|
||||
// MemberAuth memberAuth = memberAuthService.findByMobile(bindMobileDTO.getMobile());
|
||||
// if (memberAuth == null){
|
||||
// // 创建用户登录认证
|
||||
// memberAuth = memberAuthService.createByMobileByOpenId(member.getId(),member.getPlatformId(),
|
||||
// bindMobileDTO.getMobile(),bindMobileDTO.getOpenId());
|
||||
// }
|
||||
//
|
||||
// // 查询访问凭证,并强制更新
|
||||
// memberTokenDTO = memberTokenService.findDTOByMemberId(memberAuth.getMemberId(), Boolean.TRUE);
|
||||
// }else {
|
||||
// if (DeletedEnum.YES.value.equals(member.getDeleted())) {
|
||||
// throw new ServiceException(ExceptionCodeTemplate.NONE_MEMBER_INFORMATION);
|
||||
// }
|
||||
// if(member.getStatus().intValue() == MemberStatusEnum.DISABLE.value.intValue()){
|
||||
// throw new ServiceException(ExceptionCodeTemplate.MEMBER_ERROR);
|
||||
// }
|
||||
//
|
||||
// // 查询用户登录的方式(member_auth表中)
|
||||
// memberTokenDTO = checkLogin(member.getId(),bindMobileDTO.getOpenId(),member,bindMobileDTO);
|
||||
// }
|
||||
//
|
||||
// return memberTokenDTO;
|
||||
// }
|
||||
|
||||
/**
|
||||
* 具体查看用户的登录情况
|
||||
*/
|
||||
@Transactional
|
||||
public MemberTokenDTO checkLogin(Integer memberId,String openId,Member member,BindMobileDTO bindMobileDTO){
|
||||
MemberTokenDTO memberTokenDTO = null;
|
||||
// 微信登录方式
|
||||
MemberAuth memberAuth = memberAuthService.checkLoginWay(memberId,MemberAuthTypeEnum.WEIXIN.value);
|
||||
// 如果用户有用微信登录过,并且openId,与登录中的一致,则直接登录,否则拒绝登录3
|
||||
if (memberAuth != null){
|
||||
if (memberAuth.getAuthId().equals(openId)) {
|
||||
// 查询访问凭证,并强制更新
|
||||
memberTokenDTO = memberTokenService.findDTOByMemberId(memberAuth.getMemberId(), Boolean.TRUE);
|
||||
// 修改用户信息
|
||||
updateMember(member,bindMobileDTO);
|
||||
}else {
|
||||
throw new ServiceException("手机号已被绑定");
|
||||
}
|
||||
}else {
|
||||
// 用户注册过,member表中有数据,登录表中没有数据,直接更新用户登录表
|
||||
// 创建用户登录认证
|
||||
memberAuth = memberAuthService.createByMobileByOpenId(member.getId(),member.getPlatformId(),
|
||||
bindMobileDTO.getMobile(),bindMobileDTO.getOpenId());
|
||||
// 查询访问凭证,并强制更新
|
||||
memberTokenDTO = memberTokenService.findDTOByMemberId(memberAuth.getMemberId(), Boolean.TRUE);
|
||||
// 修改用户图像
|
||||
updateInformation(memberAuth.getMemberId(),bindMobileDTO.getNickname(),bindMobileDTO.getAvatar());
|
||||
}
|
||||
|
||||
return memberTokenDTO;
|
||||
}
|
||||
// @Transactional
|
||||
// public MemberTokenDTO checkLogin(Integer memberId,String openId,Member member,BindMobileDTO bindMobileDTO){
|
||||
// MemberTokenDTO memberTokenDTO = null;
|
||||
// // 微信登录方式
|
||||
// MemberAuth memberAuth = memberAuthService.checkLoginWay(memberId,MemberAuthTypeEnum.WEIXIN.value);
|
||||
// // 如果用户有用微信登录过,并且openId,与登录中的一致,则直接登录,否则拒绝登录3
|
||||
// if (memberAuth != null){
|
||||
// if (memberAuth.getAuthId().equals(openId)) {
|
||||
// // 查询访问凭证,并强制更新
|
||||
// memberTokenDTO = memberTokenService.findDTOByMemberId(memberAuth.getMemberId(), Boolean.TRUE);
|
||||
// // 修改用户信息
|
||||
// updateMember(member,bindMobileDTO);
|
||||
// }else {
|
||||
// throw new ServiceException("手机号已被绑定");
|
||||
// }
|
||||
// }else {
|
||||
// // 用户注册过,member表中有数据,登录表中没有数据,直接更新用户登录表
|
||||
// // 创建用户登录认证
|
||||
// memberAuth = memberAuthService.createByMobileByOpenId(member.getId(),member.getPlatformId(),
|
||||
// bindMobileDTO.getMobile(),bindMobileDTO.getOpenId());
|
||||
// // 查询访问凭证,并强制更新
|
||||
// memberTokenDTO = memberTokenService.findDTOByMemberId(memberAuth.getMemberId(), Boolean.TRUE);
|
||||
// // 修改用户图像
|
||||
// updateInformation(memberAuth.getMemberId(),bindMobileDTO.getNickname(),bindMobileDTO.getAvatar());
|
||||
// }
|
||||
//
|
||||
// return memberTokenDTO;
|
||||
// }
|
||||
|
||||
/**
|
||||
* 更新用户信息
|
||||
@@ -317,7 +324,7 @@ public class LoginRegisterServiceImpl extends BaseServiceImpl {
|
||||
member.setAddress(bindMobileDTO.getAddress());
|
||||
}
|
||||
try {
|
||||
member.setAvatar(updateWxImgToOss(bindMobileDTO.getAvatar()));
|
||||
// member.setAvatar(updateWxImgToOss(bindMobileDTO.getAvatar()));
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
@@ -332,6 +339,62 @@ public class LoginRegisterServiceImpl extends BaseServiceImpl {
|
||||
memberTokenService.logout(memberId);
|
||||
}
|
||||
|
||||
/**
|
||||
* 微信小程序手机号一键登录
|
||||
* 通过loginCode获取openId,通过phoneCode获取手机号,直接完成登录
|
||||
*/
|
||||
@Transactional
|
||||
public MemberTokenDTO loginWithPhoneCode(BindMobileDTO bindMobileDTO){
|
||||
String loginCode = bindMobileDTO.getLoginCode();
|
||||
String phoneCode = bindMobileDTO.getPhoneCode();
|
||||
|
||||
if (StringUtils.isBlank(loginCode)) {
|
||||
throw new ServiceException("loginCode不能为空");
|
||||
}
|
||||
if (StringUtils.isBlank(phoneCode)) {
|
||||
throw new ServiceException("phoneCode不能为空");
|
||||
}
|
||||
Integer value = PlatformContext.getValue();
|
||||
WechatLoginResult wechatResult = wechatService.getXcxOpenIdAndPhone(loginCode, phoneCode);
|
||||
String openId = wechatResult.getOpenId();
|
||||
String mobile = wechatResult.getPhoneNumber();
|
||||
|
||||
MemberTokenDTO memberTokenDTO = null;
|
||||
synchronized (openId.intern()){
|
||||
Member member = memberService.findByMobile(mobile);
|
||||
if (member == null) {
|
||||
member = memberService.createByMobile(mobile, bindMobileDTO.getNickname(),
|
||||
bindMobileDTO.getSex(), bindMobileDTO.getAge(), bindMobileDTO.getAddress(), value);
|
||||
updateInformation(member.getId(), bindMobileDTO.getNickname(), bindMobileDTO.getAvatar());
|
||||
|
||||
MemberAuth memberAuth = memberAuthService.findByMobile(mobile);
|
||||
if (memberAuth == null) {
|
||||
memberAuth = memberAuthService.createByMobileByOpenId(member.getId(), member.getPlatformId(), mobile, openId);
|
||||
}
|
||||
memberTokenDTO = memberTokenService.findDTOByMemberId(memberAuth.getMemberId(), Boolean.TRUE);
|
||||
} else {
|
||||
if (DeletedEnum.YES.value.equals(member.getDeleted())) {
|
||||
throw new ServiceException(ExceptionCodeTemplate.NONE_MEMBER_INFORMATION);
|
||||
}
|
||||
if (member.getStatus().intValue() == MemberStatusEnum.DISABLE.value.intValue()) {
|
||||
throw new ServiceException(ExceptionCodeTemplate.MEMBER_ERROR);
|
||||
}
|
||||
|
||||
MemberAuth memberAuth = memberAuthService.findByAuthId(openId);
|
||||
if (memberAuth == null) {
|
||||
memberAuth = memberAuthService.createByMobileByOpenId(member.getId(), member.getPlatformId(), mobile, openId);
|
||||
memberTokenDTO = memberTokenService.findDTOByMemberId(memberAuth.getMemberId(), Boolean.TRUE);
|
||||
} else if (memberAuth.getMemberId().intValue() == member.getId().intValue()) {
|
||||
memberTokenDTO = memberTokenService.findDTOByMemberId(memberAuth.getMemberId(), Boolean.TRUE);
|
||||
} else {
|
||||
throw new ServiceException("该手机号已被其他微信账号绑定");
|
||||
}
|
||||
updateInformation(member.getId(), bindMobileDTO.getNickname(), bindMobileDTO.getAvatar());
|
||||
}
|
||||
}
|
||||
return memberTokenDTO;
|
||||
}
|
||||
|
||||
/***
|
||||
* 修改用户图像
|
||||
*/
|
||||
@@ -346,7 +409,7 @@ public class LoginRegisterServiceImpl extends BaseServiceImpl {
|
||||
}
|
||||
member.setAvatar(avatar);
|
||||
try {
|
||||
member.setAvatar(updateWxImgToOss(avatar));
|
||||
// member.setAvatar(updateWxImgToOss(avatar));
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
package com.sv.api.service.impl.wechat;
|
||||
|
||||
import com.sv.api.context.PlatformContext;
|
||||
import com.sv.dto.api.wechat.AccessTokenResponse;
|
||||
import com.sv.dto.api.wechat.PhoneNumberResponse;
|
||||
import com.sv.dto.api.wechat.WechatLoginResult;
|
||||
import com.sv.entity.Platform;
|
||||
import com.sv.service.common.PlatformService;
|
||||
import com.sv.service.utils.HttpClientUtils;
|
||||
import com.ydd.framework.core.common.utils.HttpUtils;
|
||||
import com.ydd.framework.core.common.utils.JsonMapper;
|
||||
import com.ydd.framework.core.exception.ExceptionCodeTemplate;
|
||||
@@ -21,65 +23,71 @@ import javax.annotation.Resource;
|
||||
public class WechatService extends BaseServiceImpl {
|
||||
private Logger logger = LoggerFactory.getLogger(WechatService.class);
|
||||
|
||||
//小程序登录 获取信息url
|
||||
private static final String ACCESS_TOKEN_URL = "https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code";
|
||||
private static final String GET_PHONE_URL = "https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=%s";
|
||||
private static final String CGI_BIN_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s";
|
||||
|
||||
/**
|
||||
* 微信全局token缓存变量
|
||||
*/
|
||||
public final static String REDIS_ACCESS_TOKEN = "SZPM_ACCESS_TOKEN";
|
||||
|
||||
@Resource
|
||||
private PlatformService platformServiceImpl;
|
||||
|
||||
public final static int PLATFORM_ID = 1;
|
||||
|
||||
/**
|
||||
* 通过code获取openid 小程序
|
||||
*
|
||||
* @param code
|
||||
* @return
|
||||
*/
|
||||
public String getXcxOpenId(String code) {
|
||||
Platform platform = platformServiceImpl.findById(PlatformContext.getValue());
|
||||
Platform platform = platformServiceImpl.findById(PLATFORM_ID);
|
||||
if (platform == null) {
|
||||
logger.error("平台信息不存在,platformId: " + PLATFORM_ID);
|
||||
throw new ServiceException(ExceptionCodeTemplate.SERVICE_EXCEPTION);
|
||||
}
|
||||
String url = String.format(ACCESS_TOKEN_URL, platform.getAppId(), platform.getSecret(), code);
|
||||
String result = HttpUtils.get(url);
|
||||
AccessTokenResponse response = JsonMapper.nonEmptyMapper().fromJson(result, AccessTokenResponse.class);
|
||||
if (StringUtils.isBlank(response.getOpenid())) {
|
||||
logger.error("小程序openid获取失败:" + result);
|
||||
throw new ServiceException(ExceptionCodeTemplate.SERVICE_EXCEPTION);
|
||||
} else {
|
||||
String openId = response.getOpenid();
|
||||
String accessToken = response.getAccess_token();
|
||||
return openId;
|
||||
}
|
||||
return response.getOpenid();
|
||||
}
|
||||
|
||||
|
||||
/* private boolean checkWxXml( Map<String,String> params) throws IOException {
|
||||
String signFromAPIResponse = params.get("sign").toString();
|
||||
if (signFromAPIResponse == "" || signFromAPIResponse == null) {
|
||||
logger.info("API返回的数据签名数据不存在,有可能被第三方篡改!!!");
|
||||
return false;
|
||||
public WechatLoginResult getXcxOpenIdAndPhone(String loginCode, String phoneCode) {
|
||||
Platform platform = platformServiceImpl.findById(PLATFORM_ID);
|
||||
if (platform == null) {
|
||||
logger.error("平台信息不存在,platformId: " + PLATFORM_ID);
|
||||
throw new ServiceException(ExceptionCodeTemplate.SERVICE_EXCEPTION);
|
||||
}
|
||||
//清掉返回数据对象里面的Sign数据(不能把这个数据也加进去进行签名),然后用签名算法进行签名
|
||||
params.put("sign", "");
|
||||
String signForAPIResponse = getSign(params);
|
||||
logger.info("签名验证后的sign:"+signForAPIResponse+" 微信回调传入的sign:"+signFromAPIResponse);
|
||||
if (!signForAPIResponse.equalsIgnoreCase(signFromAPIResponse)) {
|
||||
logger.info("API返回的数据签名数据不一样,有可能被第三方篡改!!!");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}*/
|
||||
|
||||
/* private String getSign(Map<String, String> map) {
|
||||
SortedMap<String, String> signParams = new TreeMap<>();
|
||||
for (Map.Entry<String, String> stringStringEntry : map.entrySet()) {
|
||||
signParams.put(stringStringEntry.getKey(), stringStringEntry.getValue());
|
||||
}
|
||||
signParams.remove("sign");
|
||||
String sign = CommonUtils.getSign(signParams, key);
|
||||
return sign;
|
||||
}*/
|
||||
String openId = getXcxOpenId(loginCode);
|
||||
String accessToken = getAccessToken(platform);
|
||||
String phoneNumber = getPhoneNumber(phoneCode, accessToken);
|
||||
|
||||
return new WechatLoginResult(openId, phoneNumber);
|
||||
}
|
||||
|
||||
private String getAccessToken(Platform platform) {
|
||||
String url = String.format(CGI_BIN_TOKEN_URL, platform.getAppId(), platform.getSecret());
|
||||
String result = HttpUtils.get(url);
|
||||
AccessTokenResponse response = JsonMapper.nonEmptyMapper().fromJson(result, AccessTokenResponse.class);
|
||||
if (StringUtils.isBlank(response.getAccess_token())) {
|
||||
logger.error("小程序access_token获取失败:" + result);
|
||||
throw new ServiceException(ExceptionCodeTemplate.SERVICE_EXCEPTION);
|
||||
}
|
||||
return response.getAccess_token();
|
||||
}
|
||||
|
||||
private String getPhoneNumber(String code, String accessToken) {
|
||||
String url = String.format(GET_PHONE_URL, accessToken);
|
||||
String jsonBody = "{\"code\":\"" + code + "\"}";
|
||||
String result = HttpClientUtils.doPostJson(url, jsonBody);
|
||||
PhoneNumberResponse response = JsonMapper.nonEmptyMapper().fromJson(result, PhoneNumberResponse.class);
|
||||
if (response.getErrcode() == null || response.getErrcode() != 0) {
|
||||
logger.error("小程序手机号获取失败:" + result);
|
||||
throw new ServiceException(ExceptionCodeTemplate.SERVICE_EXCEPTION);
|
||||
}
|
||||
if (response.getPhone_info() == null || StringUtils.isBlank(response.getPhone_info().getPhoneNumber())) {
|
||||
logger.error("小程序手机号为空:" + result);
|
||||
throw new ServiceException(ExceptionCodeTemplate.SERVICE_EXCEPTION);
|
||||
}
|
||||
return response.getPhone_info().getPhoneNumber();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,11 +5,21 @@ import java.io.Serializable;
|
||||
|
||||
public class BindMobileDTO implements Serializable {
|
||||
|
||||
/**
|
||||
* 小程序login code (wx.login获取)
|
||||
*/
|
||||
private String loginCode;
|
||||
|
||||
/**
|
||||
* 小程序openId
|
||||
*/
|
||||
private String openId;
|
||||
|
||||
/**
|
||||
* 微信手机号 code (wx.getPhoneNumber获取)
|
||||
*/
|
||||
private String phoneCode;
|
||||
|
||||
/**
|
||||
* 微信昵称
|
||||
*/
|
||||
@@ -21,12 +31,12 @@ public class BindMobileDTO implements Serializable {
|
||||
private String avatar;
|
||||
|
||||
/**
|
||||
* 手机号码
|
||||
* 手机号码 (从phoneCode解析得到)
|
||||
*/
|
||||
private String mobile;
|
||||
|
||||
/**
|
||||
* 验证码
|
||||
* 验证码 (不再使用)
|
||||
*/
|
||||
private String captcha;
|
||||
|
||||
@@ -121,4 +131,20 @@ public class BindMobileDTO implements Serializable {
|
||||
public void setAddress(String address) {
|
||||
this.address = address;
|
||||
}
|
||||
|
||||
public String getLoginCode() {
|
||||
return loginCode;
|
||||
}
|
||||
|
||||
public void setLoginCode(String loginCode) {
|
||||
this.loginCode = loginCode;
|
||||
}
|
||||
|
||||
public String getPhoneCode() {
|
||||
return phoneCode;
|
||||
}
|
||||
|
||||
public void setPhoneCode(String phoneCode) {
|
||||
this.phoneCode = phoneCode;
|
||||
}
|
||||
}
|
||||
@@ -8,7 +8,7 @@ public class AccessTokenResponse implements Serializable {
|
||||
private String refresh_token;
|
||||
private String openid;
|
||||
private String scope;
|
||||
private int errcode;
|
||||
private Integer errcode;
|
||||
private String errmsg;
|
||||
|
||||
public String getAccess_token() {
|
||||
@@ -51,11 +51,11 @@ public class AccessTokenResponse implements Serializable {
|
||||
this.scope = scope;
|
||||
}
|
||||
|
||||
public int getErrcode() {
|
||||
public Integer getErrcode() {
|
||||
return errcode;
|
||||
}
|
||||
|
||||
public void setErrcode(int errcode) {
|
||||
public void setErrcode(Integer errcode) {
|
||||
this.errcode = errcode;
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,73 @@
|
||||
package com.sv.dto.api.wechat;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
public class PhoneNumberResponse implements Serializable {
|
||||
|
||||
private Integer errcode;
|
||||
private String errmsg;
|
||||
private PhoneInfo phone_info;
|
||||
|
||||
public Integer getErrcode() {
|
||||
return errcode;
|
||||
}
|
||||
|
||||
public void setErrcode(Integer errcode) {
|
||||
this.errcode = errcode;
|
||||
}
|
||||
|
||||
public String getErrmsg() {
|
||||
return errmsg;
|
||||
}
|
||||
|
||||
public void setErrmsg(String errmsg) {
|
||||
this.errmsg = errmsg;
|
||||
}
|
||||
|
||||
public PhoneInfo getPhone_info() {
|
||||
return phone_info;
|
||||
}
|
||||
|
||||
public void setPhone_info(PhoneInfo phone_info) {
|
||||
this.phone_info = phone_info;
|
||||
}
|
||||
|
||||
public static class PhoneInfo implements Serializable {
|
||||
private String phoneNumber;
|
||||
private String purePhoneNumber;
|
||||
private Integer countryCode;
|
||||
private Long dataMasking;
|
||||
|
||||
public String getPhoneNumber() {
|
||||
return phoneNumber;
|
||||
}
|
||||
|
||||
public void setPhoneNumber(String phoneNumber) {
|
||||
this.phoneNumber = phoneNumber;
|
||||
}
|
||||
|
||||
public String getPurePhoneNumber() {
|
||||
return purePhoneNumber;
|
||||
}
|
||||
|
||||
public void setPurePhoneNumber(String purePhoneNumber) {
|
||||
this.purePhoneNumber = purePhoneNumber;
|
||||
}
|
||||
|
||||
public Integer getCountryCode() {
|
||||
return countryCode;
|
||||
}
|
||||
|
||||
public void setCountryCode(Integer countryCode) {
|
||||
this.countryCode = countryCode;
|
||||
}
|
||||
|
||||
public Long getDataMasking() {
|
||||
return dataMasking;
|
||||
}
|
||||
|
||||
public void setDataMasking(Long dataMasking) {
|
||||
this.dataMasking = dataMasking;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
package com.sv.dto.api.wechat;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
public class WechatLoginResult implements Serializable {
|
||||
|
||||
private String openId;
|
||||
private String phoneNumber;
|
||||
|
||||
public WechatLoginResult() {
|
||||
}
|
||||
|
||||
public WechatLoginResult(String openId, String phoneNumber) {
|
||||
this.openId = openId;
|
||||
this.phoneNumber = phoneNumber;
|
||||
}
|
||||
|
||||
public String getOpenId() {
|
||||
return openId;
|
||||
}
|
||||
|
||||
public void setOpenId(String openId) {
|
||||
this.openId = openId;
|
||||
}
|
||||
|
||||
public String getPhoneNumber() {
|
||||
return phoneNumber;
|
||||
}
|
||||
|
||||
public void setPhoneNumber(String phoneNumber) {
|
||||
this.phoneNumber = phoneNumber;
|
||||
}
|
||||
}
|
||||
@@ -55,7 +55,6 @@ import java.util.List;
|
||||
* @param id 编号
|
||||
* @return 用户
|
||||
*/
|
||||
@PlatformKey
|
||||
Member findById(Integer id);
|
||||
|
||||
/**
|
||||
@@ -139,4 +138,4 @@ import java.util.List;
|
||||
Member findByFaceId(@Param("faceId") Integer faceId);
|
||||
|
||||
Integer countMoneyGtPrice(@Param("memberId") Integer memberId,@Param("price") BigDecimal price);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -221,7 +221,7 @@ public class MemberService extends BaseServiceImpl {
|
||||
|
||||
// 创建用户
|
||||
Member member = new Member();
|
||||
member.setNickname(mobile);
|
||||
member.setNickname("用户" + RandomStringUtils.randomNumeric(8));
|
||||
String inviteCode = "";
|
||||
Integer count = 1;
|
||||
while (count == 1) {
|
||||
@@ -369,7 +369,8 @@ public class MemberService extends BaseServiceImpl {
|
||||
memberDTO.setId(member.getId());
|
||||
memberDTO.setAvatar(member.getAvatar() == null ? "" : member.getAvatar());
|
||||
memberDTO.setNickname(member.getNickname());
|
||||
memberDTO.setMobile(member.getMobile());
|
||||
String mobile = member.getMobile();
|
||||
memberDTO.setMobile(mobile != null && mobile.length() == 11 ? mobile.substring(0, 3) + "****" + mobile.substring(7) : mobile);
|
||||
memberDTO.setName(member.getName() == null ? "" : member.getName());
|
||||
memberDTO.setSex(member.getSex());
|
||||
memberDTO.setAge(member.getAge() == null ? null : member.getAge());
|
||||
|
||||
Reference in New Issue
Block a user