package com.ltdd.hall.biz.api.controller;
import com.alibaba.fastjson.JSON;
import com.ltdd.core.domain.RestResponse;
import com.ltdd.core.exception.BizException;
import com.ltdd.hall.common.Token;
import com.ltdd.hall.common.util.CookieUtil;
import com.ltdd.hall.common.util.RestUtile;
import com.ltdd.hall.common.util.TokenUtils;
import com.ltdd.hall.core.service.KMemberService;
import com.ltdd.hall.dal.biz.dataobject.HotCityDO;
import com.ltdd.hall.dal.biz.dataobject.WxOauth2TokenDO;
import com.ltdd.hall.dal.biz.dataobject.WxUserInfo;
import com.ltdd.hall.dal.core.dataobject.KMemberDO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.List;
import java.util.Map;
@Api(value = "WX", description = "微信相关文档")
@RestController
@RequestMapping("/wx")
@Slf4j
@Validated
public class WxController {
@Autowired
KMemberService kMemberService;
@ApiOperation(value = "test微信", httpMethod = "GET")
@RequestMapping(value = "/wxLogin", method = RequestMethod.GET)
public void wxLogin(HttpServletRequest req, HttpServletResponse resp,String url) throws IOException {
CookieUtil cookieUtil = new CookieUtil();
Cookie cooname = cookieUtil.getCookieByName(req,"openId");
if(null == cooname) {
String uri = urlEncodeUTF8("http://xxxxxxxxx.com/wx/notifyLogin?url=" + url);
String appid = "xxxxxxx1c3caa1e";
String urlNameString = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + appid + "&redirect_uri=" + uri + "&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect";
resp.sendRedirect(urlNameString);
}else{
resp.sendRedirect(urlDecodeUTF8(url));
}
}
// @ApiOperation(value = "test微信", httpMethod = "GET")
// @RequestMapping("/authorize")
// public ModelAndView alipayforward(HttpServletRequest req, HttpServletResponse resp,String url) throws Exception {
// CookieUtil cookieUtil = new CookieUtil();
// Cookie cooname = cookieUtil.getCookieByName(req,"openId");
// if(null == cooname){
// String uri = urlEncodeUTF8("http://xxxxxxxxx.com/wx/notifyLogin?url="+url);
// String appid ="xxxxxxx1c3caa1e";
// String urlNameString = "redirect:https://open.weixin.qq.com/connect/oauth2/authorize?appid="+appid+"&redirect_uri="+uri+"&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect";
// return new ModelAndView(urlNameString);
// }else{
// String rurl = urlDecodeUTF8(url);
// return new ModelAndView("redirect:"+rurl);
//
// }
//
//
// }
/**
* URL编码(utf-8)
*
* @param source
* @return
*/
public static String urlEncodeUTF8(String source) {
String result = source;
try {
result = java.net.URLEncoder.encode(source, "utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return result;
}
public static String urlDecodeUTF8(String source) {
String result = source;
try {
result = java.net.URLDecoder.decode(source, "utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return result;
}
@RequestMapping(value = "/notifyLogin", method = RequestMethod.GET)
public void notifyLogin(HttpServletRequest request,HttpServletResponse response) throws Exception {
Map<String, String[]> params = request.getParameterMap();//针对get获取get参数
String[] codes = params.get("code");//拿到code的值
String[] rurls = params.get("url");
String rurl = rurls[0];
String code = codes[0];
WxOauth2TokenDO oauth2Token = this.getOauth2AccessToken("xxxxxxx1c3caa1e", "xxxxxxxxxb3fa77a2a06dec2", code);
// 网页授权接口访问凭证
String accessToken = oauth2Token.getAccessToken();
// 用户标识
String openId = oauth2Token.getOpenId();
WxUserInfo snsUserInfo = this.getSNSUserInfo(accessToken,openId);
CookieUtil cookieUtil = new CookieUtil();
cookieUtil.setCookie("openId",snsUserInfo.getOpenId(),60*60,response);
cookieUtil.setCookie("nickname",snsUserInfo.getNickname(),60*60,response);
cookieUtil.setCookie("sex",String.valueOf(snsUserInfo.getSex()),60*60,response);
cookieUtil.setCookie("headImgUrl",snsUserInfo.getHeadImgUrl(),60*60,response);
cookieUtil.setCookie("unionid",snsUserInfo.getUnionid(),60*60,response);
KMemberDO kMemberDO = kMemberService.selectByOpenId(snsUserInfo.getOpenId());
if(null != kMemberDO || !"".equals(kMemberDO)){
int insetResult = kMemberService.insert(snsUserInfo);
}else{
int updateResult = kMemberService.update(snsUserInfo);
}
KMemberDO kMemberDO1 = kMemberService.selectByOpenId(snsUserInfo.getOpenId());
Token token = new Token();
token.setMemberId(kMemberDO1.getMemberId());
token.setMemberNickName(kMemberDO1.getMemberNickName());
token.setMemberOpenId(kMemberDO1.getMemberOpenid());
cookieUtil.setCookie("tokenm", String.valueOf(token),60*60,response);
String tokenStr = TokenUtils.getTokenStr(token);
cookieUtil.setCookie("token",tokenStr,60*60,response);
response.sendRedirect(urlDecodeUTF8(rurl));
}
public static WxOauth2TokenDO getOauth2AccessToken(String appId, String appSecret, String code) throws Exception {
WxOauth2TokenDO wat = null;
// 拼接请求地址
String requestUrl = "https://api.weixin.qq.com/sns/oauth2/access_token";
// 获取网页授权凭证
String query = "appid="+appId+"&secret="+appSecret+"&code="+code+"&grant_type=authorization_code";
RestUtile restUtil = new RestUtile();
String resultString = restUtil.load(requestUrl,query);
com.alibaba.fastjson.JSONObject jsonObject = JSON.parseObject(resultString);
if (null != jsonObject) {
try {
wat = new WxOauth2TokenDO();
wat.setAccessToken(jsonObject.getString("access_token"));
wat.setExpiresIn(jsonObject.getInteger("expires_in"));
wat.setRefreshToken(jsonObject.getString("refresh_token"));
wat.setOpenId(jsonObject.getString("openid"));
wat.setScope(jsonObject.getString("scope"));
} catch (Exception e) {
wat = null;
int errorCode = jsonObject.getInteger("errcode");
String errorMsg = jsonObject.getString("errmsg");
}
return wat;
}
return wat;
}
public WxUserInfo getSNSUserInfo(String accessToken, String openId) throws Exception {
WxUserInfo snsUserInfo = null;
String requestUrl = "https://api.weixin.qq.com/sns/userinfo";
// 获取网页授权凭证
String query = "access_token="+accessToken+"&openid="+openId;
RestUtile restUtil = new RestUtile();
String resultString = restUtil.load(requestUrl,query);
com.alibaba.fastjson.JSONObject jsonObject = JSON.parseObject(resultString);
if (null != jsonObject) {
try {
snsUserInfo = new WxUserInfo();
// 用户的标识
snsUserInfo.setOpenId(jsonObject.getString("openid"));
// 昵称
snsUserInfo.setNickname(jsonObject.getString("nickname"));
// 性别(1是男性,2是女性,0是未知)
snsUserInfo.setSex(jsonObject.getInteger("sex"));
// 用户所在国家
snsUserInfo.setCountry(jsonObject.getString("country"));
// 用户所在省份
snsUserInfo.setProvince(jsonObject.getString("province"));
// 用户所在城市
snsUserInfo.setCity(jsonObject.getString("city"));
// 用户头像
snsUserInfo.setHeadImgUrl(jsonObject.getString("headimgurl"));
// 用户特权信息
List<String> list = JSON.parseArray(jsonObject.getString("privilege"),String.class);
snsUserInfo.setPrivilegeList(list);
//与开放平台共用的唯一标识,只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段。
snsUserInfo.setUnionid(jsonObject.getString("unionid"));
} catch (Exception e) {
snsUserInfo = null;
int errorCode = jsonObject.getInteger("errcode");
String errorMsg = jsonObject.getString("errmsg");
}
}
return snsUserInfo;
}
@RequestMapping(value = "/cookie", method = RequestMethod.GET)
public RestResponse<KMemberDO> testCookie(HttpServletRequest request,HttpServletResponse response,String name,String value) throws Exception {
// response.sendRedirect("http://wechat.lvtudiandian.com/index.php/TpApi/Test/test");
// CookieUtil cookieUtil = new CookieUtil();
// cookieUtil.setCookie(name,value,60*60*24,response);
// Cookie names = cookieUtil.getCookieByName(request,name);
KMemberDO kMemberDO = kMemberService.selectByOpenId("oaIK-wrQAMe1Zw0t9AgHJ4VPkrQQ");
WxUserInfo wxUserInfo = new WxUserInfo();
wxUserInfo.setHeadImgUrl("httP:kkkkkkk1");
// wxUserInfo.setOpenId("222222222222222222");
wxUserInfo.setNickname("wwwwwwwwww1");
wxUserInfo.setOpenId("ooopppppweeeneid");
wxUserInfo.setUnionid("uuunnniiidddd1");
int insetResult = kMemberService.insert(wxUserInfo);
long id = kMemberDO.getMemberId();
KMemberDO kMemberDO1 = new KMemberDO();
long id1 = kMemberDO1.getMemberId();
// KMemberDO kMemberDO1 = new KMemberDO();
// k
// if(null != kMemberDO || !"".equals(kMemberDO)){
// int insetResult = kMemberService.insert(wxUserInfo);
// }else{
// int updateResult = kMemberService.update(wxUserInfo);
// }
return RestResponse.succ("历史城市详情查询成功", kMemberDO);
}
@ApiOperation(value = "tests微信", httpMethod = "GET")
@RequestMapping("/testcookie")
public ModelAndView cookie123(HttpServletRequest req, HttpServletResponse resp) throws Exception {
//String uri = urlEncodeUTF8("redirect:http://wechat.lvtudiandian.com/index.php/TpApi/Test/test");
//String appid ="xxxxxxx1c3caa1e";
String urlNameString = "redirect:http://wechat.lvtudiandian.com/index.php/TpApi/Test/test";
return new ModelAndView(urlNameString);
}
}