功能:主要用于在用户通过手机端微信访问第三方H5页面时获取用户的身份信息(openId,昵称,头像,所在地等。。)可用来实现微信登录、微信账号绑定、用户身份鉴权等功能。
开发前的准备:

1、需要有一个公众号,拿到AppID和AppSecret;

2、进入公众号开发者中心页配置授权回调域名。具体位置:接口权限-网页服务-网页账号-网页授权获取用户基本信息-修改

注意,这里仅需填写全域名(如www.qq.com、www.baidu.com),勿加 http:// 等协议头及具体的地址字段;

这个域名需要是一个备案过的域名。这个条件比较难办,幸好热心的网友qydev为我们无私地提供了一个备案过的域名,我们可以通过使用Ngrok来虚拟一个域名映射到本地开发环境,简直是web开发神器啊。。

qydev版Ngrok使用说明及下载地址:http://www.qydev.com/

本文以 lovebread.tunnel.qydev.com 域名为例:

3、如果嫌手机上测试麻烦,可以使用微信官方提供的web开发者工具直接在浏览器中进行调试。

前提是需要在微信公众号中绑定开发者账号:登录公众号-开发者工具-进入web开发者工具-绑定web开发者微信账号

使用说明及下载地址:https://mp.weixin.qq.com/wiki?action=doc&id=mp1455784140&t=0.7272727088156665&token=&lang=zh_CN#6

授权步骤:

1、引导用户进入授权页面同意授权,获取code

2、通过code换取网页授权access_token(与基础支持中的access_token不同)

3、通过网页授权access_token和openid获取用户基本信息

Java实现:

1、引导用户进入授权页面同意授权,获取code

这一步其实就是将需要授权的页面url拼接到微信的认证请求接口里面,比如需要用户在访问页面 lovebread.tunnel.qydev.com/auth 时进行授权认证,那么拼接后的授权验证地址为:

https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx88888888&redirect_uri=http://lovebread.tunnel.qydev.com/auth&response_type=code&scope=snsapi_base&state=xxxx_state#wechat_redirect

这里面需要替换appid、redirect_uri为实际的信息。其中的scope参数有两个值:

snsapi_base:只能获取到用户openid。好处是静默认证,无需用户手动点击认证按钮,感觉上像是直接进入网站一样。

snsapi_userinfo:可以获取到openid、昵称、头像、所在地等信息。需要用户手动点击认证按钮。

相关代码:

   /*** 生成用于获取access_token的Code的Url** @param redirectUrl* @return*/public String getRequestCodeUrl(String redirectUrl) {return String.format("https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=code&scope=%s&state=%s#wechat_redirect",APPID, redirectUrl, "snsapi_userinfo", "xxxx_state");}

2、通过第一步获取的code换取网页授权access_token(与基础支持中的access_token不同)

