100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > 微信公众号网页OAuth2.0授权自动登录(Java版)

微信公众号网页OAuth2.0授权自动登录(Java版)

时间:2019-11-04 21:24:09

相关推荐

微信公众号网页OAuth2.0授权自动登录(Java版)

微信公众号中使用OAuth2.0进行授权,获取用户的基本信息的过程。详细的开发文档可查看微信的官方文档。

微信公众平台开发者文档:

http://mp./wiki/14/89b871b5466b19b3efa4ada8e577d45e.html

首先要配置一下我们的公众号:

1、配置回调函数

我们在微信客户端访问第三方网页(即我们自己的网页)的时候,我们可以通过微信网页授权机制,回调的域名设置,即用户授权后,页面会跳转到哪里。具体的配置如下:

在接口权限,有一个“网页授权获取用户基本信息”,点击后面的修改

填写回调的域名

注意一下:这里填写的是域名(是一个字符串),而不是URL,请勿加http://等协议头

现在我们的重头戏来了

微信授权登录并获取用户基本信息

微信授权使用的是OAuth2.0授权的方式。主要有以下简略步骤:

第一步:用户同意授权,获取code第二步:通过code换取网页授权access_token第三步:刷新access_token(如果需要)第四步:拉取用户信息(需scope为 snsapi_userinfo)

1)、用户授权并获取code

首先引导用户进入授权界面(比如可以点击菜单栏的按钮触发)

function(data){var appid = data.appId;//声明授权后要跳转的方法链接var redirect_uri = encodeURIComponent('http://xxxxx.do);//引导用户进入授权界面var url='https://open./connect/oauth2/authorize?appid=' + appid +'&redirect_uri=' + redirect_uri + '&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect';location.href = url; }

code说明 : code作为换取access_token的票据,每次用户授权带上的code将不一样,code只能使用一次,5分钟未被使用自动过期。

如果用户同意授权,页面将跳转至 redirect_uri/?code=CODE&state=STATE。

2)、通过code换取网页授权access_token

@RequestMapping(value = "/auth", method = RequestMethod.GET)public ModelAndView auth(@RequestParam("code") String code, String view, HttpSession session) {//System.out.println(code);// 第三方用户唯一凭证String appId = JsdkCommonUtil.getProJsdk().getProperty("appid");// 第三方用户唯一凭证密钥String appSecret = JsdkCommonUtil.getProJsdk().getProperty("appsecret");//获取网页授权access_tokenString url = "https://api./sns/oauth2/access_token?appid=" + appId + "&secret=" + appSecret + "&code="+ code + "&grant_type=authorization_code";RestTemplate restTemplate = new RestTemplate();String openId = "";try {String response = restTemplate.getForObject(url, String.class);String[] info = response.split(":");openId = response.split(":")[4].split(",")[0].replaceAll("\"", "");//System.out.println(openId);} catch (Exception e) {System.out.println("233333");}

工具类

package com.gx.util;import java.io.IOException;import java.util.HashMap;import java.util.Iterator;import java.util.Map;import java.util.Properties;import java.util.UUID;import com.gx.vo.JsdkParam;import com.gx.web.Test;import net.sf.json.JSONObject;public class JsdkCommonUtil {private static Properties proJsdk=null;public static final Properties getProJsdk() {return proJsdk;}public static final void setProJsdk(Properties proJsdk) {JsdkCommonUtil.proJsdk = proJsdk;}static{proJsdk=new Properties();try {proJsdk.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("jdbc.properties"));} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} }//获取public Object ReturnJSDKapi(String url){String xml = HttpXmlClient.get("https://api./cgi-bin/ticket/getticket?access_token="+ Test.access_token +"&type=jsapi");JSONObject jsonMap = JSONObject.fromObject(xml);Map<String, String> map = new HashMap<String, String>();Iterator<String> it = jsonMap.keys();while(it.hasNext()) {String key = (String) it.next(); String u = jsonMap.get(key).toString();map.put(key, u); }String jsapi_ticket = map.get("ticket");//获取签名signatureString noncestr = UUID.randomUUID().toString();String timestamp = Long.toString(System.currentTimeMillis() / 1000);String str = "jsapi_ticket=" + jsapi_ticket +"&noncestr=" + noncestr +"&timestamp=" + timestamp +"&url=" + url;//sha1加密String signature = HttpXmlClient.SHA1(str);JsdkParam jsdkParam=new JsdkParam();jsdkParam.setAppId(proJsdk.getProperty("appid"));jsdkParam.setNonceStr(noncestr);//自定义随机字符串jsdkParam.setSignature(signature);//签名jsdkParam.setTimestamp(timestamp);//时间截return jsdkParam;}public String returnAccesstoken() {StringBuilder stringBuilder=new StringBuilder("https://api./cgi-bin/token?grant_type=client_credential&appid=");stringBuilder.append(proJsdk.getProperty("appid"));stringBuilder.append("&secret=");stringBuilder.append(proJsdk.getProperty("appsecret"));String xml = HttpXmlClient.get(stringBuilder.toString());JSONObject jsonMap = JSONObject.fromObject(xml);Map<String, String> map = new HashMap<String, String>();Iterator<String> it = jsonMap.keys();while(it.hasNext()) {String key = (String) it.next(); String u = jsonMap.get(key).toString();map.put(key, u); }//获取access_tokenString access_token = map.get("access_token");return access_token;}}

