微信OAuth2.0

一、配置回調域名(注意必須騰訊可以訪問到的外網,也就是回調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;
	}

二、拉去用戶信息(注意:如今有uniondapi

/**
	 * 經過網頁受權獲取用戶信息
	 *
	 * @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(個人博客中的微信開放第一步中也有)

相關文章
相關標籤/搜索