|
@@ -0,0 +1,221 @@
|
|
|
+package com.zanxiang.sdk.service.Impl.auth;
|
|
|
+
|
|
|
+import cn.hutool.http.HttpUtil;
|
|
|
+import com.zanxiang.common.exception.BaseException;
|
|
|
+import com.zanxiang.common.utils.URIUtil;
|
|
|
+import com.zanxiang.sdk.common.constant.ApiUrlConstant;
|
|
|
+import com.zanxiang.sdk.service.IVxApiService;
|
|
|
+import com.zanxiangnet.module.util.JsonUtil;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.apache.logging.log4j.util.Strings;
|
|
|
+import org.springframework.beans.factory.annotation.Value;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+
|
|
|
+import java.util.HashMap;
|
|
|
+import java.util.Map;
|
|
|
+import java.util.Objects;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @author : lingfeng
|
|
|
+ * @time : 2022-06-20
|
|
|
+ * @description : 微信api接口
|
|
|
+ */
|
|
|
+@Slf4j
|
|
|
+@Service
|
|
|
+public class VxApiServiceImpl implements IVxApiService {
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 微信开发者应用id
|
|
|
+ */
|
|
|
+ @Value("${auth.vx-appId}")
|
|
|
+ private String vxAppId;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 微信开发者应用key
|
|
|
+ */
|
|
|
+ @Value("${auth.vx-appSecret}")
|
|
|
+ private String vxAppSecret;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * QQ授权获取用户信息
|
|
|
+ *
|
|
|
+ * @param code : 前端授权code
|
|
|
+ * @return : 返回用户信息
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public Map<String, String> vxAuthUserInfo(String code) {
|
|
|
+ // 向QQ认证服务器申请令牌
|
|
|
+ Map<String, String> tokenResultMap = this.getAccessTokenApi(code);
|
|
|
+ if (tokenResultMap.isEmpty()) {
|
|
|
+ throw new BaseException("获取token失败");
|
|
|
+ }
|
|
|
+ // 获取用户信息
|
|
|
+ Map<String, String> userInfoMap = this.getUserInfoApi(tokenResultMap.get("access_token"), tokenResultMap.get("openid"));
|
|
|
+ if (userInfoMap.isEmpty()) {
|
|
|
+ throw new BaseException("获取用户信息失败");
|
|
|
+ }
|
|
|
+ //构造返回信息
|
|
|
+ Map<String, String> map = new HashMap<>(3);
|
|
|
+ map.put("openId", tokenResultMap.get("openid"));
|
|
|
+ map.put("accessToken", tokenResultMap.get("access_token"));
|
|
|
+ map.put("nickname", userInfoMap.get("nickname"));
|
|
|
+ map.put("avatar", userInfoMap.get("headimgurl"));
|
|
|
+ map.put("six", userInfoMap.get("six"));
|
|
|
+ return map;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * web获取用户授权token
|
|
|
+ * <p>
|
|
|
+ * 成功示例 :
|
|
|
+ * {
|
|
|
+ * "access_token":"ACCESS_TOKEN",
|
|
|
+ * "expires_in":7200,
|
|
|
+ * "refresh_token":"REFRESH_TOKEN",
|
|
|
+ * "openid":"OPENID",
|
|
|
+ * "scope":"SCOPE"
|
|
|
+ * }
|
|
|
+ * <p>
|
|
|
+ * 错误返回样例:
|
|
|
+ * {
|
|
|
+ * "errcode":40029,"errmsg":"invalid code"
|
|
|
+ * }
|
|
|
+ *
|
|
|
+ * @param code : 用户授权code
|
|
|
+ * @return : 返回token
|
|
|
+ */
|
|
|
+ private Map<String, String> getAccessTokenApi(String code) {
|
|
|
+ Map<String, String> paramMap = new HashMap<>(4);
|
|
|
+ paramMap.put("appid", vxAppId);
|
|
|
+ paramMap.put("secret", vxAppSecret);
|
|
|
+ paramMap.put("code", code);
|
|
|
+ paramMap.put("grant_type", "authorization_code");
|
|
|
+ //拼接url请求参数
|
|
|
+ Map<String, String> resultMap = new HashMap<>();
|
|
|
+ try {
|
|
|
+ String uri = URIUtil.fillUrlParams(ApiUrlConstant.VX_WEB_TOKEN_URL, paramMap, Boolean.TRUE);
|
|
|
+ String result = HttpUtil.get(uri);
|
|
|
+ if (Strings.isNotBlank(result)) {
|
|
|
+ resultMap = JsonUtil.toMap(result, Map.class, String.class);
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("微信获取用户授权token异常");
|
|
|
+ throw new BaseException("微信获取用户授权token异常");
|
|
|
+ }
|
|
|
+ return resultMap;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * web刷新用户token
|
|
|
+ * <p>
|
|
|
+ * 成功示例 :
|
|
|
+ * {
|
|
|
+ * "access_token":"ACCESS_TOKEN",
|
|
|
+ * "expires_in":7200,
|
|
|
+ * "refresh_token":"REFRESH_TOKEN",
|
|
|
+ * "openid":"OPENID",
|
|
|
+ * "scope":"SCOPE"
|
|
|
+ * }
|
|
|
+ * <p>
|
|
|
+ * 错误返回样例:
|
|
|
+ * {
|
|
|
+ * "errcode":40030,"errmsg":"invalid refresh_token"
|
|
|
+ * }
|
|
|
+ *
|
|
|
+ * @param refreshToken : 刷新token密钥
|
|
|
+ * @return : 返回新的token
|
|
|
+ */
|
|
|
+ private Map<String, String> refreshTokenApi(String refreshToken) {
|
|
|
+ Map<String, String> paramMap = new HashMap<>(4);
|
|
|
+ paramMap.put("appid", vxAppId);
|
|
|
+ paramMap.put("grant_type", "refresh_token");
|
|
|
+ paramMap.put("refresh_token", refreshToken);
|
|
|
+ //拼接url请求参数
|
|
|
+ Map<String, String> resultMap = new HashMap<>();
|
|
|
+ try {
|
|
|
+ String uri = URIUtil.fillUrlParams(ApiUrlConstant.VX_WEB_TOKEN_REFRESH_URL, paramMap, Boolean.TRUE);
|
|
|
+ String result = HttpUtil.get(uri);
|
|
|
+ if (Strings.isNotBlank(result)) {
|
|
|
+ resultMap = JsonUtil.toMap(result, Map.class, String.class);
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("微信刷新用户token异常");
|
|
|
+ throw new BaseException("微信刷新用户token异常");
|
|
|
+ }
|
|
|
+ return resultMap;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * web用户token校验是否有效
|
|
|
+ *
|
|
|
+ * @param openid : 用户在微信应用的唯一id
|
|
|
+ * @param accessToken : 密钥
|
|
|
+ * @return : 返回token是否有效, true : 有效, false : 无效
|
|
|
+ */
|
|
|
+ private Boolean tokenCheckApi(String openid, String accessToken) {
|
|
|
+ Map<String, String> paramMap = new HashMap<>(2);
|
|
|
+ paramMap.put("accessToken", accessToken);
|
|
|
+ paramMap.put("openid", openid);
|
|
|
+ //拼接url请求参数
|
|
|
+ Map<String, String> resultMap = new HashMap<>();
|
|
|
+ try {
|
|
|
+ String uri = URIUtil.fillUrlParams(ApiUrlConstant.VX_WEB_TOKEN_CHECK_URL, paramMap, Boolean.TRUE);
|
|
|
+ String result = HttpUtil.get(uri);
|
|
|
+ if (Strings.isNotBlank(result)) {
|
|
|
+ resultMap = JsonUtil.toMap(result, Map.class, String.class);
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("微信刷新用户token异常");
|
|
|
+ throw new BaseException("微信刷新用户token异常");
|
|
|
+ }
|
|
|
+ return Objects.equals(resultMap.get("errcode"), "0");
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * web获取用户信息
|
|
|
+ * <p>
|
|
|
+ * 成功示例 :
|
|
|
+ * {
|
|
|
+ * "openid":"OPENID",
|
|
|
+ * "nickname":"NICKNAME",
|
|
|
+ * "sex":1,
|
|
|
+ * "province":"PROVINCE",
|
|
|
+ * "city":"CITY",
|
|
|
+ * "country":"COUNTRY",
|
|
|
+ * "headimgurl": "headimgurl",
|
|
|
+ * "privilege":["PRIVILEGE1","PRIVILEGE2"],
|
|
|
+ * "unionid": " o6_bmasdasdsad6_2sgVt7hMZOPfL"
|
|
|
+ * }
|
|
|
+ * <p>
|
|
|
+ * 错误返回样例:
|
|
|
+ * {
|
|
|
+ * "errcode":40003,"errmsg":"invalid openid"
|
|
|
+ * }
|
|
|
+ *
|
|
|
+ * @param openid : 用户在微信应用的唯一id
|
|
|
+ * @param accessToken : 密钥
|
|
|
+ * @return : 返回token是否有效, true : 有效, false : 无效
|
|
|
+ */
|
|
|
+ private Map<String, String> getUserInfoApi(String accessToken, String openid) {
|
|
|
+ Map<String, String> paramMap = new HashMap<>(3);
|
|
|
+ paramMap.put("accessToken", accessToken);
|
|
|
+ paramMap.put("openid", openid);
|
|
|
+ paramMap.put("lang", "zh_CN");
|
|
|
+ //拼接url请求参数
|
|
|
+ Map<String, String> resultMap = new HashMap<>();
|
|
|
+ try {
|
|
|
+ String uri = URIUtil.fillUrlParams(ApiUrlConstant.VX_WEB_USER_INFO_URL, paramMap, Boolean.TRUE);
|
|
|
+ String result = HttpUtil.get(uri);
|
|
|
+ if (Strings.isNotBlank(result)) {
|
|
|
+ resultMap = JsonUtil.toMap(result, Map.class, String.class);
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("web获取用户信息异常");
|
|
|
+ throw new BaseException("web获取用户信息异常");
|
|
|
+ }
|
|
|
+ return resultMap;
|
|
|
+ }
|
|
|
+
|
|
|
+}
|