微信OAuth授权获取用户OpenId-JAVA
开源中国http://my.oschina.net/xshuai/blog/293458也是本作者
https://open.weixin.qq.com/ 这个是授权登陆自己网站的和我的这个是有区别的。
更新时间 2016年1月6日
更新时间 2016年1月6日
更新时间 2016年1月6日
重要的事情说三遍
http://mp.weixin.qq.com/wiki这个是官网的接口文档
微信授权获取用户openid-JAVA
开发微信测试需要用到的代码和jar包都在里面 包括核心代码 上面图片可以扫一扫 支持一下。
链接: http://mobile.qzone.qq.com/l?g=1357&sharekey=e43cb6432868c4b709c5351c3c82d3de
/**
* 网页授权获取openId第2步,根据code取得openId
*
* @param appid 公众号的唯一标识
* @param secret 公众号的appsecret密钥
* @param code code为换取access_token的票据
* @return
*/
代码为OAuthInfo 不在此博客中 OAuthInfo只获取到Openid 。获取详细信息。继续调用微信接口
拉取用户信息(需scope为 snsapi_userinfo)
本作者是用菜单的方式引导用户进入点击获取信息的。
如果网页授权作用域为snsapi_userinfo,则此时开发者可以通过access_token和openid拉取用户信息了。
请求方法
http:GET(请使用https协议) https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
第一步:用户同意授权,获取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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
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换取openId
OAuthInfo 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" }
我们需要对这个json格式数据进行转换。大写自己都是用自己账号获取的数据。所有做了替换。
具体代码如下。获取的code换取的access_token
1
|
https: //api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code;
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
public static OAuthInfo getOAuthOpenId(String appid, String secret, String code ) {
OAuthInfo oAuthInfo = null ;
String requestUrl = o_auth_openid_url.replace( "APPID" , appid).replace( "SECRET" , secret).replace( "CODE" , code);
JSONObject jsonObject = httpRequest(requestUrl, "GET" , null );
// 如果请求成功
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的接口。就能得到微信用户的所有信息了。
具体返回如下。获取用户信息代码不再写。
1
2
3
4
5
6
7
8
9
|
{ "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。用户点击跳转页面为
写一个Servlet专门接收传递过来的code。进行相应的操作。
1.OAuthServlet 对code进行access——token的验证
2.GetWeiXinCode的方法调用接口地址。得到相应code。
3.OAuthInfo 返回数据相应的参数的PO类。set/get方法
4.WeiXinUtil添加一个方法 publicOAuth getOAuthInfo(String appid, String secret, String code)得到json格式。并使用JSONObject读取出自己想要的数据。
https://open.weixin.qq.com/ 这个是授权登陆自己网站的和我的这个是有区别的。
个人微博 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(个人经验)
个人微信小程序 可扫码体验 本文更新有可能先在开源中国.地址为:https://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)有网页授权获取用户基本信息的权限接口 注意:最近有朋友说:在公众平台申请的测试号,会出现无法取到用户信息 ...
最新文章
- 理解Android编译命令(转)
- oracle创建自增
- 等式成立JAVA_java – 找到两个线性等式成立的整数集
- 居中弹出一个层,打开一个文件。
- spring中bean的细节之三种创建Bean对象的方式
- python indexerror怎么办_Python IndexError:使用列表作为可迭代对象时...
- ORA-01033: ORACLE initialization or shutdown in progress
- arm9260 linux编译,关于linux9260烧写软件和gdb调试器的使用
- 都是自私惹的祸? 论蹭网再触道德底线
- [转载] python+opencv图像处理:numpy数组操作
- Codeforces Round #422 (Div. 2) D. My pretty girl Noora [数论][dp]
- 粮食增产的重要性顺序,土水肥种
- Unity - 射线检测
- 我想健康富有聪明怎么导告_富有成效的远程工作(当您的心理健康说“否”时)
- K-中心点聚类算法(K-Medoide)
- 达梦数据库如何把EXCEL的数据导入到表中?
- 获取手机通讯录联系人(包含模糊查询,dialog自定义,也有一个自定义通知栏)
- fs.readFileSync 引入路径错误
- pads2007版本pcb导出的dxf在cad中打不开,提示“DXF 输入无效或不完整 -- 图形被放弃”
- python和接码平台对接_GitHub - zhupite233/yima: 易码平台API的Python接口