这一步需要在控制器中获取微信回传给我们的code,通过这个code来请求access_token。

   /*** 路由控制* * @param request* @param code* @return */@GET@Path("auth")public Response auth(@Context HttpServletRequest request,@QueryParam("code") String code) {Map<String, String> data = new HashMap();Map<String, String> result = wechatUtils.getUserInfoAccessToken(code);//通过这个code获取access_tokenString openId = result.get("openid");if (StringUtils.isNotEmpty(openId)) {logger.info("try getting user info. [openid={}]", openId);Map<String, String> userInfo = wechatUtils.getUserInfo(result.get("access_token"), openId);//使用access_token获取用户信息logger.info("received user info. [result={}]", userInfo);return forward("auth", userInfo);}return Response.ok("openid为空").build();}

   /*** 获取请求用户信息的access_token** @param code* @return*/public Map<String, String> getUserInfoAccessToken(String code) {JsonObject object = null;Map<String, String> data = new HashMap();try {String url = String.format("https://api.weixin.qq.com/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=authorization_code",APPID, APPSECRET, code);logger.info("request accessToken from url: {}", url);DefaultHttpClient httpClient = new DefaultHttpClient();HttpGet httpGet = new HttpGet(url);HttpResponse httpResponse = httpClient.execute(httpGet);HttpEntity httpEntity = httpResponse.getEntity();String tokens = EntityUtils.toString(httpEntity, "utf-8");Gson token_gson = new Gson();object = token_gson.fromJson(tokens, JsonObject.class);logger.info("request accessToken success. [result={}]", object);data.put("openid", object.get("openid").toString().replaceAll("\"", ""));data.put("access_token", object.get("access_token").toString().replaceAll("\"", ""));} catch (Exception ex) {logger.error("fail to request wechat access token. [error={}]", ex);}return data;}

请求access_token返回样例:

[result={"access_token":"OezXcEiiBSKSxW0eoylIeK6mXnzDdGmembMkERL1o1PtpJBEFDaCSwseSTzvZhiKK7Q35O-YctaOFfyJYSPMMEsMq62zw8T6VDljgKJY6g-tCMdTr3Yoeaz1noL6gpJeshMPwEXL5Pj3YBkw","expires_in":7200,"refresh_token":"OezXcEiiBSKSxW0eoylIeK6mXnzDdGmembMkERL1o1PtpJBEFDaCSwseSTOIGqz3ySJRe-lv124wxxtrBdXGd3X1YGysFJnCxjtIE-jaMkvT7aN-12nBa4YtDvr5VSKCU-_UeFFnfW0K3JmZGRA","openid":"oN9UryuC0Y01aQt0jKxZXbfe658w","scope":"snsapi_userinfo"}]

通过access_token和openid获取用户基本信息:
   /*** 获取用户信息** @param accessToken* @param openId* @return*/public Map<String, String> getUserInfo(String accessToken, String openId) {Map<String, String> data = new HashMap();String url = "https://api.weixin.qq.com/sns/userinfo?access_token=" + accessToken + "&openid=" + openId + "&lang=zh_CN";logger.info("request user info from url: {}", url);JsonObject userInfo = null;try {DefaultHttpClient httpClient = new DefaultHttpClient();HttpGet httpGet = new HttpGet(url);HttpResponse httpResponse = httpClient.execute(httpGet);HttpEntity httpEntity = httpResponse.getEntity();String response = EntityUtils.toString(httpEntity, "utf-8");Gson token_gson = new Gson();userInfo = token_gson.fromJson(response, JsonObject.class);logger.info("get userinfo success. [result={}]", userInfo);data.put("openid", userInfo.get("openid").toString().replaceAll("\"", ""));data.put("nickname", userInfo.get("nickname").toString().replaceAll("\"", ""));data.put("city", userInfo.get("city").toString().replaceAll("\"", ""));data.put("province", userInfo.get("province").toString().replaceAll("\"", ""));data.put("country", userInfo.get("country").toString().replaceAll("\"", ""));data.put("headimgurl", userInfo.get("headimgurl").toString().replaceAll("\"", ""));} catch (Exception ex) {logger.error("fail to request wechat user info. [error={}]", ex);}return data;}

获取用户信息返回样例:

[result={
"openid":"oN9UryuC0Y01aQt0jKxZXbfe658w",
"nickname":"lovebread",
"sex":1,
"language":"zh_CN",
"city":"",
"province":"",
"country":"中国",
"headimgurl":"http://wx.qlogo.cn/mmopen/bRLXzTf2f6HNfBTd72heAA7vNKsGKvK3dfreewrewsPff9OaMWib0GibbA8daQmNQvQhagtiaicf4vNC5nYU3ia821QQ/0",
"privilege":[]}]

[微信开发] 微信网页授权Java实现(https://www.cnblogs.com/lovebread/p/5513241.html)相关推荐

  1. 微信开发一--网页授权

    功能: 主要用于在用户通过手机端微信访问第三方H5页面时获取用户的身份信息(openId,昵称,头像,所在地等..)可用来实现微信登录.微信账号绑定.用户身份鉴权等功能. 一.开发前的准备: 1.需要 ...

  2. 微信开发_网页授权获取用户的基本信息

    如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑. 关于OAuth2.0的说明 官方网站:http://oauth.net/   http:/ ...

  3. 微信开发之网页授权获取用户基本信息

    微信官方文档:网页授权获取用户基本信息 具体而言,网页授权流程分为四步: 1.引导用户进入授权页面同意授权,获取code https://open.weixin.qq.com/connect/oaut ...

  4. errorcode 微信分享_微信公众号网页授权code问题

    最近做微信开发,在网页授权的时候,总是出现异常 time:2017-03-10 问题:手机端访问网页没问题,电脑端微信测试就会出现code过期情况,导致服务器错误 错误情况: 只要出现上述申请访问连接 ...

  5. Java微信公众号开发之网页授权获取用户基本信息

    本篇博客讲解的网页授权只需要前端传递一个backUrl(回调地址) 到后台接口,后台接口会完成整个授权流程,无需前端做更多工作: 一. 前言 微信公众号开发,需要用到网页授权获取用户信息,通过OAut ...

  6. ASP.NET MVC4 微信公众号开发之网页授权(一):搭建基础环境

    首先你得注册并认证一个个人或企业的微信公众号===服务号从而确保获得以下接口权限: 然后打开公众号设置里的功能设置里找到业务域名和网页授权域名分别填上你的域名(注:已备案的域名),如下图所示: 到这里 ...

  7. 小白专用微信公众号网页授权通过code获取用户信息

    新手小编 本人已入坑2年也是通过在哈尔滨图灵云培训学习的Java,且年龄也比较大的码农 目前在北京也是刚刚才接触微信公众号的网页开发所得经验进行跟大家分享 因为代码写的少大多都是无用的重复代码,请大家 ...

  8. 微信公众号网页授权代码优化过程(一)

    2019独角兽企业重金招聘Python工程师标准>>> 第一次更新 写本系列博客的主要原因是,我在处理一个微信公众号项目时要做一个网页授权的操作(官方地址是https://mp.we ...

  9. 微信公众号网页授权--前端获取code及用户信息(vue)

    前段时间开发微信公众号网页授权,虽然网上已经有很多关于这方面的博客或者教程,但是第一次开发还是遇到挺多坑的,以下分享一下我的踩坑填坑之路. 一.测试号相关配置 首先在你公司申请的测试号上配置好相关信息 ...

最新文章

  1. 算法分析的一个小例子--大数乘法
  2. jQuery,Ashx发送站内信
  3. 在本机快速创建YUM源
  4. 一文聊透 Dubbo 优雅停机
  5. js常用阻止冒泡事件
  6. android文件缓存,并SD卡创建目录未能解决和bitmap内存溢出解决
  7. Linux基础知识(1)
  8. IntegerCache的妙用和陷阱
  9. Teamcenter 开发中的一些问题
  10. WIN10 如何修改 文件后缀名 设置后缀名可修改
  11. LeetCode Week 3:第 21 ~ 30 题
  12. Ubuntu 20.04 Install Navicat
  13. 什么是 SAP BAPI
  14. python运维自动化老男孩_Day1 老男孩python自动化运维课程学习笔记
  15. 网络计算机自动显示,怎么设置电脑断网后自动报警提醒?
  16. BCNF范式、第四范式和第五范式
  17. oracle 设置 锁模式,oracle表锁的几种模式v$locked_object-locked_mode
  18. 数据库设计--报刊订阅管理系统(有关数据库的课程设计)
  19. 如何更高效地使用Google搜索
  20. Javaweb ajax实现分页

热门文章

  1. Pycharm中的Debug工具以及简单的使用方法
  2. VTK:字形2D用法实战
  3. opengl加载显示3D模型COB类型文件
  4. OpenCASCADE:使用扩展数据交换 XDE之颜色和图层
  5. boost::hana::append用法的测试程序
  6. boost::hana::unpack用法的测试程序
  7. GDCM:Torture的测试程序
  8. boost::allocator_void_pointer
  9. ITK:直方图创建和Bin访问
  10. ITK:转换三角网格为二进制图像