PC端微信快捷登录
操作文档
- 申请账号。https://open.weixin.qq.com/
- 创建网站应用:
- 开通微信登录(需要认证 认证费300元)(点击二步“查看”按钮)
- 生成AppSecret。
- 控制器代码实现。(如下移动端微信快捷登录程序实现)
移动端微信快捷登录
操作文档
- 必须使用微信公众号(服务号)。
- 对网页进行授权。
- 对应开发文档:
- 配置授权域名:公众号设置-功能设置-网页授权域名,点击设置新增域名。
- 注意:手机端微信快捷登录,没法获取unionId,但可以获取openId。程序要判断是手机端就走openId获取会员信息是否已经存在方法,否则就使用unionId。
程序实现如下:
/**
* @Description: 微信快捷登录
* @param subsiteFlag
* @param subsiteId
* @param request
* @return
* Add by Bingyong.Wang at 20200424.
*/
@RequestMapping("/wxLogin")
public String weixinLogin(HttpServletRequest request){
try{
String code = request.getParameter("code");
// 用来判断是否为移动端,主要是为了显示不同的会员界面
String state = request.getParameter("state");
System.out.println("webUrl==============================="+request.getParameter("webUrl"));
//获取openId并保存到会员中,openId来源于微信第三方登录
if (GeneralUtil.isNotNull(code)) {
// 微信开放平台对应的appId
String appid = "";
// appId对应的秘钥
String secret = "";
if (HttpRequestDeviceUtils.isMobileDevice(request)){
// 微信公众号登录
appid = AykjConstants.APP_Id;
secret = AykjConstants.APP_SECRET;
} else {
// 微信开发平台登录
appid = AykjConstants.WXLOGIN_APPID;
secret = AykjConstants.WXLOGIN_APPSECRET;
}
// 获取 token
String url = "https://api.weixin.qq.com/sns/oauth2/access_token";
Map<String, String> params = new HashMap<String, String>();
params.put("appid", appid);
params.put("secret", secret);
params.put("code", code);
params.put("grant_type", "authorization_code");
// System.out.println("=========url:"+url);
// System.out.println("=========params:"+params);
String result = HttpUtil.post(url, params, "utf-8");
//System.out.println("result"+result);
if (GeneralUtil.isNotNull(result)) {
JSONObject jsonObject = JSON.parseObject(result);
System.out.println("jsonObject"+jsonObject);
String openId = jsonObject.getString("openid");
String access_token = jsonObject.getString("access_token");
String unionid = jsonObject.getString("unionid");
// 获取用户信息
String getUserInfoUrl = "https://api.weixin.qq.com/sns/userinfo?openid=" + openId + "&access_token=" + access_token;
String getUserResult = HttpUtil.get(getUserInfoUrl, "utf-8");
if (GeneralUtil.isNotNull(getUserResult)) {
JSONObject json = JSON.parseObject(getUserResult);
System.out.println("getUserResult-jsonObject--------------"+jsonObject);
// 用户暱称
String nickName = json.getString("nickname");
// 用户头像(微信头像)
String wxHeaderImg = json.getString("headimgurl");
String headerImg = System.currentTimeMillis() + ".png";
HttpUtil.downloadFile(wxHeaderImg, InitialListener.basePath + "temp/" + headerImg);
System.out.println("openId==="+openId);
System.out.println("access_token==="+access_token);
System.out.println("unionid==="+unionid);
System.out.println("用户暱称==="+nickName);
System.out.println("微信头像====="+headerImg);
Member member = null;
if (state.equals("mobileState")) {
//根据openId查找会员
member = memberService.queryByOpenId(openId);
} else {
member = memberService.queryByUnionid(unionid);
}
if(member != null && GeneralUtil.isNotNull(member.getLoginId())){
//增加登录日志
//memberLogService.addLogin(member, request);
request.getSession().setAttribute(AykjConstants.FONT_MEMBER, member);
if (state.equals("mobileState")) {
return "redirect:/member/toPage?subsiteFlag=spMb&subsiteId=2&newsClassId=80&page=member";
}
return "redirect:/member/toPage?subsiteFlag=spPC&subsiteId=1&newsClassId=34&page=memberHome";
} else{
// 如果会员不存在就创建一个新会员
Member wxMember = new Member();
// 保存会员头像
Annex annex = new Annex();
wxMember.setLoginId(GeneralUtil.isNotNull(unionid) ? unionid : openId);
wxMember.setOpenId(openId);
wxMember.setUnionid(unionid);
wxMember.setName(nickName);
annex.setType("image");
annex.setObj("member");
annex.setExt("png");
annex.setPath("/temp/" + headerImg);
memberService.saveWxMember(wxMember, annex);
request.getSession().setAttribute(AykjConstants.FONT_MEMBER, wxMember);
if (state.equals("mobileState")) {
return "redirect:/member/toPage?subsiteFlag=spMb&subsiteId=2&newsClassId=80&page=member";
}
return "redirect:/member/toPage?subsiteFlag=spPC&subsiteId=1&newsClassId=34&page=memberHome";
}
}
}
}
} catch (Exception e) {
LoggerUtil.error("微信登录失败:"+e.getMessage());
e.printStackTrace();
}
return "/error/404";
}