前言:

1,在微信公众号请求用户网页授权之前,开发者需要先到公众平台官网中的“开发 - 接口权限 - 网页服务 - 网页帐号 - 网页授权获取用户基本信息”的配置选项中,修改授权回调域名。

请注意,这里填写的是域名,而不是URL,因此请勿加 http:// 等协议头。(例:xxx.com

2,scope参数

(1)以snsapi_base为scope发起的网页授权,是用来获取进入页面的用户的openid的,并且是静默授权并自动跳转到回调页的。用户感知的就是直接进入了回调页(往往是业务页面)

(2)以snsapi_userinfo为scope发起的网页授权,是用来获取用户的基本信息的。但这种授权需要用户手动同意,并且由于用户同意过,所以无须关注,就可在授权后获取该用户的基本信息。

(3)对于已关注公众号的用户,如果用户从公众号的会话或者自定义菜单进入本公众号的网页授权页,即使是scope为snsapi_userinfo,也是静默授权,用户无感知

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

正文:

官方流程:

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

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

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

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

而我的流程为:获取code —code换取openID—openID获取用户基本信息(官方的我还没试过,我的流程目前也是没问题的)

//微信公众号 OAuth2.0网页授权 地址
public static String OAuth_Url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=code&scope=snsapi_base&state=123#wechat_redirect"; @RequestMapping(value = "home", method = RequestMethod.GET)
public String home(ServletResponse response, Model model, String code) throws IOException
{
  HttpServletResponse httpres = (HttpServletResponse) response;
  String openId = CookieHelper.getByName(Config.OPEN_ID);//获取cookie中的openId   if(StringUtils.isEmpty(openId) && StringUtils.isEmpty(code)){
    httpres.sendRedirect(String.format(OAuth_Url, appId, String.format(Config.domain()+"/studio/doctorHome/%s/%s/%s", platform, type, doctorId)));//获取code
  }else{
    WeixinUserInfo wxInfo = getWxInfo(code);//WeixinUserInfo类第七章有
    unionId = wxInfo.getUnionId();
    openId = wxInfo.getOpenId();
  }   return "home";
} public static WeixinUserInfo getWxInfo(String code) throws IOException
{
  WeixinUserInfo wxInfo = new WeixinUserInfo();   //获取用户的微信信息
  String openId = CookieHelper.getByName(OPEN_ID);
  if(!StringUtils.isEmpty(code)){
    openId = WeixinUtil.getOpenIdByCode(appid, appSecret, code);//code换取openID
  }
  String access_token = WeixinUtil.getAccessToken(fileName, appid, appSecret);//该方法第二章有
  wxInfo = WeixinUtil.getUserInfo(access_token, openId);//openID获取用户基本信息,该方法第七章有
  //存cookie
  CookieHelper.addCookie(OPEN_ID, wxInfo.getOpenId(), Config.COOKIE_AGE);   return wxInfo;
}

WeixinUtil.getOpenIdByCode

public static String getOpenIdByCode(String appId, String appSecret, String code) {
String openID = "";
String openid_info_url = "https://api.weixin.qq.com/sns/oauth2/access_token";
String jsonStrOpenId = HttpRequest.sendGet(openid_info_url,
"appid=" + appId + "&secret=" + appSecret + "&code=" + code
+ "&grant_type=authorization_code");
JSONObject OpenIdJson = JSONObject.fromObject(jsonStrOpenId);
openID = (String) OpenIdJson.get("openid");
return openID;
}

5,优化——拦截器获取openId,这样代码比较简洁

拦截器

@Bean
public FilterRegistrationBean<WxFilter> buildAFilter() {
FilterRegistrationBean<WxFilter> filterRegistrationBean = new FilterRegistrationBean<>();
filterRegistrationBean.setOrder(2);
filterRegistrationBean.setFilter(new WxFilter());
filterRegistrationBean.setName("WxFilter");
filterRegistrationBean.addUrlPatterns("/wx/*");
return filterRegistrationBean;
}

拦截实现

public class WxFilter implements Filter {
private static Logger logger = LoggerFactory.getLogger(WxFilter.class);
private WxBaseService wxBaseService;
private RedisDao redisDao; public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws ServletException, IOException
{
logger.info("enter wx filter"); HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res; String openId = this.getOpenId(request, response); if(openId != null){ //只有在需要向微信获取code时才会为null
if (!redisDao.hasKey(openId)) {
//视情况而定,这里其实就是以openId为主键,将一些常用信息查询出来,存到Redis,便于以后使用
//建议主键为前缀+openId,例:studio_xxxx
logger.info("在Filter中把用户信息存储到redis中");
BaseUserInfo user = this.wxBaseService.BaseUserInfo(openId);
redisDao.setKey(openId, new ObjectMapper().writeValueAsString(user));
} chain.doFilter(request, response);
}
} //填充用户信息
private String getOpenId(HttpServletRequest request, HttpServletResponse response) throws IOException
{
String url = HttpHelper.getParamUrl(request);
String code = request.getParameter("code"); String openId = CookieHelper.getByName(Config.COOKIE_OPEN_ID); //获取cookie //cookie失效或者点击菜单进入系统,重新获取用户的微信信息
//点击菜单进入系统(在首页重新拉取数据)——因为用户切换微信号,可能会存在缓存
if(StringUtils.isEmpty(openId)
|| url.contains("wx/studioDoctor/article/index?frommenu")
|| url.contains("wx/qrcode_rank/index?frommenu"))
{
if(StringUtils.isEmpty(code)){
logger.info("WxFilter redirect");
url = String.format(WxConfig.OAUTH_URL, Config.APP_ID, url);
response.sendRedirect(url);
return null; //redirect执行过程中会往下走,故返回空值
}else{
openId = WeixinUtil.getOpenIdByCode(Config.APP_ID, Config.APP_SECRET, code);
request.setAttribute(Config.COOKIE_OPEN_ID, openId);
CookieHelper.addCookie(response, Config.COOKIE_OPEN_ID, openId, Config.COOKIE_AGE);
}
} logger.info("WxFilter openId: " + openId);
return openId;
} //拦截器中服务层方法访问不到,需做处理
public void init(FilterConfig config) throws ServletException
{
ServletContext context = config.getServletContext();
ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(context);
wxBaseService = (WxBaseService) ctx.getBean(WxBaseService.class);
redisDao = (RedisDao) ctx.getBean(RedisDao.class);
} public void destroy() {
}
}

