【Servlet】基于Jsp的微信Oauth2认证

挂载到微信服务器上的应用程序,能够通过微信Oauth2认证,能够抓取到用户的微信信息,当然,你首先要通过微信的帐号资质审核。


一、基本思想




二、基本过程

1.登陆微信的公众平台(点击打开链接),在左侧的最下方找到开发者中心,记下你的AppID(应用ID),假设是i,与AppSecret(应用密钥),假设是s

在接口权限表中的高级接口,修改OAuth2.0网页授权,写入你挂载本应用的域名,假设是http://a.b.com。


2.在Eclipse中新建一个工程,由于使用到Servlet与Json,所以要在lib文件夹中放入如下两包:



3.在web.xml中写入:

        <servlet>
		<servlet-name>wx_banding</servlet-name>
		<servlet-class>Oauth.Jumping</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>wx_banding</servlet-name>
		<url-pattern>/wx_banding</url-pattern>
	</servlet-mapping>


指明访问http://a.b.com/wx_bangding将会跳转到处理Servlet


4.在src文件中新建一个包叫Oauth,在这个包下新建一个类叫Jumping.java

Jumping.java下的代码如下:

package Oauth;

import java.io.IOException;

import javax.servlet.*;
import javax.servlet.http.*;

public class Jumping extends HttpServlet{
	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		response.sendRedirect("https://open.weixin.qq.com/connect/oauth2/authorize?appid=i&redirect_uri=http://a.b.com/oauth.jsp&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect");
	}

	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException {

	}
}

其中所跳转的链接中的appid与域名请替换成你自己的域名,同时oauth.jsp是我们下一步需要处理的页面

这样的作法是为了此验证网址中的appid不要暴露在外

并且用户也不用看到如此长的一串网址。


5.在WebRoot下的文件夹中新建一个oauth.jsp

注意修改好本页面的标题,不然此页会在微信端很难看

里面的<body></body>的代码如下:

	<body>
		<%
			String code = null;
			try {
				code = request.getParameter("code").toString();
			} catch (Exception e) {
				response.sendRedirect("http://a.b.com");
			}
		%>
		<script type="text/javascript">
			window.location.href = "oauthLoading?code=<%=code%>"
		</script>
	</body>

这是一段Jsp加Javascript的混合代码

意思是要拿到这次会话的code,如果拿不到,就跳转到我自己的首页http://a.b.com,恶意用户在电脑端访问此页就拿不到微信会话的code,表明此页面专为微信准备的。

window.location.href重定向指明要到oauthLoading这一Servlet中处理。


6.继续在web.xml添加如下代码段:

	<servlet>
		<servlet-name>oauthLoading</servlet-name>
		<servlet-class>Oauth.Loading</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>oauthLoading</servlet-name>
		<url-pattern>/oauthLoading</url-pattern>
	</servlet-mapping>

指明要到Oauth包中的Loading.java中处理


7.继续在Oauth包中新建一个Loading.java

代码如下:

package Oauth;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.net.*;
import com.alibaba.fastjson.*;

public class Loading extends HttpServlet {
	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException,
			MalformedURLException, IOException {

		String code = request.getParameter("code");
		StringBuilder json = new StringBuilder();
		String url = null;
		BufferedReader in = null;
		String inputLine = null;
		String json1 = null;
		JSONObject jobject = null;
		//这里的appid与secret换成你自己的secret
		url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=i&secret=s&code="
				+ code + "&grant_type=authorization_code";
		in = new BufferedReader(new InputStreamReader(new URL(url)
				.openConnection().getInputStream(), "utf-8"));
		while ((inputLine = in.readLine()) != null) {
			json.append(inputLine);
		}
		in.close();

		json1 = json.toString();
		jobject = JSON.parseObject(json1);
		json = new StringBuilder();

		url = "https://api.weixin.qq.com/sns/userinfo?access_token="
				+ jobject.getString("access_token") + "&openid="
				+ jobject.getString("openid");
		in = new BufferedReader(new InputStreamReader(new URL(url)
				.openConnection().getInputStream(), "utf-8"));
		inputLine = null;
		while ((inputLine = in.readLine()) != null) {
			json.append(inputLine);
		}
		in.close();

		json1 = json.toString();
		jobject = JSON.parseObject(json1);
		request.setAttribute("jobject", jobject);

		try {
			request.getRequestDispatcher("WEB-INF/welcome.jsp").forward(request,
					response);
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException {

	}
}

8.之后在WEB-INF中新建一个非经正常跳转不让看的welcome.jsp,此页面将会得到一个经历两重验证才得到的,包含用户信息的jobject。

welcome.jsp在头声明使用<%@ page import="com.alibaba.fastjson.*"%>

之后在页身使用<%JSONObject jobject=(JSONObject)request.getAttribute("jobject"); %>

拿到这个用户jobject之后,想怎么玩爱怎么玩。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
微信OAuth2网页授权登陆接口,微信OAuth2网页授权登陆接口,在你的网站上放上可以扫码登陆,会不会吸引更多用户去注册,现在你只需要简单的配制一下就可以轻松实现,还不快点拿走,微信扫码登陆接口开发你只要需要把配制文件中的APPid、KEY等修改为你自己中你申请的时的就可以,傻瓜式操作,无论你是技术大神还是刚入门的小白,只需修改一下配制文件,便可帮助你实现各种网站登陆。 使用方法 1. 配置网页授权域名 登录微信公众平台后台,在左侧目录底部找到“开发”-“接口权限”,点击进入并在接口列表中找到“网页授权获取用户基本信息”,点击右侧“修改”,在授权回调域名中填自己的域名,例如 www.abc.com,注意此处是域名,不是网址,所以不带http,也不带/等。 2. 修改参数配置 在左侧目录底部找到“开发”-“基本配置”,找到APPID和APPSECRET两个参数的值,其中APPSECRET的值默认是隐藏的,需要微信扫描验证才得显示。 使用Notepad++等编辑器打开,weixin.class.php文件,修改其中的APPID和APPSECRET参数,并保存。 define('APPID', "111111"); define('APPSECRET', "111111"); 3. 上传代码 将Demo代码上传到上述域名网站目录,比如上传到根目录的oauth2目录,这样,该Demo的访问路径将是 http://www.abc.com/oauth2/index.php 4. 访问体验 将上述目录在微信中打开,就可以体验微信OAuth2.0网页授权过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值