四 SoringCloud -微信获取用户信息( 二 )

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的请求地址

四 SoringCloud -微信获取用户信息

文章插图
7.2 获取用户信息
四 SoringCloud -微信获取用户信息

文章插图
【四 SoringCloud -微信获取用户信息】

推荐阅读