6、controller 层/** * Created On : 28/10/2022. * <p> * Author : huayu * <p> * Description: 测试微信授权登录操作入口 *///@SuppressWarnings("all")@Slf4j@RestController@RequestMapping("/wechat/auth")public class WeChatAuthController {@Autowiredprivate 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");// 从官方回调的请求中 , 获取用户授权时的自定义参数stateString 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_tokenString 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_tokenif(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和用户唯一标识-openidString 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 -微信获取用户信息】
推荐阅读
- 华为watch3可以使用微信吗_华为watch3有微信吗
- 第三方代开的微信小程序更换管理员
- 如何kill一条TCP连接?
- 四十 Salesforce LWC学习 dynamic interaction 浅入浅出
- 脑洞群英传热梗接龙四年轻人不讲武德怎么过关
- 四十八 SpringCloud微服务实战——搭建企业级开发框架:【移动开发】整合uni-app搭建移动端快速开发框架-使用第三方UI框架
- <四>1:全面掌握Const的用法
- 四 AIR32F103 27倍频216MHz,CoreMark跑分测试
- 如何转账到支付宝(支付宝不绑卡怎么把钱转到微信)
- 四十七 SpringCloud微服务实战——搭建企业级开发框架:【移动开发】整合uni-app搭建移动端快速开发框架-添加Axios并实现登录功能