3)、刷新access_token(如果需要)

这个比较简单就不细说了。

由于access_token拥有较短的有效期,当access_token超时后,可以使用refresh_token进行刷新,refresh_token有效期为30天,当refresh_token失效之后,需要用户重新授权。

获取第二步的refresh_token后,请求以下链接获取access_token:

https://api./sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN

4)、拉取用户信息

/*** 获取用户信息* @param accessToken 接口访问凭证* @param openId 用户标识* @return WeixinUserInfo*/public static WeixinUserInfo getUserInfo(String accessToken, String openId) {WeixinUserInfo weixinUserInfo = null;// 拼接请求地址String requestUrl = "https://api./cgi-bin/user/info?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 {weixinUserInfo = new WeixinUserInfo();// 用户的标识weixinUserInfo.setOpenId(jsonObject.getString("openid"));// 关注状态(1是关注,0是未关注),未关注时获取不到其余信息weixinUserInfo.setSubscribe(jsonObject.getInt("subscribe"));// 用户关注时间weixinUserInfo.setSubscribeTime(jsonObject.getString("subscribe_time"));// 昵称weixinUserInfo.setNickname(jsonObject.getString("nickname"));// 用户的性别(1是男性,2是女性,0是未知)weixinUserInfo.setSex(jsonObject.getInt("sex"));// 用户所在国家weixinUserInfo.setCountry(jsonObject.getString("country"));// 用户所在省份weixinUserInfo.setProvince(jsonObject.getString("province"));// 用户所在城市weixinUserInfo.setCity(jsonObject.getString("city"));// 用户的语言,简体中文为zh_CNweixinUserInfo.setLanguage(jsonObject.getString("language"));// 用户头像weixinUserInfo.setHeadImgUrl(jsonObject.getString("headimgurl"));} catch (Exception e) {if (0 == weixinUserInfo.getSubscribe()) {log.error("用户{}已取消关注", weixinUserInfo.getOpenId());} else {int errorCode = jsonObject.getInt("errcode");String errorMsg = jsonObject.getString("errmsg");log.error("获取用户信息失败 errcode:{} errmsg:{}", errorCode, errorMsg);}}}return weixinUserInfo;}public static void main(String args[]) {// 获取接口访问凭证//String accessToken = CommonUtil.getToken("wx25bbb38cfce0501c", "f7c03720d6fbbf2204fdd0bb084b12ca").getAccessToken();/*** 获取用户信息*///WeixinUserInfo user = getUserInfo(accessToken, "oTmV204lISF-epwei1n-_hqy07zs");System.out.println("OpenID:" + user.getOpenId());System.out.println("关注状态:" + user.getSubscribe());System.out.println("关注时间:" + user.getSubscribeTime());System.out.println("昵称:" + user.getNickname());System.out.println("性别:" + user.getSex());System.out.println("国家:" + user.getCountry());System.out.println("省份:" + user.getProvince());System.out.println("城市:" + user.getCity());System.out.println("语言:" + user.getLanguage());System.out.println("头像:" + user.getHeadImgUrl());}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。