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 实现类
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 获取用户信息

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |