【微信公众号开发】【8】网页授权获取用户基本信息(OAuth 2.0)
前言:
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)的更多相关文章
- 微信 网页授权获取用户基本信息(OAuth 2.0)
// 相关设置 $APPID = ""; $AppSecret = ""; $html = ""; // 拼接 URL // 跳转该连接 获 ...
- ASP.NET MVC4 微信公众号开发之网页授权(二):通过公众号AppID(应用ID)和AppSecret(应用密钥)取得网页授权openid
ASP.NET MVC4 微信公众号开发之网页授权(一):搭建基础环境 通过了上一篇文章我们已经搭建好了基础开发大环境,现在打开开发环境这里我用的是 vs2013,通过如下方式: 拼接请求链接重定向到 ...
- ASP.NET MVC4 微信公众号开发之网页授权(一):搭建基础环境
首先你得注册并认证一个个人或企业的微信公众号===服务号从而确保获得以下接口权限: 然后打开公众号设置里的功能设置里找到业务域名和网页授权域名分别填上你的域名(注:已备案的域名),如下图所示: 到这里 ...
- C#微信公众号开发之网页授权oauth2.0获取用户基本信息(一)
咨询 请加 QQ::QQ群: 在微信里面,非认证的公众号账号,只能通过在微信回复菜单单击等事件获取openid,但是认证的公众账号(之前认证的订阅号是不可以的,现在新开放了政府媒体机构的认证订阅号)可 ...
- 微信公众号开发之网页中及时获取当前用户Openid及注意事项
目录 (一)微信公众号开发之VS远程调试 (二)微信公众号开发之基础梳理 (三)微信公众号开发之自动消息回复和自定义菜单 (四)微信公众号开发之网页授权获取用户基本信息 (五)微信公众号开发之网页中及 ...
- 第八篇 :微信公众平台开发实战Java版之如何网页授权获取用户基本信息
第一部分:微信授权获取基本信息的介绍 我们首先来看看官方的文档怎么说: 如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑. 关于网页授权回调域 ...
- 微信公众平台开发实战Java版之如何网页授权获取用户基本信息
第一部分:微信授权获取基本信息的介绍 我们首先来看看官方的文档怎么说: 如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑. 关于网页授权回调域 ...
- 微信公众号开发(三)获取access_token
微信公众号开发(三)获取access_token 1.说明 access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token.开发者需要进行妥善保存.acce ...
- 微信网页授权获取用户基本信息--PHP
现在就说说怎么通过网页授权获取用户基本信息(国家,省,市,昵称)等. 必要条件: 1)公众号认证 2)有网页授权获取用户基本信息的权限接口 注意:最近有朋友说:在公众平台申请的测试号,会出现无法取到用 ...
随机推荐
- CF983B XOR-pyramid
设\(xorx[l][r]\)表示题目中\(f(l,r)\)的值,则可以得出 \[ xorx[i][j]=xorx[i][j-1] \oplus xorx[i+1][j] \] 设\(maxx[l][ ...
- Attribute2Image --- Conditional Image Generation from Visual Attributes 论文笔记
Attribute2Image --- Conditional Image Generation from Visual Attributes Target: 本文提出一种根据属性生成图像的产生式模 ...
- 【译】第19节---数据注解-NotMapped
原文:http://www.entityframeworktutorial.net/code-first/notmapped-dataannotations-attribute-in-code-fir ...
- 前端UI框架总结
H-ui 前端框架 架起设计与后端的桥梁轻量级前端框架,简单免费,兼容性好,服务中国网站. 官网:http://www.h-ui.net/H-ui.admin.shtml github下载:https ...
- JqGrid 列时间格式化
{name:'createTime',index:'createTime',label:"创建时间", editable:false,formatter:"date&qu ...
- Python 安装 lxml 插件
1.下载 lxml 地址:https://pypi.python.org/pypi/lxml/3.8.0#downloads 我用的是python 3.6,我下载了 lxml-3.8.0-cp36- ...
- Spring-Mybatis依赖
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --><dependency> <groupId& ...
- 记录flask使用模板时出现的“Internal Server Error”错误
在看<Flask Web开发实战:入门.进阶与原理解析(李辉著 )>时照着书上的代码抄了一遍,然后运行时发现一直出现以下的错误 书上的源代码如下 watchlist.html <he ...
- 《剑指offer》第五十九题(队列的最大值)
// 面试题59(二):队列的最大值 // 题目:给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值.例如, // 如果输入数组{2, 3, 4, 2, 6, 2, 5, 1}及滑动窗口的大小 ...
- lambda表达式底层处理机制
为了支持函数式编程,Java 8引入了Lambda表达式,那么在Java 8中到底是如何实现Lambda表达式的呢? Lambda表达式经过编译之后,到底会生成什么东西呢? 在没有深入分析前,让我们先 ...