微信OAuth授权获取用户OpenId-JAVA(个人经验)
个人微信小程序 可扫码体验
本文更新有可能先在开源中国。地址为:https://my.oschina.net/xshuai/blog/293458
https://open.weixin.qq.com/ 这个是授权登陆自己网站的和我的这个是有区别的。
带评论昵称 才同意加QQ
鉴于老是有人问我。就更新一下了。
更新时间 2016年10月18日
修改了测试号权限不足导致授权获取信息抛异常的问题。
服务器暂时有问题。想查看效果。在周一到周五10:00-17:00查看即可。
可以扫描关注查看效果。这个是测试号。服务器有限。不要恶意攻击
http://mp.weixin.qq.com/wiki这个是官网的接口文档
微信授权获取用户openid-JAVA
开发微信测试需要用到的代码和jar包都在里面 包括核心代码
源码在这里。https://zb.oschina.net/market/opus/1444646_161 维护服务器。一份5元。自愿购买
链接: https://zb.oschina.net/market/opus/1444646_161
注意:授权把回调域名配置了。(只需要域名就行 例如:www.baidu.com)
没有配置回调域名有问题就别问我了。
拉取用户信息(需scope为 snsapi_userinfo)
本作者是用菜单的方式引导用户进入点击获取信息的。不会创建菜单的自己去看官网API。或者搜索教程。先把官网文档稍微看下。知道自己需要配置的域名。等一些参数。点个赞都不给。就什么问题也问。还有。我工作不是专门做微信这方面的。我也需要忙我自己的工作内容。
如果网页授权作用域为snsapi_userinfo,则此时开发者可以通过access_token和openid拉取用户信息了。
前提设置一个菜单调用授权接口的URL获取code
修改相应的参数后的链接(只是一个例子) 创建一个view类型的菜单。url如下:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx2d39c6c31ed5f199&redirect_uri=http://zxshuai.imwork.net/weixin/oauth.do &response_type=code&scope=snsapi_userinfo&state=123#wechat_redirect
截图示意(最后一张上传于2016年10月18日)
第一步:用户同意授权,获取code 引导用户进入授权的URL 修改一些参数
在确保微信公众账号拥有授权作用域(scope参数)的权限的前提下(服务号获得高级接口后,默认带有scope参数中的snsapi_base和snsapi_userinfo),引导关注者打开如下页面:本作者用菜单的方式引导用户点击进入。
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
我的代码如下:一个Servlet请求 获取code
/*** 根据code取得openId* * @param appid 公众号的唯一标识* @param secret 公众号的appsecret密钥* @param code code为换取access_token的票据 * @return */public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//参数String code = request.getParameter("code");if(null != code && !"".equals(code)){log.info("==============[OAuthServlet]获取网页授权code不为空,code="+code);//根据code换取openIdOAuthInfo oa = WeixinUtil.getOAuthOpenId(Constants.appId,Constants.appSecret,code);UserInfo info = WeixinUtil.getUserInfo(oa.getAccessToken(), oa.getOpenId());if(!"".equals(oa) && null != oa){request.setAttribute("openid", oa.getOpenId());request.setAttribute("nickname", info.getNickname());request.getRequestDispatcher("/index.jsp").forward(request, response);}else{log.info("==============[OAuthServlet]获取网页授权openId失败!");}}else{log.info("==============[OAuthServlet]获取网页授权code失败!");}}
替换相应的APPID APPSECRET SCOPE
第二步:通过code换取网页授权access_token 这里的access_token与基础获取的access_token不同
获取code后,请求以下链接获取access_token:
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
具体做法与上面基本一致。更换相对应的值。需要注意的是code可以写一个Servlet获取。String code = request.getParameter("code");get/post都可以。
这样子就会返回一下json格式数据
{"access_token":"ACCESS_TOKEN","expires_in":7200,"refresh_token":"REFRESH_TOKEN","openid":"OPENID","scope":"SCOPE"
}
具体代码如下。获取的code换取的access_token
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code;
public static OAuthInfo getOAuthOpenId(String appid, String secret, String code ) {OAuthInfo oAuthInfo = null;String o_auth_openid_url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code;";String requestUrl = o_auth_openid_url.replace("APPID", appid).replace("SECRET", secret).replace("CODE", code);JSONObject jsonObject = httpRequest(requestUrl, "GET", null);//oAuthInfo是作者自己把那几个属性参数写在一个类里面了。// 如果请求成功if (null != jsonObject) {try {oAuthInfo = new OAuthInfo();oAuthInfo.setAccessToken(jsonObject.getString("access_token"));oAuthInfo.setExpiresIn(jsonObject.getInt("expires_in"));oAuthInfo.setRefreshToken(jsonObject.getString("refresh_token"));oAuthInfo.setOpenId(jsonObject.getString("openid"));oAuthInfo.setScope(jsonObject.getString("scope"));} catch (JSONException e) {oAuthInfo = null;// 获取token失败log.error("网页授权获取openId失败 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg"));}}return oAuthInfo;}
根据上面代码获取的access_token openid 然后再请求获取userinfo的接口。就能得到微信用户的所有信息了。
具体返回如下。获取用户信息代码不再写。
请求获取用户信息的接口地址
{"sex":1,
"nickname":"小帅",
"privilege":[],
"province":"北京",
"openid":"o2VKNju8JqCeGVoEWJ1S8Ue_up8E",
"language":"zh_CN",
"headimgurl":"http://wx.qlogo.cn/mmopen/ribqo6CmxxhyfrokJWjVAedZzl590B4HAbribNVS3CQvplHp8KgmH1kIfqpM4Ek5uTr0lFW8yMDjfZrWLtvjjKLXu1H5icSfRBl/0",
"country":"中国",
"city":"海淀"}
这就获取到用户的openid。应用授权作用域,snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid),snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且,即使在未关注的情况下,只要用户授权,也能获取其信息)我自己用的作用域为snsapi_userinfo。用户点击跳转页面为
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
替换链接里面的大写字母的信息为你自己公众号的。state可以不改。
写一个Servlet专门接收传递过来的code。进行相应的操作。
获取用户基本信息接口
接口调用请求说明
http请求方式: GET https://api.weixin.qq.com/cgi-bin/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
最新更新。2016年9月9日 鉴于好多人只能获取到openid但拿不到用户信息。那就更新一下。
通过openid是可以直接再去获取到用户信息的。前提也是用户关注了公众号
{"subscribe": 1,"openid": "osdhfjkdsfh78sdjkljljkkj","nickname": "小帅帅丶","sex": 1,"language": "zh_CN","city": "北京","province": "北京","country": "中国","headimgurl": "http://wx.qlogo.cn/mmopen/Kkv3HV30gbEZmoo1rTrP4UjRRqzsibUjT9JClPJy3gzo0NkEqzQ9yTSJzErnsRqoLIct5NdLJgcDMicTEBiaibzLn34JLwficVvl6/0","subscribe_time": 1389684286 }
参数说明
参数 | 说明 |
---|---|
subscribe | 用户是否订阅该公众号标识,值为0时,代表此用户没有关注该公众号,拉取不到其余信息。 |
openid | 用户的标识,对当前公众号唯一 |
nickname | 用户的昵称 |
sex | 用户的性别,值为1时是男性,值为2时是女性,值为0时是未知 |
city | 用户所在城市 |
country | 用户所在国家 |
province | 用户所在省份 |
language | 用户的语言,简体中文为zh_CN |
headimgurl | 用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空 |
subscribe_time | 用户关注时间,为时间戳。如果用户曾多次关注,则取最后关注时间 |
错误时微信会返回错误码等信息,JSON数据包示例如下(该示例为AppID无效错误):
{"errcode":40013,"errmsg":"invalid appid"}
具体代码 获取到openid代码在上面。都不愿意资助一下。就不要加QQ咨询所有的问题。
/*** 网页授权获取用户信息* @param access_token 授权得到的access_token* @param openid 授权获取的openid* @return*/public static UserInfo getUserInfo(String access_token,String openid ) {UserInfo userInfo = null;String requestUrl = userinfo_url.replace("ACCESS_TOKEN", access_token).replace("OPENID", openid);System.out.println("==============requestUrl:"+requestUrl+"==============");JSONObject jsonObject = httpRequest(requestUrl, "GET", null);System.out.println("==============jsonObject:"+jsonObject+"==============");// 如果请求成功if (null != jsonObject) {try {userInfo = new UserInfo();userInfo.setNickname(jsonObject.getString("nickname"));//等一系列的信息} catch (JSONException e) {userInfo = null;// 获取token失败log.error("网页授权获取openId失败 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg"));}}return userInfo;}
}
1.OAuthServlet 对code进行access——token的验证
2.一个Servlet的方法调用接口地址。得到相应code。
3.OAuthInfo 返回数据相应的参数的PO类。set/get方法
4.WeiXinUtil添加一个方法 publicOAuth getOAuthInfo(String appid, String secret, String code)得到json格式。并使用JSONObject读取出自己想要的数据。
https://open.weixin.qq.com/ 这个是授权登陆自己网站的和我的这个是有区别的。
http://www.oschina.net/code/snippet_1444646_47662 HTTPREQUEST方法、
个人微博 http://weibo.com/u/2205636212
个人博客 http://my.oschina.net/xshuai/blog
微信/QQ 783021975请先留言说明您!否则不加!
个人联盟 http://www.bengbeng.com/?sid=687095
微信OAuth授权获取用户OpenId-JAVA(个人经验)相关推荐
- 微信OAuth授权获取用户OpenId
https://open.weixin.qq.com/ 这个是授权登陆自己网站的和我的这个是有区别的. 博客最新更改在这里https://my.oschina.net/xshuai/blog/2934 ...
- 微信OAuth授权获取用户OpenId-JAVA
开源中国http://my.oschina.net/xshuai/blog/293458也是本作者 https://open.weixin.qq.com/ 这个是授权登陆自己网站的和我的这个是有区别的 ...
- 微信h5授权获取用户openId的方法和步骤,用于用户登录和注册
微信公众号的配置和专业名词就不介绍了,不懂的问度娘,我就直接上代码 点击下载完整demo 先说一下我的demo放的位置: 微信H5授权登录分两种: ① 静默授权:snsapi_base,没有弹窗,只 ...
- 微信网页授权获取用户openid及用户信息
$code = $_GET["code"];//获取code $appid="xxxx";//公众号appid $APPSECRET="xxx&quo ...
- 微信公众号授权获取用户OpenID和UnionId然后发生消息通知
微信公众号授权获取用户OpenID和UnionId然后发生消息通知 1.获取微信公众号code 1.微信公众拿取公众号appid和appSecret 2.网页域名授权,这里的域名拼接上html所在位置 ...
- 微信h5静默、非静默授权获取用户openId的方法和步骤
微信h5静默.非静默授权获取用户openId的方法和步骤: 一.openId是什么? openId是用户在当前公众号下的唯一标识('身份证'),就是说通过这个openId,就能区分在这个公众号下具体是 ...
- Spring Boot 微信-网页授权获取用户信息
微信-验证服务器有效性 微信-网页授权获取用户信息 网页授权获取用户信息步骤 第一步:用户同意授权,获取code 第二步:通过code换取网页授权access_token 第三步:拉取用户信息(需sc ...
- 微信网页授权获取用户基本信息 --- 20/03/16
ThinkPHP5实现微信网页授权获取用户基本信息 本次使用的appID与appSecret为公众号 一:准备工作 登录微信公众平台,左侧菜单下拉至开发选中基本配置 启用开发者密码(AppSecret ...
- PHP开发之-微信网页授权获取用户基本信息
如何通过网页授权获取用户基本信息(国家,省,市,昵称)相关信息 必要条件: 1)公众号认证 2)有网页授权获取用户基本信息的权限接口 注意:最近有朋友说:在公众平台申请的测试号,会出现无法取到用户信息 ...
最新文章
- jQuery EasyUI DataGrid 分页 FOR ASP.NET
- 如何在html中写javascript代码,如何在本地html代码中使用javascript脚本
- mpvue 从零开始 女友的衣装 1 pages
- python中的类怎样理解_理解Python数据类:Dataclass fields 的概述(下)
- ggplot2箱式图两两比较_第十九章_使用ggplot2进行高级绘图
- [Error] iostream.h: No such file or directory的解决办法
- BZOJ2595: [Wc2008]游览计划(斯坦纳树,状压DP)
- 会议之后,对应内容的再次确认
- 使用Adobe Acrobat提取PDF签章图片
- 在机器学习、大数据等领域工作,该学Hadoop还是Spark?
- 2018下半年初级程序员考试时间
- [Linux网络编程]高并发-Epoll模型
- Java代码校验银行卡号
- 人体的基本五行 - 心肝脾肺肾,金木水火土 对应关系与基础解读
- Vue Element 使用required提示语问题 出现‘xxx is required‘解决方案
- WPS 宣布将推出“WPS AI”
- 安全防御----防火墙
- 龙芯(Loongarch64),在Linux虚拟一个龙芯OS体验下
- zabbix模板使用
- SMPL:数据增强之处理pose和3d点