1、项目介绍

2、微信公众平台 和 微信开放文档

2.1 微信公众平台

2.1.1 网址链接

https://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/index

2.1.2 测试号信息

2.1.3 微信扫描关注测试公众号

2.1.4 授权回调页面域名

2.1.4.1 网页服务->网页账号->修改

2.1.4.2 填写 授权回调页面域名

2.1.4.3 内网穿透 NATAPP
2.1.4.3.1 使用教程
NATAPP1分钟快速新手图文教程: https://natapp.cn/article/natapp_newbie

下载: https://natapp.cn/#download

使用本地配置文件config.ini: https://natapp.cn/article/config_ini
2.1.4.3.2 authtoken

2.1.4.3.3 授权回调页面域名

2.2 微信开放文档

2.2.1 网址链接

https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html#2

2.2.2 官方 基本步骤教程

1 第一步:用户同意授权,获取code

2 第二步:通过 code 换取网页授权access_token

3 第三步:刷新access_token(如果需要)

4 第四步:拉取用户信息(需 scope 为 snsapi_userinfo)

5 附:检验授权凭证(access_token)是否有效

3、http请求工具类 HttpClient4Util

HttpClient4Util 用来发http请求;

https://www.cnblogs.com/xiaoqigui/p/16839536.html

4、配置文件 和 配置类

4.1 配置文件

application.yml

#端口
server:
port: 8096 # 自定义微信授权信息
wechat:
auth:
app-id: wxd4e20add67****** # appID
app-secret: a21e97d21d0d6ce408b7a6c****** # appsecret
code-uri: https://open.weixin.qq.com/connect/oauth2/authorize # 请求微信官方获取用户授权code 的请求地址
redirect-uri: http://******.natappfree.cc/wechat/auth/codeBack # 微信官方返回 用户授权code 的回调地址
access-token-uri: https://api.weixin.qq.com/sns/oauth2/access_token # 根据微信回调的code值,请求微信官方获取用户access_token 的请求地址
user-info-uri: https://api.weixin.qq.com/sns/userinfo #根据用户的 accessToken 和 openId 拉取用户信息 的请求地址

4.2 配置类

//自定义微信授权参数信息配置类
@Data
@Component
@ConfigurationProperties(prefix = "wechat.auth")
public class WeChatAuthConfig {
/*
应用id
*/
private String appId;
/*
应用密钥
*/
private String appSecret;
/*
请求获取code的地址
*/
private String codeUri;
/*
微信官方回调code的地址
*/
private String redirectUri;
/**
* 微信官方获取access_token地址
*/
private String accessTokenUri;
/*
微信官方获取userInfo地址
*/
private String userInfoUri; }

5、server 层

5.1 接口

/**
* Created On : 28/10/2022.
* <p>
* Author : huayu
* <p>
* Description: 微信授权的业务接口
*/
public interface WeChatAuthService { /**
* @author : huayu
* @date : 28/10/2022
* @param : []
* @return : java.lang.String
* @description : 生成请求微信官方获取用户授权code的请求地址
*/ String generateWeChatAuthCodeUrl(); /**
* @author : huayu
* @date : 28/10/2022
* @param : [wechatAuthCode]
* @return : java.lang.String
* @description : 根据微信回调的code值,请求微信官方获取用户access_token
*/
String getAccessTokenFromWechatUseCode(String wechatAuthCode); /**
* @author : huayu
* @date : 28/10/2022
* @param : [accessToken, openId]
* @return : java.lang.String
* @description : 根据用户的 accessToken 和 openId 拉取用户信息
*/
String getUserInfoFromWechatUseAccessToken(String accessToken,String openId); }

5.2 实现类

