1.controller
@Controller
public class WeiXinToken extends BaseController {
@Autowired
private WeiXinService weiXinService;
@Autowired
private SystemService systemService;
@Autowired
private InformationMessageService informationMessageService;
@RequestMapping(value = "${adminPath}/check", method = RequestMethod.GET)
public String checkSignature(HttpServletRequest request,HttpServletResponse response, Model model) {
//微信公众号验证URL,如果验证成功,则绑定URL
if(!StringUtils.isBlank(request.getParameter("echostr"))){
String signature = request.getParameter("signature");
String timestamp = request.getParameter("timestamp");
String nonce = request.getParameter("nonce");
String echostr = request.getParameter("echostr");
PrintWriter pw = null;
try {
pw = response.getWriter();
} catch (IOException e) {
e.printStackTrace();
}
pw.append(echostr);
pw.flush();
pw.close();
}
String str = "code";
if (request.getParameter(str) != null) {
String code = request.getParameter("code");
Map<String, String> map = null;
map = weiXinService.getAccessToken(code);
CacheUtils.put("AccessToken", map);
map = (Map<String, String>) CacheUtils.get("AccessToken");
WeiXinEntity result = weiXinService.getUserInfo(map);
model.addAttribute("weixin", result);
if(result == null){
return null;
}
User user = systemService.findByOpenId(result.getOpenid());
String openId = result.getOpenid();
if (user != null) {
UsernamePasswordToken token = new UsernamePasswordToken();
token.setOpenId(result.getOpenid());
token.setHost(StringUtils.getRemoteAddr(request));
token.setRememberMe(true);
UserUtils.getSubject().login(token);
return "modules/sys/sysIndex";
} else {
addMessage(model, "您在本网站还没有账号,请完善账号信息!");
HttpSession session = request.getSession();
session.setAttribute("openId", openId);
session.setAttribute("photoImg", result.getHeadimgurl());
return "modules/sys/sysIndex";
}
}
}
return "modules/sys/sysLogin";
}
/**
* 微信 服务号 验证内容
*
* @author
* @date 2018-40-20 9:40
*/
@RequestMapping(value = "MP_verify_VLoeGPPI5akc4iV8.txt", method = RequestMethod.GET)
public void weiXin(HttpServletResponse response) throws IOException {
String str = Global.getConfig("MP_verify_VLoeGPPI5akc4iV8");
response.getWriter().write(str.replaceAll("\"", ""));
}
2 service
@Service
public class WeiXinService extends BaseService {
/**
* 通过code 获取accessToken
*
* @param code 用户同意授权 获得的code
* @return java.util.Map
* @author
* @date 2018-33-20 9:33
*/
public Map<String, String> getAccessToken(String code) {
//取出配置文件中的AccessTokenURL
String accessTokenURL = Global.getConfig("AccessTokenURL");
//取出配置文件中的Secret
String secret = Global.getConfig("Secret");
//取出配置文件中的APPId
String appId = Global.getConfig("AppId");
//发送求情
String result = sendGET(accessTokenURL.replaceAll("APPID", appId)
.replaceAll("SECRET", secret)
.replaceAll("CODE", code));
//将微信返回的Json转为Map
if (StringUtils.isNotEmpty(result)) {
//使用Gson 转为Map
return new Gson().fromJson(result, new TypeToken<Map<String, String>>() {
}.getType());
}
return null;
}
/**
* 通过accessToken获取用户基本信息
*
* @param map json 转为map
* @return WeiXinEntity 用户基本信息
* @author
* @date 2018-32-20 9:32
*/
public WeiXinEntity getUserInfo(Map<String, String> map) {
if (map.containsKey("access_token") && map.containsKey("openid")) {
String userInfo = Global.getConfig("UserInfo");
if (!checkAccessToken(map)) {
//失效则刷accessToken
Map<String, String> res = getRefreshToken(map.get("refresh_token"));
if (res != null) {
String retu = sendGET(userInfo.replaceAll("ACCESS_TOKEN", res.get("access_token"))
.replaceAll("OPENID", res.get("openid")));
return new Gson().fromJson(retu, new TypeToken<WeiXinEntity>() {
}.getType());
}
}
//通过 ACCESS_TOKEN 和 OPENID 获取用户信息
String result = sendGET(userInfo.replaceAll("ACCESS_TOKEN", map.get("access_token"))
.replaceAll("OPENID", map.get("openid")));
return new Gson().fromJson(result, new TypeToken<WeiXinEntity>() {}.getType());
}
return null;
}
/**
* 检查accessToken 是否有效
* @author
* @date 2018-41-20 14:41
* @param map getAccessToken 获取到的
* @return boolean
*/
private boolean checkAccessToken(Map<String, String> map) {
if (map.containsKey("access_token") && map.containsKey("openid")) {
String authAccessToken = Global.getConfig("AuthAccessToken");
String result = sendGET(authAccessToken.replaceAll("ACCESS_TOKEN", map.get("access_token")).replaceAll("OPENID", map.get("openid")));
return result.contains("ok");
}
return false;
}
/**
* 通过 appId refresh_token 刷新 accessToken
*
* @param refresh_token 刷新 accessToken 需要的凭证
* @return java.util.Map<java.lang.String , java.lang.String>
* @author
* @date 2018-34-20 9:34
*/
private Map<String, String> getRefreshToken(String refresh_token) {
if (StringUtils.isNotBlank(refresh_token)) {
String refreshToken = Global.getConfig("RefreshToken");
String result = sendGET(refreshToken.replaceAll("APPID", Global.getConfig("AppId")).replaceAll("REFRESH_TOKEN", refresh_token));
return new Gson().<Map<String, String>>fromJson(result, new TypeToken<Map<String, String>>() {
}.getType());
}
return null;
}
/**
* 发送请求通用方法
*
* @param sendURL 请求url
* @return java.lang.String 返回json
* @author
* @date 2018-46-19 18:46
*/
private String sendGET(String sendURL) {
StringBuilder result = new StringBuilder();
BufferedReader in = null;
try {
URL url = new URL(sendURL);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
in = new BufferedReader(new InputStreamReader(url.openStream(), "UTF-8"));
String line = "";
while ((line = in.readLine()) != null) {
result.append(line);
}
logger.info(result.toString());
} catch (IOException e) {
logger.error(sendURL);
logger.error("获取数据异常:" + e.getMessage());
e.printStackTrace();
}
return result.toString();
}
}