package com.yeshi.fanli.controller;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.Date;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.yeshi.fanli.entity.bus.user.UserActiveLog;
import com.yeshi.fanli.entity.bus.user.UserInfo;
import com.yeshi.fanli.entity.bus.user.UserInfoModifyRecord.ModifyTypeEnum;
import com.yeshi.fanli.entity.taobao.TaoBaoUnionAuthRecord;
import com.yeshi.fanli.exception.taobao.TaoBaoAuthException;
import com.yeshi.fanli.exception.user.UserExtraTaoBaoInfoException;
import com.yeshi.fanli.log.LogHelper;
import com.yeshi.fanli.log.LogManager;
import com.yeshi.fanli.log.LogType;
import com.yeshi.fanli.service.inter.user.UserActiveLogService;
import com.yeshi.fanli.service.inter.user.UserInfoModifyRecordService;
import com.yeshi.fanli.service.inter.user.msg.UserAccountMsgNotificationService;
import com.yeshi.fanli.service.inter.user.tb.TaoBaoUnionAuthRecordService;
import com.yeshi.fanli.service.inter.user.tb.UserExtraTaoBaoInfoService;
import com.yeshi.fanli.util.AESUtil;
import com.yeshi.fanli.util.Constant;
import com.yeshi.fanli.util.RedisKeyEnum;
import com.yeshi.fanli.util.RedisManager;
import com.yeshi.fanli.util.StringUtil;
import com.yeshi.fanli.util.TaoBaoConstant;
import com.yeshi.fanli.util.ThreadUtil;
import com.yeshi.fanli.util.VersionUtil;
import com.yeshi.fanli.util.taobao.TaoKeApiUtil;
import net.sf.json.JSONObject;
/**
* 授权回调
*
* @author Administrator
*
*/
@Controller
@RequestMapping("client/v1/auth/callback")
public class AuthCallBackController {
@Resource
private UserExtraTaoBaoInfoService userExtraTaoBaoInfoService;
@Resource
private TaoBaoUnionAuthRecordService taoBaoUnionAuthRecordService;
@Resource
private UserAccountMsgNotificationService userAccountMsgNotificationService;
@Resource
private UserInfoModifyRecordService userInfoModifyRecordService;
@Resource
private RedisManager redisManager;
@Resource
private UserActiveLogService userActiveLogService;
@RequestMapping(value = "tb")
public void tb(String code, String state, HttpServletRequest request, HttpServletResponse response) {
LogManager.getLogger(LogType.taobaoAuth).info("淘宝授权回调:" + code + ":" + state);
if (StringUtil.isNullOrEmpty(code) || StringUtil.isNullOrEmpty(state)) {
LogHelper.error("淘宝授权回调出错");
try {
response.sendRedirect("http://apph5.banliapp.com/flqWeb/h5/tbauth/fail.html?code=1");
} catch (IOException e1) {
e1.printStackTrace();
}
return;
}
try {
String key = RedisKeyEnum.getRedisKey(RedisKeyEnum.taobaoCode, code);
if (!StringUtil.isNullOrEmpty(redisManager.getCommonString(key)))
return;
redisManager.cacheCommonString(key, 1 + "", 5);
} catch (Exception e) {
}
String stateStr = null;
Long time = null;
Long uid = null;
String source = null;
try {
stateStr = AESUtil.decrypt(state, Constant.UIDAESKEY);
JSONObject json = JSONObject.fromObject(stateStr);
time = json.optLong("t");
uid = json.optLong("u");
source = json.optString("s");
} catch (Exception e) {
try {
state = URLDecoder.decode(state, "UTF-8");
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
}
stateStr = AESUtil.decrypt(state, Constant.UIDAESKEY);
JSONObject json = JSONObject.fromObject(stateStr);
time = json.optLong("t");
uid = json.optLong("u");
source = json.optString("s");
}
LogManager.getLogger(LogType.taobaoAuth).info("淘宝授权回调state:" + state);
LogManager.getLogger(LogType.taobaoAuth).info("淘宝授权回调解密:" + stateStr);
int errCode = 0;
if (StringUtil.isNullOrEmpty(stateStr)) {
// 解密错误
errCode = 1;
}
if (System.currentTimeMillis() - time > 1000 * 60 * 10L) {
// 过时
errCode = 2;
}
if (uid == null || uid.longValue() == 0L)
errCode = 3;
// 计入记录
try {
String result = TaoKeApiUtil.getAccessToken(code, TaoBaoConstant.TAOBAO_AUTH_APPKEY,
TaoBaoConstant.TAOBAO_AUTH_APPSECRET);
JSONObject data = JSONObject.fromObject(result);
data = data.optJSONObject("top_auth_token_create_response").optJSONObject("token_result");
String accessToken = data.optString("access_token");
String openUid = data.optString("taobao_open_uid");
String taoBaoUid = data.optString("taobao_user_id");
String nickName = data.optString("taobao_user_nick");
try {
nickName = URLDecoder.decode(nickName, "UTF-8");
} catch (Exception e) {
}
final String name = nickName;
LogManager.getLogger(LogType.taobaoAuth).info("uid:" + uid + "\n accessToken:" + accessToken);
// 获取渠道ID与会员ID
if ("share".equalsIgnoreCase(source)) {
String relationId = null;
try {
relationId = TaoKeApiUtil.getRelationId(accessToken, TaoBaoConstant.TAOBAO_AUTH_APPKEY,
TaoBaoConstant.TAOBAO_AUTH_APPSECRET);// 渠道ID
} catch (TaoBaoAuthException e) {
LogManager.getLogger(LogType.taobaoAuth).error(uid + "渠道备案失败:" + e.getMessage());
if (e.getCode() == TaoBaoAuthException.CODE_NOT_REAL_NAME)
userAccountMsgNotificationService.taoBaoAuthFail(uid, name, "淘宝账号未实名");
}
try {
userExtraTaoBaoInfoService.addRelationId(uid, relationId, taoBaoUid, nickName, true);
} catch (UserExtraTaoBaoInfoException e) {
LogHelper.test(e.getMsg());
errCode = 5;
}
final String relationId2 = relationId;
// 异步申请会员ID
final Long fuid = uid;
ThreadUtil.run(new Runnable() {
@Override
public void run() {
String specialId = null;
try {
specialId = TaoKeApiUtil.getSpecialId(accessToken, TaoBaoConstant.TAOBAO_AUTH_APPKEY,
TaoBaoConstant.TAOBAO_AUTH_APPSECRET);
} catch (TaoBaoAuthException e1) {
LogManager.getLogger(LogType.taobaoAuth).error(fuid + "会员备案失败:" + e1.getMessage());
}
try {
userExtraTaoBaoInfoService.addSpecialId(fuid, specialId, taoBaoUid, name, true);
if (!StringUtil.isNullOrEmpty(specialId) && !StringUtil.isNullOrEmpty(relationId2))
userInfoModifyRecordService.addModifyRecord(fuid, ModifyTypeEnum.bindTaoBao, taoBaoUid);
} catch (UserExtraTaoBaoInfoException e) {
LogHelper.test(e.getMsg());
}
}
});
// 稍作延迟
Thread.sleep(50);
} else if ("zigou".equalsIgnoreCase(source)) {
String specialId = null;
try {
specialId = TaoKeApiUtil.getSpecialId(accessToken, TaoBaoConstant.TAOBAO_AUTH_APPKEY,
TaoBaoConstant.TAOBAO_AUTH_APPSECRET);
} catch (TaoBaoAuthException e) {
if (e.getCode() == TaoBaoAuthException.CODE_NOT_REAL_NAME)
userAccountMsgNotificationService.taoBaoAuthFail(uid, name, "淘宝账号未实名");
LogManager.getLogger(LogType.taobaoAuth).error(uid + "会员备案失败:" + e.getMessage());
}
try {
userExtraTaoBaoInfoService.addSpecialId(uid, specialId, taoBaoUid, nickName, true);
} catch (UserExtraTaoBaoInfoException e) {
LogHelper.test(e.getMsg());
errCode = 5;
}
final Long fuid = uid;
final String specialId2 = specialId;
// 异步申请渠道ID
ThreadUtil.run(new Runnable() {
@Override
public void run() {
String relationId = null;
try {
relationId = TaoKeApiUtil.getRelationId(accessToken, TaoBaoConstant.TAOBAO_AUTH_APPKEY,
TaoBaoConstant.TAOBAO_AUTH_APPSECRET);
} catch (TaoBaoAuthException e1) {
LogManager.getLogger(LogType.taobaoAuth).error(fuid + "渠道备案失败:" + e1.getMessage());
}
try {
userExtraTaoBaoInfoService.addRelationId(fuid, relationId, taoBaoUid, name, true);
if (!StringUtil.isNullOrEmpty(specialId2) && !StringUtil.isNullOrEmpty(relationId))
userInfoModifyRecordService.addModifyRecord(fuid, ModifyTypeEnum.bindTaoBao, taoBaoUid);
} catch (UserExtraTaoBaoInfoException e) {
LogHelper.test(e.getMsg());
}
}
});
// 稍作延迟
Thread.sleep(50);
} else if ("bind".equalsIgnoreCase(source)) {
boolean bindInfo = true;
// 绑定淘宝:V1.5.3
String relationId = null;
int tbErrorCode = 0;
try {
relationId = TaoKeApiUtil.getRelationId(accessToken, Constant.TAOBAO_AUTH_APPKEY,
TaoBaoConstant.TAOBAO_AUTH_APPSECRET);// 渠道ID
} catch (TaoBaoAuthException e) {
LogManager.getLogger(LogType.taobaoAuth).error(uid + "渠道备案失败");
tbErrorCode = e.getCode();
}
if (StringUtil.isNullOrEmpty(relationId)) {
bindInfo = false;
}
String specialId = null;
if (bindInfo) {
try {
specialId = TaoKeApiUtil.getSpecialId(accessToken, Constant.TAOBAO_AUTH_APPKEY,
TaoBaoConstant.TAOBAO_AUTH_APPSECRET);
} catch (TaoBaoAuthException e) {
tbErrorCode = e.getCode();
LogManager.getLogger(LogType.taobaoAuth).error(uid + "会员备案失败");
}
if (StringUtil.isNullOrEmpty(specialId)) {
bindInfo = false;
}
}
if (!bindInfo) {
if (tbErrorCode == TaoBaoAuthException.CODE_NOT_REAL_NAME) {
userAccountMsgNotificationService.taoBaoAuthFail(uid, name, "淘宝账号未实名");
}
errCode = 5;// 信息获取不全
} else {
try {
userExtraTaoBaoInfoService.saveUserTaoBaoInfo(uid, relationId, specialId, taoBaoUid, nickName,
true);
if (!StringUtil.isNullOrEmpty(specialId) && !StringUtil.isNullOrEmpty(relationId))
userInfoModifyRecordService.addModifyRecord(uid, ModifyTypeEnum.bindTaoBao, taoBaoUid);
} catch (UserExtraTaoBaoInfoException e) {
LogHelper.test(e.getMsg());
errCode = 6;
}
}
}
if (!StringUtil.isNullOrEmpty(nickName))
try {
nickName = URLDecoder.decode(nickName, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
TaoBaoUnionAuthRecord record = new TaoBaoUnionAuthRecord();
record.setUser(new UserInfo(uid));
record.setTaoBaoOpenUid(openUid);
record.setTaoBaoUserId(taoBaoUid);
record.setTaoBaoUserNick(nickName);
record.setCreateTime(new Date());
taoBaoUnionAuthRecordService.addAuthRecord(record);
} catch (Exception e) {
errCode = 4;
LogHelper.errorDetailInfo(e);
}
UserActiveLog activeLog = userActiveLogService.getUserLatestActiveInfo(uid);
boolean isNewJump = false;
if (activeLog != null) {
String platform = null;
String version = activeLog.getVersionCode();
if (activeLog.getChannel().equalsIgnoreCase("appstore")) {
platform = "ios";
} else {
platform = "android";
}
if (VersionUtil.greaterThan_2_0(platform, version)) {
isNewJump = true;
}
}
try {
if (errCode == 0)// 成功
{
if ("share".equalsIgnoreCase(source)) {
if (isNewJump)
response.sendRedirect("http://apph5.banliapp.com/flqWeb/h5/tbauth/success.html");
else
closeWebPage(response.getWriter());
} else if ("zigou".equalsIgnoreCase(source)) {
if (isNewJump)
response.sendRedirect("http://apph5.banliapp.com/flqWeb/h5/tbauth/success.html");
else
closeWebPage(response.getWriter());
} else if ("bind".equalsIgnoreCase(source)) {
if (isNewJump)
response.sendRedirect("http://apph5.banliapp.com/flqWeb/h5/tbauth/success.html");
else {
String script = String.format(
"",
StringUtil.getBase64String("恭喜你,淘宝绑定成功"));
response.getWriter().print(script);
}
}
} else {// 失败
if ("share".equalsIgnoreCase(source)) {
if (isNewJump)
response.sendRedirect("http://apph5.banliapp.com/flqWeb/h5/tbauth/fail.html");
else
closeWebPage(response.getWriter());
} else if ("zigou".equalsIgnoreCase(source)) {
if (isNewJump)
response.sendRedirect("http://apph5.banliapp.com/flqWeb/h5/tbauth/fail.html");
else
closeWebPage(response.getWriter());
} else if ("bind".equalsIgnoreCase(source)) {
if (isNewJump)
response.sendRedirect("http://apph5.banliapp.com/flqWeb/h5/tbauth/fail.html");
else {
String script = String.format(
"",
StringUtil.getBase64String("抱歉,淘宝绑定失败"));
response.getWriter().print(script);
}
}
}
} catch (Exception e) {
LogHelper.errorDetailInfo(e);
}
}
private void closeWebPage(PrintWriter out) {
String script = "";
out.print(script);
}
@RequestMapping(value = "pinduoduo")
public void pinDuoDuo(HttpServletResponse response) {
}
}