/**
* Created On : 28/10/2022.
* <p>
* Author : huayu
* <p>
* Description: 微信授权的业务接口 实现类
*/
@Service
@Slf4j
public class WeChatAuthServiceImpl implements WeChatAuthService{ @Autowired
private WeChatAuthConfig weChatAuthConfig; /**
* @author : huayu
* @date : 29/10/2022
* @param : []
* @return : java.lang.String
* @description : 生成请求微信官方获取用户授权code的请求地址
*/
@Override
public String generateWeChatAuthCodeUrl() { //微信官方引导用户打开授权页面,获取code的完整路径
//https://open.weixin.qq.com/connect/oauth2/authorize
// ?appid=APPID
// &redirect_uri=REDIRECT_URI
// &response_type=code
// &scope=SCOPE
// &state=STATE
// #wechat_redirect
//尤其注意:由于授权操作安全等级较高,所以在发起授权请求时,微信会对授权链接做正则强匹配校验,如果链接的参数顺序不对,授权页面将无法正常访问 //生成请求卫星官方获取用户code的完整地址
StringBuilder weCharAuthCodeUrl = new StringBuilder(weChatAuthConfig.getCodeUri());
weCharAuthCodeUrl.append("?appid=").append(weChatAuthConfig.getAppId())
.append("&redirect_uri=").append(weChatAuthConfig.getRedirectUri())
.append("&response_type=code")
//&scope=snsapi_userinfo&state=STATE
.append("&scope=").append("snsapi_userinfo")
.append("&state=").append("kh96_wechat_auth")
.append("#wechat_redirect"); log.info("------ 请求微信官方授权网站地址:{} ------",weCharAuthCodeUrl.toString()); //返货完整的请求地址
return weCharAuthCodeUrl.toString(); } /**
* @author : huayu
* @date : 29/10/2022
* @param : [wechatAuthCode]
* @return : java.lang.String
* @description : 根据微信回调的code值,请求微信官方获取用户access_token
*/
@Override
public String getAccessTokenFromWechatUseCode(String wechatAuthCode) {
// 尤其注意:由于公众号的 secret 和获取到的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,请求微信官方获取access_token的完整地址
StringBuilder accessTokenUrl = new StringBuilder(weChatAuthConfig.getAccessTokenUri());
accessTokenUrl.append("?appid=").append(weChatAuthConfig.getAppId())
.append("&secret=").append(weChatAuthConfig.getAppSecret())
.append("&code=").append(wechatAuthCode)
.append("&grant_type=authorization_code"); log.info("------ 根据code,请求微信官方获取access_token的完整地址:{} ------", accessTokenUrl.toString()); // 根据code,请求微信官方获取access_token,返回结果是同步返回的,不再是异步回调
// 请求是服务器内部发起的,也就是说:在程序中,要根据上面完整的请求地址,主动发送请求到微信官方,接口同步会返回一个json格式的字符串结果,程序内要解析获取的结果 // 程序内主动发起http请求,获取access_token
return HttpClient4Util.getResponse4GetAsString(accessTokenUrl.toString(), "utf-8");
} /**
* @author : huayu
* @date : 29/10/2022
* @param : [accessToken, openId]
* @return : java.lang.String
* @description : 根据用户的 accessToken 和 openId 拉取用户信息
*/
@Override
public String getUserInfoFromWechatUseAccessToken(String accessToken, String openId) { // 如果网页授权作用域为snsapi_userinfo,则此时开发者可以通过access_token和 openid 拉取用户信息了。
// http:GET(请使用 https 协议):
// https://api.weixin.qq.com/sns/userinfo
// ?access_token=ACCESS_TOKEN
// &openid=OPENID
// &lang=zh_CN // 封装根据accessToken和openId,请求微信官方获取用户信息详情地址
StringBuilder userInfoUrl = new StringBuilder(weChatAuthConfig.getUserInfoUri());
userInfoUrl.append("?access_token=").append(accessToken)
.append("&openid=").append(openId)
.append("&lang=zh_CN");
log.info("------ 根据access_token,请求微信官方获取userinfo的完整地址:{} ------", userInfoUrl.toString()); // 程序内主动发起http请求,获取用户详情
return HttpClient4Util.getResponse4GetAsString(userInfoUrl.toString(), "utf-8");
} }

6、controller 层

