一、配置回調域名(注意必須騰訊可以訪問到的外網,也就是回調URL的IP或者域名)
java
一、經過code換取access_tokenjson
/** * 獲取網頁受權憑證 * * @param appId 公衆帳號的惟一標識 * @param appSecret 公衆帳號的密鑰 * @param code * @return WeixinAouth2Token */ public static WeixinOauth2Token getOauth2AccessToken(String appId, String appSecret, String code) { WeixinOauth2Token wat = null; // 拼接請求地址 String requestUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code"; requestUrl = requestUrl.replace("APPID", appId); requestUrl = requestUrl.replace("SECRET", appSecret); requestUrl = requestUrl.replace("CODE", code); // 獲取網頁受權憑證 JSONObject jsonObject = CommonUtil.httpsRequest(requestUrl, "GET", null); if (null != jsonObject) { try { wat = new WeixinOauth2Token(); wat.setAccessToken(jsonObject.getString("access_token")); wat.setExpiresIn(jsonObject.getInt("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.getInt("errcode"); String errorMsg = jsonObject.getString("errmsg"); log.error("獲取網頁受權憑證失敗 errcode:{} errmsg:{}", errorCode, errorMsg); } } return wat; }
二、拉去用戶信息(注意:如今有uniond)api
/** * 經過網頁受權獲取用戶信息 * * @param accessToken 網頁受權接口調用憑證 * @param openId 用戶標識 * @return SNSUserInfo */ @SuppressWarnings( { "deprecation", "unchecked" }) public static SNSUserInfo getSNSUserInfo(String accessToken, String openId) { SNSUserInfo snsUserInfo = null; // 拼接請求地址 String requestUrl = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID"; requestUrl = requestUrl.replace("ACCESS_TOKEN", accessToken).replace("OPENID", openId); // 經過網頁受權獲取用戶信息 JSONObject jsonObject = CommonUtil.httpsRequest(requestUrl, "GET", null); if (null != jsonObject) { try { snsUserInfo = new SNSUserInfo(); // 用戶的標識 snsUserInfo.setOpenId(jsonObject.getString("openid")); // 暱稱 snsUserInfo.setNickname(jsonObject.getString("nickname")); // 性別(1是男性,2是女性,0是未知) snsUserInfo.setSex(jsonObject.getInt("sex")); // 用戶所在國家 snsUserInfo.setCountry(jsonObject.getString("country")); // 用戶所在省份 snsUserInfo.setProvince(jsonObject.getString("province")); // 用戶所在城市 snsUserInfo.setCity(jsonObject.getString("city")); // 用戶頭像 snsUserInfo.setHeadImgUrl(jsonObject.getString("headimgurl")); snsUserInfo.setUnionid(jsonObject.getString("unionid")); // 用戶特權信息 snsUserInfo.setPrivilegeList(JSONArray.toList(jsonObject.getJSONArray("privilege"), List.class)); } catch (Exception e) { snsUserInfo = null; int errorCode = jsonObject.getInt("errcode"); String errorMsg = jsonObject.getString("errmsg"); log.error("獲取用戶信息失敗 errcode:{} errmsg:{}", errorCode, errorMsg); } } return snsUserInfo; }
三、Servlet驗證回調微信
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("gb2312"); response.setCharacterEncoding("gb2312"); // 用戶贊成受權後,能獲取到code String code = request.getParameter("code"); // 用戶贊成受權 if (!"authdeny".equals(code)) { // 獲取網頁受權access_token WeixinOauth2Token weixinOauth2Token = AdvancedUtil.getOauth2AccessToken("appId", "appSecret", code); // 網頁受權接口訪問憑證 String accessToken = weixinOauth2Token.getAccessToken(); // 用戶標識 String openId = weixinOauth2Token.getOpenId(); // 獲取用戶信息 SNSUserInfo snsUserInfo = AdvancedUtil.getSNSUserInfo(accessToken, openId); // 設置要傳遞的參數 request.setAttribute("snsUserInfo", snsUserInfo); } // 跳轉到index.jsp request.getRequestDispatcher("wechat.jsp").forward(request, response); }
四、jsp回調效果頁面app
<% // 獲取由OAuthServlet中傳入的參數 SNSUserInfo user = (SNSUserInfo)request.getAttribute("snsUserInfo"); if(null != user) { %> <table width="100%" cellspacing="0" cellpadding="0"> <tr><td width="20%">屬性</td><td width="80%">值</td></tr> <tr><td>OpenID</td><td><%=user.getOpenId()%></td></tr> <tr><td>暱稱</td><td><%=user.getNickname()%></td></tr> <tr><td>性別</td><td><%=user.getSex()%></td></tr> <tr><td>國家</td><td><%=user.getCountry()%></td></tr> <tr><td>省份</td><td><%=user.getProvince()%></td></tr> <tr><td>城市</td><td><%=user.getCity()%></td></tr> <tr><td>頭像</td><td><%=user.getHeadImgUrl()%></td></tr> <tr><td>特權</td><td><%=user.getPrivilegeList()%></td></tr> </table> <% } else out.print("用戶不一樣意受權,未獲取到用戶信息!"); %>
五、發送URL到微信(加密回調的URL)jsp
https://open.weixin.qq.com/connect/oauth2/authorize?appid=appId&redirect_uri=你加密後的回調URL&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect
/** * 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; }
注意:網站
一、這裏是先講解代碼,再登陸請求編碼
二、這個博客中的微信機器人中包括的登陸不是OAuth2.0,我以爲應該是經過微信開放平臺的接口(這個登陸應該是網站登陸,這個OAuth2.0是受權登陸(微信客戶端))(http://my.oschina.net/biezhi/blog/618493?fromerr=vy6WIPOx) 加密
三、最後一步發送的URL必須在微信中打開url
4、Demo: http://yunpan.cn/cLTssBMDMmmBB 訪問密碼 b34b(個人博客中的微信開放第一步中也有)