前言:

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. 【前端开发工具】WijmoJS 2018 v3 正式发布,全面支持Angular7

    WijmoJS(前端开发工具包)2018年度第三个大版本已经正式发布,本次更新除了全面支持Angular7之外,还允许用户使用Web Workers在前端更高效地导出PDF.智能的分组表头属性.全新的 ...

  2. Lintcode27-Reverse 3-digit Integer

    Reverse a 3-digit integer. Example Example 1: Input: number = 123 Output: 321 Example 2: Input: numb ...

  3. python爬虫训练——爬poj题目

    首先要解决的就是不同的题目在不同的页上,也就是要实现翻页功能,自动获取所要爬取的地址,通过分析可以得出不同的页面也就是volume=后面的数字不同 所以我们可以用re模块来替换即可: new_url ...

  4. Git、GitHub、GitLab三者之间的联系以及区别

    在讲区别以及联系之前先简要的介绍一下,这三者都是什么(本篇文章适合刚入门的新手,大佬请出门左转) 1.什么是 Git? Git 是一个版本控制系统. 版本控制是一种用于记录一个或多个文件内容变化,方便 ...

  5. 前端UI框架总结

    H-ui 前端框架 架起设计与后端的桥梁轻量级前端框架,简单免费,兼容性好,服务中国网站. 官网:http://www.h-ui.net/H-ui.admin.shtml github下载:https ...

  6. Echarts 修改字体样色 X、Y轴

    1.雷达图修改字体颜色 polar: [ { name:{ show: true, formatter: null, textStyle: { //设置颜色 color: '#109cad' } }, ...

  7. Spring数据库连接池依赖

    <!-- https://mvnrepository.com/artifact/c3p0/c3p0 --> <dependency> <groupId>c3p0&l ...

  8. Integer的最大值

    来自:https://blog.csdn.net/qq_33611068/article/details/77369050 有这样一道题: 编程测试,遍历 0 到 int所能表示最大的正数,将消耗的时 ...

  9. eclipse中启动 Eclipse 弹出“Failed to load the JNI shared library jvm.dll”错误

    原因1:给定目录下jvm.dll不存在. 对策:(1)重新安装jre或者jdk并配置好环境变量.(2)copy一个jvm.dll放在该目录下. 原因2:eclipse的版本与jre或者jdk版本不一致 ...

  10. 贪心 —— 今年暑假不AC

    贪心基本题, 有助于理解贪心算法的思想 #include <cstdio> #include <algorithm> using namespace std; struct P ...