QRCodeController.java
7.61 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
package com.xkl.controller.qrcode;
import com.wordnik.swagger.annotations.ApiImplicitParam;
import com.wordnik.swagger.annotations.ApiImplicitParams;
import com.wordnik.swagger.annotations.ApiOperation;
import com.xkl.authorization.annotation.Authorization;
import com.xkl.authorization.annotation.CurrentUser;
import com.xkl.authorization.annotation.LogAnnotation;
import com.xkl.authorization.annotation.Sign;
import com.xkl.authorization.manager.ITokenManager;
import com.xkl.authorization.model.TokenModel;
import com.xkl.config.Constants;
import com.xkl.config.ResultStatus;
import com.xkl.domain.User;
import com.xkl.domain.XklMemberEntity;
import com.xkl.domain.XklMemberOpenidEntity;
import com.xkl.model.QrCodeModel;
import com.xkl.model.ResultModel;
import com.xkl.model.UsrInfoModel;
import com.xkl.repository.UserRepository;
import com.xkl.repository.XklMemberOpenidRespository;
import com.xkl.repository.XklMemberRespository;
import com.xkl.security.AntiXSS;
import com.xkl.service.ILoginService;
import com.xkl.service.IQRCodeService;
import com.xkl.service.QRCodeServiceImpl;
import com.xkl.tools.DESTools;
import com.xkl.tools.DatetimeTools;
import com.xkl.tools.HttpTools;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.util.Assert;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* Created by zhaoyue on 2017/03/11.
*/
@RestController
@RequestMapping("/qrcode")
public class QRCodeController {
@Autowired
private IQRCodeService qrCodeService;
@Autowired
private ILoginService loginService;
@Autowired
private XklMemberOpenidRespository xklMemberOpenidRespository;
@Autowired
private UserRepository userRepository;
@Autowired
private XklMemberRespository xklMemberRespository;
private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");//小写的mm表示的是分钟
@LogAnnotation
@AntiXSS
@RequestMapping(value = "/getQrWithAccPwd", method = RequestMethod.GET)
@ApiOperation(value = "使用用户名密码得到qrcode")
public ResponseEntity<ResultModel> getQrWithAccPwd(HttpServletRequest request, @RequestParam String username, @RequestParam String password, @RequestParam long t) {
Assert.notNull(username, "username can not be empty");
Assert.notNull(password, "password can not be empty");
User user = loginService.check(username, password);
if (user == null) {//用户,密码错误
return new ResponseEntity<>(ResultModel.error(ResultStatus.USERNAME_OR_PASSWORD_ERROR), HttpStatus.OK);
} else {
String qrCode = qrCodeService.getQRCodeWithAccount(user.getLoginAccount());
QrCodeModel qrModel = new QrCodeModel(qrCode);
return new ResponseEntity<>(ResultModel.ok(qrModel), HttpStatus.OK);
}
}
@LogAnnotation
@AntiXSS
@Sign
@RequestMapping(value = "/getQrWithOpenId", method = RequestMethod.GET)
@ApiOperation(value = "使用openid获取qrCode")
public ResponseEntity<ResultModel> getQrWithOpenId(HttpServletRequest request, @RequestParam String openId, @RequestParam int openIdType,
@RequestParam String sign, @RequestParam long t, @RequestParam int type) {
if (!(boolean) request.getAttribute("signAspect")) {
return new ResponseEntity<>(ResultModel.error(ResultStatus.SIGN_ERROR), HttpStatus.OK);
}
XklMemberOpenidEntity openidEntity = xklMemberOpenidRespository.findByOpenidAndType(openId, openIdType);
// openId 未找到
if (openidEntity == null) {
return new ResponseEntity<>(ResultModel.ok(ResultStatus.OPENID_ERROR), HttpStatus.OK);
}
User user = userRepository.findOne(openidEntity.getAccountId());
// 用户不存在
if (user == null) {
return new ResponseEntity<>(ResultModel.ok(ResultStatus.USER_NOT_FOUND), HttpStatus.OK);
}
String qrCode = qrCodeService.getQRCodeWithAccount(user.getLoginAccount());
QrCodeModel qrModel = new QrCodeModel(qrCode);
return new ResponseEntity<>(ResultModel.ok(qrModel), HttpStatus.OK);
}
@LogAnnotation
@AntiXSS
@Authorization
@Sign
@RequestMapping(value = "/getQrWithToken", method = RequestMethod.GET)
@ApiOperation(value = "使用token得到qrcode")
@ApiImplicitParams({
@ApiImplicitParam(name = "authorization", value = "请输入登录返回信息:userId_tokens", required = true, dataType = "string", paramType = "header"),
})
public ResponseEntity<ResultModel> getQrWithToken(HttpServletRequest request, @CurrentUser User user,
@RequestParam String sign, @RequestParam long t, @RequestParam int type) {
if (!(boolean) request.getAttribute("signAspect")) {
return new ResponseEntity<>(ResultModel.error(ResultStatus.SIGN_ERROR), HttpStatus.OK);
}
String qrCode = qrCodeService.getQRCodeWithAccount(user.getLoginAccount());
QrCodeModel qrModel = new QrCodeModel(qrCode);
return new ResponseEntity<>(ResultModel.ok(qrModel), HttpStatus.OK);
}
@LogAnnotation
@AntiXSS
@RequestMapping(value = "/getUsrInfoWithQr", method = RequestMethod.GET)
@ApiOperation(value = "使用qrcode查询个人信息")
// 接口返回的qrcode都是正常的qrcode,但是客户端使用的时候必须加密才能使用。
public ResponseEntity<ResultModel> getUsrInfoWithQr(HttpServletRequest request,
@RequestParam String encryptQr, @RequestParam long t) {
String qrcode = qrCodeService.getDecryptHttpParaQr(encryptQr, t);
if (qrcode == null) {
return new ResponseEntity<>(ResultModel.error(ResultStatus.INVALID_QR_CODE), HttpStatus.OK);
}
String account = qrCodeService.getAccountWithQRCode(qrcode);
User user = userRepository.findByLoginAccountAndStatus(account, true);
if (user == null) {
return new ResponseEntity<>(ResultModel.error(ResultStatus.USER_NOT_FOUND), HttpStatus.OK);
}
XklMemberEntity xklMemberEntity = xklMemberRespository.findOne((long) user.getMemberId());
Date birthDate = new Date();
try {
birthDate = sdf.parse(xklMemberEntity.getBirthDate());
} catch (Exception e) {
e.printStackTrace();
}
int age = DatetimeTools.getAge(birthDate, new Date());
UsrInfoModel usrInfo = new UsrInfoModel(user.getLoginAccount(), xklMemberEntity.getName(),
xklMemberEntity.getIdcard(), xklMemberEntity.getPhone(), xklMemberEntity.isSex() ? 1 : 0, age, qrcode, genWebloginUrl(qrcode));
return new ResponseEntity<>(ResultModel.ok(usrInfo), HttpStatus.OK);
}
private static String genWebloginUrl(String qrcode) {
String now = HttpTools.getNow();
try {
String encryptQr = DESTools.encrypt(qrcode.trim() + now, QRCodeServiceImpl.getHttpParaQrKey());
String interUrl = Constants.LOCAL_QRVERIFY_URL + encryptQr + "&t=" + now;
return Constants.WEB_LOGIN_URL + URLEncoder.encode(interUrl, "utf-8");
} catch (Exception e) {
return null;
}
}
}