【微信公众号开发】【8】网页授权获取用户基本信息(OAuth 2.0)的更多相关文章

  1. 微信 网页授权获取用户基本信息(OAuth 2.0)

    // 相关设置 $APPID = ""; $AppSecret = ""; $html = ""; // 拼接 URL // 跳转该连接 获 ...

  2. ASP.NET MVC4 微信公众号开发之网页授权(二):通过公众号AppID(应用ID)和AppSecret(应用密钥)取得网页授权openid

    ASP.NET MVC4 微信公众号开发之网页授权(一):搭建基础环境 通过了上一篇文章我们已经搭建好了基础开发大环境,现在打开开发环境这里我用的是 vs2013,通过如下方式: 拼接请求链接重定向到 ...

  3. ASP.NET MVC4 微信公众号开发之网页授权(一):搭建基础环境

    首先你得注册并认证一个个人或企业的微信公众号===服务号从而确保获得以下接口权限: 然后打开公众号设置里的功能设置里找到业务域名和网页授权域名分别填上你的域名(注:已备案的域名),如下图所示: 到这里 ...

  4. C#微信公众号开发之网页授权oauth2.0获取用户基本信息(一)

    咨询 请加 QQ::QQ群: 在微信里面,非认证的公众号账号,只能通过在微信回复菜单单击等事件获取openid,但是认证的公众账号(之前认证的订阅号是不可以的,现在新开放了政府媒体机构的认证订阅号)可 ...

  5. 微信公众号开发之网页中及时获取当前用户Openid及注意事项

    目录 (一)微信公众号开发之VS远程调试 (二)微信公众号开发之基础梳理 (三)微信公众号开发之自动消息回复和自定义菜单 (四)微信公众号开发之网页授权获取用户基本信息 (五)微信公众号开发之网页中及 ...

  6. 第八篇 :微信公众平台开发实战Java版之如何网页授权获取用户基本信息

    第一部分:微信授权获取基本信息的介绍 我们首先来看看官方的文档怎么说: 如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑. 关于网页授权回调域 ...

  7. 微信公众平台开发实战Java版之如何网页授权获取用户基本信息

    第一部分:微信授权获取基本信息的介绍 我们首先来看看官方的文档怎么说: 如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑. 关于网页授权回调域 ...

  8. 微信公众号开发(三)获取access_token

    微信公众号开发(三)获取access_token 1.说明 access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token.开发者需要进行妥善保存.acce ...

  9. 微信网页授权获取用户基本信息--PHP

    现在就说说怎么通过网页授权获取用户基本信息(国家,省,市,昵称)等. 必要条件: 1)公众号认证 2)有网页授权获取用户基本信息的权限接口 注意:最近有朋友说:在公众平台申请的测试号,会出现无法取到用 ...

随机推荐

  1. C# DataTable.Compute()用法

    DataTable.Compute()用法 2010-04-07 11:28 一.DataTable.Compute()方法說明如下 作用:          计算用来传递筛选条件的当前行上的给定表达 ...

  2. SQL中的字母的大小写转换

    http://blog.csdn.net/dxb601/article/details/52086830 update 表名 set 字段名a= Lower(字段a)   2.将小写字母转化成大写字母 ...

  3. 今天就整一个bug了

    BeanPostProcessor加载次序及其对Bean造成的影响分析 SSM整合出现not found for dependency: expected at least 1 bean which ...

  4. Unity3D学习笔记(三十六):Shader着色器(3)- 光照

    光照模型:用数学的方法模拟现实世界中的光照效果.   场景中模型身上的光反射到相机中的光线: 1.漫反射:产生明暗效果 2.高光反射:产生镜面反射,物体中有最亮且比较耀眼的一部分 3.自发光: 4.环 ...

  5. ZOJ 3987 Numbers(Java枚举)

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3987 题意:给出一个数n,现在要将它分为m个数,这m个数相加起来必须等于n ...

  6. 草珊瑚理解IFC(inline formatting context)

    1. 认识字体font-family 字体渲染的实际高度, 由字体本身的设置(升部ascender,降部descender,大写字母高度Capital Height,小写字母高度X-Height等等) ...

  7. 【Java】【泛型】

    泛型的优点使⽤泛型有下⾯⼏个优点:1.类型安全2.向后兼容3.层次清晰4.性能较⾼,⽤GJ(泛型JAVA)编写的代码可以为java编译器和虚拟机带来更多的类型信息,这些信息对java程序做进⼀步优化提 ...

  8. Python 模块(module)

    模块(module)也是为了同样的目的.在Python中,一个.py文件就构成一个模块.通过模块,你可以调用其它文件中的程序. first.py def laugh(): print "Ha ...

  9. EditText取消焦点

    EditText取消焦点: 在父容器添加: android:focusable="true" android:focusableInTouchMode="true&quo ...

  10. 力扣(LeetCode)7.整数反转

    给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例 1: 输入: 123 输出: 321 示例 2: 输入: -123 输出: -321 示例 3: 输入: 120 输出: ...