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

5.2 实现类/** * Created On : 28/10/2022. * <p> * Author : huayu * <p> * Description: 微信授权的业务接口 实现类 */@Service@Slf4jpublic class WeChatAuthServiceImpl implements WeChatAuthService{@Autowiredprivate WeChatAuthConfig weChatAuthConfig;/*** @author : huayu* @date: 29/10/2022* @param: []* @return : java.lang.String* @description : 生成请求微信官方获取用户授权code的请求地址*/@Overridepublic 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*/@Overridepublic 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_tokenreturn HttpClient4Util.getResponse4GetAsString(accessTokenUrl.toString(), "utf-8");}/*** @author : huayu* @date: 29/10/2022* @param: [accessToken, openId]* @return : java.lang.String* @description : 根据用户的 accessToken 和openId 拉取用户信息*/@Overridepublic 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");}}

经验总结扩展阅读