微信公众号开发之OAuth2.0网页授权

 

 

 

1、首先修改微信授权接口下的JS回调域名,要求全域名并且不带http,目录下的所有文件均可进行授权,然后将txt密钥放入域名根目录下

 

 

2、这里是微信公众号的文档说明:

 

      1、引导用户进入授权页面同意授权,获取code 

      2、通过code换取网页授权access_token(与基础支持中的access_token不同) 

      3、如果需要,开发者可以刷新网页授权access_token,避免过期 

      4、通过网页授权access_token和openid获取用户基本信息(支持UnionID机制) 

      1 第一步:用户同意授权,获取code

      2 第二步:通过code换取网页授权access_token

      3 第三步:刷新access_token(如果需要)

      4 第四步:拉取用户信息(需scope为 snsapi_userinfo)

      5 附:检验授权凭证(access_token)是否有效

 

 

3、具体流程,第一步,引入用户进入授权页面 

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		String backUrl = "http://你的域名/项目名/接口方法路径";
		String url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid="+APPID
			+"&redirect_uri="+backUrl//请求成功后返回code,用来接受code的方法路径
			+"&response_type=code"//固定code
			+"&scope=snsapi_userinfo"//snsapi_userinfo和snsapi_base都可以
			+"&state=STATE#wechat_redirect"; //固定STATE#wechat_redirect
		resp.sendRedirect(url);
	}


这里的参数说明,直接用微信公众开发文档的,很明确:

 

4、上一步请求成功后,微信后台会返回一个code参数给服务器的回调地址,就是上面的backUrl,在这里接受一下code参数再向服务器发起请求,用code换取access_token,这里的access_token,与微信调用接口的access_token不同,这里access_token没有次数限制,另一个每日调用次数100000次,然后发起Get请求,获得access_token,openid,再用两个参数Get请求得到用户信息,这里返回的数据都是JSON格式的字符串,需要转换。没有用urlEncode依旧可以用,不太懂。

String urlStr = java.net.URLEncoder.encode("钱钱钱钱","GBK"); //javaAPI自带

 

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
		String code = req.getParameter("code");
		String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="+APPID
				+"&secret="+APPSECRET
				+"&code="+code
				+"&grant_type=authorization_code";
		JSONObject jsonObject = AuthUtil.doGetJson(url);//这里发起httpget请求,需要http相关jar包和json相关jar包
		String openid = jsonObject.optString("openid");
		String access_token = jsonObject.optString("access_token");
		String userInfoUrl = "https://api.weixin.qq.com/sns/userinfo?access_token="+access_token
		+"&openid="+openid
		+ "&lang=zh_CN";
		JSONObject userInfo= AuthUtil.doGetJson(userInfoUrl);
		String imgurl =userInfo.optString("headimgurl");
		System.out.println(userInfo);
		System.out.println(imgurl);
		}
public static JSONObject doGetJson(String url) throws ClientProtocolException, IOException{
		JSONObject jsonObject = null;
		DefaultHttpClient client =  new DefaultHttpClient();
		HttpGet get = new HttpGet(url);
		HttpResponse response = client.execute(get);
		HttpEntity entity = response.getEntity();
		if(entity!=null){
			String result = EntityUtils.toString(entity, "UTF-8");
			jsonObject = JSONObject.fromObject(result);
		}
		get.releaseConnection();
		return jsonObject;
	}

然后就可以获得用户的信息了,亲测可用,就是遇到一个问题,上面接受code方法需要继承httpservlet的doGet方法,但是对获取code发起请求可不可以不用doGet?
 

 

最近在整理一些资源工具,放在网站分享 http://tools.maqway.com
欢迎关注公众号:麻雀唯伊 , 不定时更新资源文章,生活优惠,或许有你想看的

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值