四 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 -微信獲取用戶信息】

推薦閱讀