前言:

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. P2519 [HAOI2011]problem a

    思路 神仙思路,就差一步就能想出来了... 看到第i个人给出的条件,发现有\(a_i\)个大于,\(b_i\)个小于并不好处理 考虑把条件转化成第i个人对应的排名处理,设第i个人的排名为\(a_i+1 ...

  2. HDU 4918 Query on the subtree(动态点分治+树状数组)

    题意 给定一棵 \(n\) 个节点的树,每个节点有点权.完成 \(q\) 个操作--操作分两种:修改点 \(x\) 的点权.查询与 \(x\) 距离小于等于 \(d\) 的权值总和. \(1 \leq ...

  3. Docker Engine SDKs and API 的开发1

    Develop with Docker Engine SDKs and API Docker provides an API for interacting with the Docker daemo ...

  4. .Net Core项目在Docker上运行,内存占用过多导致pods重启的问题

    默认情况下,.NET Core应用的内存回收模式是Server模式,这种情况下,内存占用和服务器核心数量有关,一半占用量比较大. 我们的应用目前吞吐量都不大,可以采用Workstation模式,这种模 ...

  5. 【译】第13节---数据注解-Required

    原文:http://www.entityframeworktutorial.net/code-first/required-attribute-dataannotations-in-code-firs ...

  6. webpack插件配置(二)- HtmlWebpackPlugin

    作用 简化Html文件的创建,以便为你的webpack bundle包提供服务.这对于在文件名中包含每次会随着编译而发生变化的hash的webpack bundle尤其有用.插件可以生成一个HTML文 ...

  7. JS定时器时间日期钟表

    window.onload=function(){ setTime(); setInterval('setTime()',1000); } function checkTime(n){ if(n< ...

  8. React Native 炫酷的动画库 实现任何AE动画 lottie-react-native

    lottie-react-native 传送门 1.npm i --save lottie-react-native 2.react-native link lottie-ios 3.react-na ...

  9. JSON平铺功能的实现(JS操作JSON数据)

    一.什么是JSON平铺 JSON平铺分成两种: 平铺的json转树结构的json 例如: { a: 'value', b: 'b1.value' } // 转换成=> { a: 'value', ...

  10. hdu 1115 Lifting the Stone 多边形的重心

    Lifting the Stone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...