前言:

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. 不能安装64位office提示已安装32位的

    安装64位office办公软件的时候提示已经安装32位的office办公软件所以无法继续安装,但实际上之前安装的32位的office办公软件已经卸载了.问题现象截图如下: 从问题描述中,我们其实已经能 ...

  2. Android Studio 快捷键、Debug的使用

    https://blog.csdn.net/q908555281/article/details/49331371 1.快捷键      个人习惯常用快捷键      在Eclipse中常用的快捷键 ...

  3. (转)Introductory guide to Generative Adversarial Networks (GANs) and their promise!

    Introductory guide to Generative Adversarial Networks (GANs) and their promise! Introduction Neural ...

  4. map数据结构

    学习map的这种ES6新加的数据结构.在一些构建工具中是非常喜欢使用map这种数据结构来进行配置的,因为map是一种灵活,简单的适合一对一查找的数据结构.我们知道的数据结构,已经有了json和set. ...

  5. 【NOI 2016】优秀的拆分

    Problem Description 如果一个字符串可以被拆分为 \(AABB\) 的形式,其中 \(A\) 和 \(B\) 是任意非空字符串,则我们称该字符串的这种拆分是优秀的. 例如,对于字符串 ...

  6. EDCheckPrefabRef

    using UnityEngine;using System.Collections;using UnityEditor;using UnityEngine.UI;using System.Refle ...

  7. 蚂蚁金服“定损宝”现身AI顶级会议NeurIPS

    小蚂蚁说: 长期以来,车险定损(通过现场拍摄定损照片确定车辆损失,以作为保险公司理赔的依据)是车险理赔中最为重要的操作环节.以往传统保险公司的车险处理流程,一般为报案.现场查勘.提交理赔材料.审核.最 ...

  8. ERROR: child process failed, exited with error number 100

    [root@localhost ~]# mongod --dbpath=/usr/local/mongodb/data --logpath=/usr/local/mongodb/logs --loga ...

  9. python+win32+ie浏览器操作 TypeError: getElementById() takes exactly 1 argument (2 given)

    使用body操作 # -*- coding:UTF- -*- import win32com.client from time import sleep second=win32com.client. ...

  10. ppython的移位操作

    因为要将js的一个签名算法移植到python上,遇到一些麻烦. int无限宽度,不会溢出 算法中需要用到了32位int的溢出来参与运算,但是python的int是不会溢出的,达到界限后会自己转为lon ...