/**
* Created On : 28/10/2022.
* <p>
* Author : huayu
* <p>
* Description: 测试微信授权登录操作入口
*/
//@SuppressWarnings("all")
@Slf4j
@RestController
@RequestMapping("/wechat/auth")
public class WeChatAuthController { @Autowired
private WeChatAuthService weChatAuthService; /**
* @author : huayu
* @date : 28/10/2022
* @param : []
* @return : com.kgc.scd.uitl.RequestResult<java.lang.String>
* @description : 获取请求微信官方货物code的完整地址,用户访问该地址,可以进行授权操作(把地址交给前端生成二维码给用户扫码,或者后端生成)
*/
@GetMapping("/codeUrl")
public RequestResult<String> codeUrl(){ //调用业务接口,获取完整用户授权访问的地址
return ResultBuildUtil.success(weChatAuthService.generateWeChatAuthCodeUrl()); } /**
* @author : huayu
* @date : 28/10/2022
* @param : []
* @return : com.kgc.scd.uitl.RequestResult<java.util.Map<java.lang.String,java.lang.Object>>
* @description : 接收微信官方一步回调请求,获取用户授权的code
* 流程:用户先根据上一步返回请求地址,进行授权操作,如果用户统一授权,微信官方自动根据上一步请求带过去的回调地址redirectUri,进行结果回调
*/
@RequestMapping("/codeBack")
public RequestResult<Map<String, Object>> codeBack(HttpServletRequest request){ // 用户同意授权后,如果用户同意授权,页面将跳转至 redirect_uri/?code=CODE&state=STATE。
// code说明:code作为换取access_token的票据,每次用户授权带上的 code 将不一样,code只能使用一次,5分钟未被使用自动过期。 // 从官方回调的请求中,获取用户授权后的code参数值
String wechatAuthCode = request.getParameter("code"); // 从官方回调的请求中,获取用户授权时的自定义参数state
String wechatAuthState = request.getParameter("state"); log.info("------ 微信授权后,官方异步回调结果:code={},state={} ------", wechatAuthCode, wechatAuthState); // 定义接口返回集合对象
Map<String, Object> resultMap = new HashMap<>(); // 参数非空校验
if(StringUtils.isBlank(wechatAuthCode)){
resultMap.put("msg", "授权code为空!");
return ResultBuildUtil.fail(resultMap);
} // 调用业务接口,通过 code 换取网页授权access_token
String accessTokenJson = weChatAuthService.getAccessTokenFromWechatUseCode(wechatAuthCode);
log.info("------ 通过 code 换取网页授权access_token返回结果:{} ------", accessTokenJson); // 正确时返回的 JSON 数据包如下:
// {"access_token":"ACCESS_TOKEN","expires_in":7200,"refresh_token":"REFRESH_TOKEN","openid":"OPENID","scope":"SCOPE"}
// 错误时返回的 JSON 数据包如下:
// {"errcode":40029,"errmsg":"invalid code"} // 解析返回的json数据
JSONObject accessTokenJsonObj = JSON.parseObject(accessTokenJson); // 判断获取access_token结果是否正确,如果错误,直接结束,如果正确,获取对应的access_token
if(StringUtils.isNotBlank(accessTokenJsonObj.getString("errcode"))){
resultMap.put("wxCode", accessTokenJsonObj.getString("errcode"));
resultMap.put("wxMsg", accessTokenJsonObj.getString("errmsg"));
return ResultBuildUtil.fail(resultMap);
} // 拉取用户信息(需 scope 为 snsapi_userinfo)
// 根据上一步返回json,获取拉取用户信息凭证-access_token和用户唯一标识-openid
String accessToken = accessTokenJsonObj.getString("access_token");
String openId = accessTokenJsonObj.getString("openid"); // 调用业务接口,通过access_token和openId,拉取用户详情
String userInfoJson = weChatAuthService.getUserInfoFromWechatUseAccessToken(accessToken, openId);
log.info("------ 通过access_token和openId,拉取用户详情:{} ------", userInfoJson); // 接口返回用户详情信息
resultMap.put("userInfo", userInfoJson); // TODO 获取成功用户信息后,系统要完成静默注册-把用户信息注册到系统数据中,存储用户的头像,昵称,openId信息,并给系统用户表增加其它的基本信息 //返回用户详情
return ResultBuildUtil.success(resultMap);
} }

7、测试

7.1 生成请求微信官方获取用户授权code的请求地址

7.2 获取用户信息

