package com.yeshi.fanli.controller.wxmp.v1;
|
|
import java.io.PrintWriter;
|
|
import javax.annotation.Resource;
|
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpSession;
|
|
import org.springframework.stereotype.Controller;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.yeshi.utils.IPUtil;
|
import org.yeshi.utils.JsonUtil;
|
import org.yeshi.utils.entity.wx.WXMPSessionInfo;
|
import org.yeshi.utils.entity.wx.WXMPUserInfo;
|
import org.yeshi.utils.wx.WXXCXUtil;
|
|
import com.google.gson.Gson;
|
import com.yeshi.fanli.dto.WXMPAcceptData;
|
import com.yeshi.fanli.dto.user.wx.WXMPLoginData;
|
import com.yeshi.fanli.dto.user.wx.WXMPLoginResult;
|
import com.yeshi.fanli.entity.bus.user.ForbiddenUserIdentifyCode;
|
import com.yeshi.fanli.entity.bus.user.ForbiddenUserIdentifyCode.ForbiddenUserIdentifyCodeTypeEnum;
|
import com.yeshi.fanli.entity.bus.user.UserInfo;
|
import com.yeshi.fanli.entity.bus.user.WeiXinUser;
|
import com.yeshi.fanli.exception.user.UserAccountException;
|
import com.yeshi.fanli.exception.user.UserInfoExtraException;
|
import com.yeshi.fanli.service.inter.user.ForbiddenUserIdentifyCodeService;
|
import com.yeshi.fanli.service.inter.user.UserAccountService;
|
import com.yeshi.fanli.service.inter.user.UserInfoExtraService;
|
import com.yeshi.fanli.service.inter.user.UserInfoService;
|
import com.yeshi.fanli.service.inter.user.wx.WXMPUserLoginService;
|
import com.yeshi.fanli.util.Constant;
|
import com.yeshi.fanli.util.RedisManager;
|
import com.yeshi.fanli.util.StringUtil;
|
import com.yeshi.fanli.util.ThreadUtil;
|
import com.yeshi.fanli.util.account.UserUtil;
|
|
import net.sf.json.JSONObject;
|
|
@Controller("WXMPUserAccountController")
|
@RequestMapping("/wxmp/api/v1/useraccount")
|
public class UserAccountController {
|
|
@Resource
|
private UserInfoExtraService userInfoExtraService;
|
|
@Resource
|
private UserInfoService userInfoService;
|
|
@Resource
|
private UserAccountService userAccountService;
|
|
@Resource
|
private WXMPUserLoginService wxMPUserLoginService;
|
|
@Resource
|
private RedisManager redisManager;
|
|
@Resource
|
private ForbiddenUserIdentifyCodeService forbiddenUserIdentifyCodeService;
|
|
/**
|
* 通过邀请码获取用户信息
|
*
|
* @param acceptData
|
* @param inviteCode
|
* @param out
|
*/
|
@RequestMapping("getInviteCodeInfo")
|
public void getInviteCodeInfo(WXMPAcceptData acceptData, String inviteCode, PrintWriter out) {
|
|
if (StringUtil.isNullOrEmpty(inviteCode)) {
|
out.print(JsonUtil.loadFalseResult("邀请码为空"));
|
return;
|
}
|
|
try {
|
UserInfo userInfo = userInfoExtraService.getUserByInviteCode(inviteCode);
|
if (userInfo != null && userInfo.getState() == UserInfo.STATE_NORMAL) {
|
JSONObject json = new JSONObject();
|
json.put("id", userInfo.getId());
|
json.put("nickName", userInfo.getNickName());
|
json.put("portrait", userInfo.getPortrait());
|
JSONObject data = new JSONObject();
|
data.put("user", json);
|
out.print(JsonUtil.loadTrueResult(data));
|
return;
|
}
|
} catch (UserInfoExtraException e) {
|
|
}
|
out.print(JsonUtil.loadFalseResult("邀请码不存在"));
|
}
|
|
@RequestMapping("phoneLogin")
|
public void phoneLogin(WXMPAcceptData acceptData, String code, String phoneEncryptedData, String phoneIv,
|
String inviteCode, String userData, HttpServletRequest request, HttpSession session, PrintWriter out) {
|
if (StringUtil.isNullOrEmpty(acceptData.getOpenId())) {
|
out.print(JsonUtil.loadFalseResult("openId为空"));
|
return;
|
}
|
|
if (StringUtil.isNullOrEmpty(phoneEncryptedData) || StringUtil.isNullOrEmpty(phoneIv)) {
|
out.print(JsonUtil.loadFalseResult("电话加密数据为空"));
|
return;
|
}
|
|
String sessionKey = null;
|
WXMPSessionInfo sessionInfo = (WXMPSessionInfo) session.getAttribute(UserController.WXMP_SESSION_INFO_KEY);
|
if (sessionInfo == null) {
|
out.print(JsonUtil.loadFalseResult(90000, "请重新登录"));
|
return;
|
}
|
|
sessionKey = sessionInfo.getSessionKey();
|
|
if (StringUtil.isNullOrEmpty(sessionKey)) {
|
out.print(JsonUtil.loadFalseResult("code无效"));
|
return;
|
}
|
String phoneNumber = WXXCXUtil.getPhoneNumber(sessionKey, phoneEncryptedData, phoneIv);
|
if (StringUtil.isNullOrEmpty(phoneNumber)) {
|
out.print(JsonUtil.loadFalseResult("获取电话号码失败"));
|
return;
|
}
|
|
UserInfo boss = null;
|
if (!StringUtil.isNullOrEmpty(inviteCode)) {
|
try {
|
boss = userInfoExtraService.getUserByInviteCode(inviteCode);
|
} catch (UserInfoExtraException e) {
|
e.printStackTrace();
|
}
|
if (boss != null && boss.getState() != UserInfo.STATE_NORMAL)
|
boss = null;
|
}
|
|
UserInfo lastUserInfo = null;
|
if (!StringUtil.isNullOrEmpty(userData)) {
|
String key = StringUtil.Md5("wxmp-user-login-" + acceptData.getAppId() + "-" + acceptData.getOpenId());
|
String data = redisManager.getCommonString(key);
|
if (!StringUtil.isNullOrEmpty(data)) {
|
lastUserInfo = new Gson().fromJson(data, UserInfo.class);
|
}
|
}
|
|
try {
|
WXMPLoginResult result = wxMPUserLoginService.wxmpLogin(new WXMPLoginData.Builder(Constant.APPID)
|
.setBoss(boss).setLastUser(lastUserInfo).setPhone(phoneNumber).build());
|
printWXMPLoginResult(acceptData.getAppId(), acceptData.getOpenId(), result, request, out);
|
} catch (UserAccountException e) {
|
out.print(JsonUtil.loadFalseResult(e.getCode(), e.getMsg()));
|
}
|
|
}
|
|
@RequestMapping("wxLogin")
|
public void wxLogin(WXMPAcceptData acceptData, String wxEncryptedData, String wxIv, String inviteCode,
|
HttpServletRequest request, HttpSession session, PrintWriter out) {
|
if (StringUtil.isNullOrEmpty(acceptData.getOpenId())) {
|
out.print(JsonUtil.loadFalseResult("openId为空"));
|
return;
|
}
|
|
if (StringUtil.isNullOrEmpty(wxEncryptedData) || StringUtil.isNullOrEmpty(wxIv)) {
|
out.print(JsonUtil.loadFalseResult("微信用户加密数据为空"));
|
return;
|
}
|
WXMPSessionInfo sessionInfo = (WXMPSessionInfo) session.getAttribute(UserController.WXMP_SESSION_INFO_KEY);
|
if (sessionInfo == null) {
|
out.print(JsonUtil.loadFalseResult(90000, "请重新登录"));
|
return;
|
}
|
|
String sessionKey = sessionInfo.getSessionKey();
|
if (StringUtil.isNullOrEmpty(sessionKey)) {
|
out.print(JsonUtil.loadFalseResult("code无效"));
|
return;
|
}
|
|
WXMPUserInfo userInfo = WXXCXUtil.getUserInfo(sessionKey, wxEncryptedData, wxIv);
|
if (userInfo == null || StringUtil.isNullOrEmpty(userInfo.getUnionId())) {
|
out.print(JsonUtil.loadFalseResult("获取微信信息失败"));
|
return;
|
}
|
|
try {
|
WXMPLoginResult result = wxMPUserLoginService
|
.wxmpLogin(new WXMPLoginData.Builder(Constant.APPID).setWxUser(userInfo).build());
|
printWXMPLoginResult(acceptData.getAppId(), acceptData.getOpenId(), result, request, out);
|
} catch (UserAccountException e) {
|
out.print(JsonUtil.loadFalseResult(e.getCode(), e.getMsg()));
|
}
|
}
|
|
@RequestMapping("bindInviteCode")
|
public void bindInviteCode(WXMPAcceptData acceptData, String inviteCode, String userData,
|
HttpServletRequest request, PrintWriter out) {
|
if (StringUtil.isNullOrEmpty(acceptData.getOpenId())) {
|
out.print(JsonUtil.loadFalseResult("openId为空"));
|
return;
|
}
|
if (StringUtil.isNullOrEmpty(inviteCode)) {
|
out.print(JsonUtil.loadFalseResult("邀请码为空"));
|
return;
|
}
|
|
String key = StringUtil.Md5("wxmp-user-login-" + acceptData.getAppId() + "-" + acceptData.getOpenId());
|
UserInfo user = new Gson().fromJson(redisManager.getCommonString(key), UserInfo.class);
|
if (user == null) {
|
out.print(JsonUtil.loadFalseResult("用户数据为空"));
|
return;
|
}
|
|
UserInfo boss = null;
|
if (!StringUtil.isNullOrEmpty(inviteCode)) {
|
try {
|
boss = userInfoExtraService.getUserByInviteCode(inviteCode);
|
} catch (UserInfoExtraException e) {
|
e.printStackTrace();
|
}
|
if (boss != null && boss.getState() != UserInfo.STATE_NORMAL)
|
boss = null;
|
}
|
|
if (boss == null) {
|
out.print(JsonUtil.loadFalseResult("邀请码有误"));
|
return;
|
}
|
|
try {
|
WXMPLoginResult result = wxMPUserLoginService
|
.wxmpLogin(new WXMPLoginData.Builder(Constant.APPID).setLastUser(user).setBoss(boss).build());
|
printWXMPLoginResult(acceptData.getAppId(), acceptData.getOpenId(), result, request, out);
|
} catch (UserAccountException e) {
|
out.print(JsonUtil.loadFalseResult(e.getCode(), e.getMsg()));
|
}
|
}
|
|
private void printWXMPLoginResult(String appId, String openId, WXMPLoginResult result, HttpServletRequest request,
|
PrintWriter out) {
|
JSONObject data = new JSONObject();
|
String key = StringUtil.Md5("wxmp-user-login-" + appId + "-" + openId);
|
switch (result.getCode()) {
|
case WXMPLoginResult.CODE_SUCCESS:
|
UserInfo user = userInfoService.selectAvailableByPrimaryKey(result.getUser().getId());
|
data.put("user", UserUtil.filterForClientUser(user));
|
data.put("type", 0);
|
out.print(JsonUtil.loadTrueResult(data));
|
final String ip = IPUtil.getRemotIP(request);
|
final int port = request.getRemotePort();
|
ThreadUtil.run(new Runnable() {
|
|
@Override
|
public void run() {// 登录成功
|
UserInfo update = new UserInfo(user.getId());
|
update.setLastLoginTime(System.currentTimeMillis());
|
update.setLastLoginIp(ip + ":" + port);
|
userAccountService.updateUserSelective(update);
|
}
|
});
|
break;
|
case WXMPLoginResult.CODE_BIND_PHONE:
|
// 需要绑定电话号码
|
redisManager.saveObj(result.getUser(), key, 60 * 5);// 只缓存5分钟
|
data.put("userData", key);
|
data.put("type", 2);
|
break;
|
case WXMPLoginResult.CODE_BIND_INVITE_CODE:
|
redisManager.saveObj(result.getUser(), key, 60 * 5);// 只缓存5分钟
|
data.put("userData", key);
|
data.put("type", 1);
|
break;
|
}
|
|
out.print(JsonUtil.loadTrueResult(data));
|
}
|
|
@RequestMapping("bindWX")
|
public void bindWX(WXMPAcceptData acceptData, Long uid, String wxEncryptedData, String wxIv,
|
HttpServletRequest request, HttpSession session, PrintWriter out) {
|
if (StringUtil.isNullOrEmpty(acceptData.getOpenId())) {
|
out.print(JsonUtil.loadFalseResult("openId为空"));
|
return;
|
}
|
|
if(uid==null){
|
out.print(JsonUtil.loadFalseResult("uid为空"));
|
return;
|
}
|
|
if (StringUtil.isNullOrEmpty(wxEncryptedData) || StringUtil.isNullOrEmpty(wxIv)) {
|
out.print(JsonUtil.loadFalseResult("微信信息为空"));
|
return;
|
}
|
|
WXMPSessionInfo sessionInfo = (WXMPSessionInfo) session.getAttribute(UserController.WXMP_SESSION_INFO_KEY);
|
if (sessionInfo == null) {
|
out.print(JsonUtil.loadFalseResult(90000, "请重新登录"));
|
return;
|
}
|
|
String sessionKey = sessionInfo.getSessionKey();
|
if (StringUtil.isNullOrEmpty(sessionKey)) {
|
out.print(JsonUtil.loadFalseResult("code无效"));
|
return;
|
}
|
|
WXMPUserInfo userInfo = WXXCXUtil.getUserInfo(sessionKey, wxEncryptedData, wxIv);
|
if (userInfo == null || StringUtil.isNullOrEmpty(userInfo.getUnionId())) {
|
out.print(JsonUtil.loadFalseResult("获取微信信息失败"));
|
return;
|
}
|
|
// 绑定微信
|
|
WeiXinUser wxUser = new WeiXinUser();
|
wxUser.setHeadimgurl(userInfo.getAvatarUrl());
|
wxUser.setCity(userInfo.getCity());
|
wxUser.setCountry(userInfo.getCountry());
|
wxUser.setNickname(userInfo.getNickName());
|
wxUser.setOpenid("");
|
wxUser.setProvince(userInfo.getProvince());
|
wxUser.setSex(userInfo.getGender());
|
wxUser.setUnionid(userInfo.getUnionId());
|
|
try {
|
UserInfo user = userInfoService.getUserByIdWithMybatis(uid);
|
// 判断taoBaoUid是否已经封禁
|
ForbiddenUserIdentifyCode ic = forbiddenUserIdentifyCodeService
|
.listByTypeAndIdentifyCode(ForbiddenUserIdentifyCodeTypeEnum.wxUnionId, user.getWxUnionId());
|
if (ic != null && ic.getEffective() != null && ic.getEffective()) {
|
out.print(JsonUtil.loadFalseResult(Constant.CODE_FORBIDDEN_USER, Constant.FORBIDDEN_USER_REASON_DESC));
|
// 封禁用户
|
// 封禁绑定的正常用户
|
if (user != null && user.getState() != null && user.getState() == UserInfo.STATE_NORMAL) {
|
userAccountService.forbiddenUser(uid, "封禁:绑定被封禁的微信号");
|
}
|
return;
|
}
|
|
userAccountService.bindWeiXin(uid, wxUser);
|
user = userInfoService.getUserByIdWithMybatis(uid);
|
JSONObject data = new JSONObject();
|
data.put("user", UserUtil.filterForClientUser(user));
|
out.print(JsonUtil.loadTrueResult(data));
|
} catch (UserAccountException e) {
|
out.print(JsonUtil.loadFalseResult(e.getCode(), e.getMsg()));
|
}
|
|
}
|
|
}
|