微信OAuth授权获取用户OpenId-JAVA(个人经验)

2024-05-19 02:32

本文主要是介绍微信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(个人经验)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/995771

相关文章

C# VB.NET WebApi获取客户端的IP地址

一、需求 : 需要根据IP地址不同返回不同的数据接口。 二、实现:新建一个类模块 Public Module HttpRequestMessageExtensionsPrivate Const HttpContext As String = "MS_HttpContext"Private Const RemoteEndpointMessage As String = "System.Servi

【netty】三万字详解!JAVA高性能通信框架,关于netty,看这一篇就够了

目录 1.概述 2.hello world 3.EventLoop 4.channel 4.1.同步 4.2.异步 4.3.调试 4.4.关闭 4.5.为什么要用异步 5.future 6.promise 7.pipeline 8.byteBuf 8.1.创建 8.2.内存模式和池化 8.2.1.内存模式 8.2.2.池化 8.3.组成 8.4.操作 8

cenots 出现 curl 外网地址很慢,或者微信授权很慢

用 curl 访问链接,很慢才显示接口、或者微信授权很慢, 微信授权,很慢才授权成功,平均延时 5s 可能是  dns配置问题,直接修改     sudo vim /etc/resolv.conf 的   nameserver  改为  114.114.114.114  即可    其他需要屏蔽 或者把 114.114.114.114 放在第一位 (保存即可,不用做其他的)

java内存溢出堆栈分析

一、背景 java应用系统内存溢出导致服务不可用,可手动生成dump文件或添加配置参数生成文件,进行dump文件分析定位具体内存OOM的原因,并优化修复。 二、JProfile分析 分析工具下载 https://download.csdn.net/download/xinpz/89463963   三、linux中MemoryAnalyzer分析工具使用 一、安装工具 1、Me

java基础之super关键字

关键字super          (1)super可用于访问父类中定义的属性。          (2)super可用于调用父类中的成员方法。          (3)super可用于在子类构造方法中调用父类的构造方法。          注意:          尤其当子类和父类中出现同名成员时,可以用super进行区分          Super的追溯不仅限于直

java基础之-------重写

最近一段时间学习下java最基础的一些内容与大家分享。      方法的重写:     1、 前提:有子类继承父类。      2、子类继承父类以后,若父类的方法对子类不适用,那么子类可以对父类的方法进行重写。      3、重写的规则:             1)要求子类方法的返回值类型、方法名、参数列表与父类的一致。             2)子类方法的修饰符不能小于

mybatis框架下物理分页的实现(整个工程采用的是springmvc、spring、mybatis框架,数据库是mysql数据库)

整个工程采用的是springmvc、spring、mybatis框架,数据库是mysql数据库,本工程采用的是拦截器机制实现物理分页。     因为文章最后会有完整的工程资源文件,这里就不把详细代码贴出来了,只是把拦截器和相关的配置文件的代码跟大家详细探讨下。     (一)关于分页拦截器的简单理解     首先,要开发MyBatis的插件需要实现org.apache.ibatis.p

javaEE之------SpringMVC中ParameterMethodNameResolver应用

原文地址:http://blog.csdn.net/yangxin_blog/article/details/50568947 介绍 方法动态调用核心类 org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver 正在学习SpringMVC,感觉这个很重要。 前台访问后台会根据sp

Spring+SpringMVC+MyBatis框架一个简单工程的搭建实例

最近一直项目中一直在使用Spring+SpringMVC+Mybatis 框架,根据自己对这三个框架的了解搭建了一个这样的工程(工程测试可用),期间遇到不少问题,跟大家分享下(具体代码下载地址在文章最后)。    文章分成两大模块:      一、工程代码模块;    二、配置信息和自我理解模块。     项目的工程目录结构是: 一、工程代码模块:UserController.

【经验分享】Ubuntu24.04安装微信

【经验分享】Ubuntu24.04安装微信(linux官方2024universal版) 文章如下,22.04和24.04微信兼容 【经验分享】Ubuntu22.04安装微信(linux官方2024universal版) 实测Ubuntu24.04LTS版本可以兼容。