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";
}