SoringCloud(四) - 微信获取用户信息的更多相关文章

  1. 微信获取用户信息的两个接口和两个ACCESS_TOKEN

    有一段时间没有搞微信开发了 ,今天突然要改一下程序! 回头一看 微信的帮助文档太tm的稀烂的,太难懂了,这做个笔记以后看着方便 微信有2个ACCESS_TOKEN, 1,基础接口的token 获取接口 ...

  2. 微信快速开发框架(八)-- V2.3--增加语音识别及网页获取用户信息,代码已更新至Github

    不知不觉,版本以每周更新一次的脚步进行着,接下来应该是重构我的代码及框架的结构,有朋友反应代码有点乱,确实如此,当时写的时候只是按照订阅号来写的,后来才慢慢增加到支持API接口.目前还在开发第三方微信 ...

  3. .NET微信开发通过Access Token和OpenID获取用户信息

    本文介绍如何获得微信公众平台关注用户的基本信息,包括昵称.头像.性别.国家.省份.城市.语言. 本文的方法将囊括订阅号和服务号以及自定义菜单各种场景,无论是否有高级接口权限,都有办法来获得用户基本信息 ...

  4. JAVA获取微信小程序openid和获取公众号openid,以及通过openid获取用户信息

    一,首先说明下这个微信的openid 为了识别用户,每个用户针对每个公众号会产生一个安全的OpenID,如果需要在多公众号.移动应用之间做用户共通,则需前往微信开放平台,将这些公众号和应用绑定到一个开 ...

  5. 微信小游戏 小程序与小游戏获取用户信息接口调整 wx.createUserInfoButton

    参考: 小程序•小故事(6)——微信登录能力优化 小程序•小故事(4)——获取用户信息 本篇主要是讲微信getUserInfo接口不再出现授权弹框 那么原来getUserInfo是怎么样?修改之后又是 ...

  6. PHP微信公众平台OAuth2.0网页授权,获取用户信息代码类封装demo(二)

    一.这个文件微信授权使用的是OAuth2.0授权的方式.主要有以下简略步骤: 第一步:判断有没有code,有code去第三步,没有code去第二步 第二步:用户同意授权,获取code 第三步:通过co ...

  7. 微信第三方登陆,无需注册一键登录,获取用户信息,PHP实现方法

    今天讲讲利用微信oauth2实现第三方登陆的实现方法. 先说说前提吧! 首先你得是服务号,并且是经过认证的.这样微信会给你很多第三方接口的权限,如果是订阅号或者没有认证的服务号那就不用想了! 一开始你 ...

  8. 微信小程序维护登录态与获取用户信息

    前言. 微信小程序的运行环境不是在浏览器下运行的.所以不能以cookie来维护登录态.下面我就来说说我根据官方给出的方法来写出的维护登录态的方法吧. 一.登录态维护 官方的文档地址:https://m ...

  9. 微信小程序 获取用户信息授权

    login.wxml界面 获取用户授权可以用微信提供的接口 wx.authorize, 但是获取用户信息的授权用这个接口不会弹出授权窗口 <button class="submit-b ...

随机推荐

  1. java中使用 POI导出excel表格的简单实现

    大概流程分7步: 1.创建工作簿 --> 2.创建sheet表 --> 3.创建row行(建议使用循环) --> 4.用row行逐一创建单元格(建议使用循环) --> 5.单元 ...

  2. idea+SpringBoot使用过程中的问题集合

    1.跨域访问外部接口? 使用Nginx代理(详细参见:https://www.cnblogs.com/ZhaoHS/p/16594619.html): 合并部署,统一从后端访问第三方接口(合并部署详见 ...

  3. MySQL查询性能优化七种武器之索引下推

    前面已经讲了MySQL的其他查询性能优化方式,没看过可以去了解一下: MySQL查询性能优化七种武器之索引潜水 MySQL查询性能优化七种武器之链路追踪 今天要讲的是MySQL的另一种查询性能优化方式 ...

  4. Maven中使用ssm框架出现:org.apache.tomcat.util.modeler.BaseModelMBean.invoke 调用方法[manageApp]时发生异常

    org.apache.tomcat.util.modeler.BaseModelMBean.invoke 调用方法[manageApp]时发生异常 首先可以排查一下像: @RequestMapping ...

  5. ubuntu 安装及配置Apache

    一.下载.启动apache2 sudo apt-get install apache2 sudo /etc/init.d/apache2 restart 二.修改配置文件 1.更改网站根目录 sudo ...

  6. KingbaseES 查询计划剖析

    概述:了解KingbaseES查询计划对于开发人员和数据库管理员来说都是一项关键技能.这可能是优化SQL查询的第一件事,也是验证优化的SQL查询是否确实实现期望结果的方式. 1.KingbaseES数 ...

  7. 微服务系列之网关(二) konga配置操作

    1.konga核心对象 Kong 的四大核心对象:upstream,target,service,route.下面分别说: (1)upstream,字面意思上游,实际项目理解是对某一个服务的一个或者多 ...

  8. Linux云主机安全入侵排查步骤

    导语 经常有用户报障系统被植入恶意程序,如挖矿软件.ddos攻击病毒.syn映射攻击病毒等,可以按照以下流程为用户排查入侵病毒类型: 一.定位病毒进程 对于用户反馈云主机性能卡顿,CPU和内存占用较高 ...

  9. 输入法词库解析(一)百度自定义方案.def

    详细代码:https://github.com/cxcn/dtool 前言 .def 是百度手机输入法-更多设置-自定义输入方案所使用的格式. 解析 码表偏移量 0x6D # 占用字节数 描述 a 1 ...

  10. Python数据科学手册-Pandas:层级索引

    一维数据 和 二维数据 分别使用Series 和 DataFrame 对象存储. 多维数据:数据索引 超过一俩个 键. Pandas提供了Panel 和 Panel4D对象 解决三维数据和四维数据. ...