jiangqs
2023-05-04 0bf618ca34814ee535c5d39387dc63532b4e726a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
package com.ruoyi.auth.service;
 
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.auth.config.QywxInnerConfig;
import com.ruoyi.auth.utils.RestUtils;
import com.ruoyi.common.core.constant.Constants;
import com.ruoyi.common.core.exception.ServiceException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
 
@Service
public class QywxInnerService {
 
    private final static Logger logger = LoggerFactory.getLogger("QywxInnerService");
 
    @Autowired
    private QywxInnerConfig qywxInnerConfig;
 
 
    public String getAccessToken(){
 
        String corpId = qywxInnerConfig.getCorpId();
        String agentSecret = qywxInnerConfig.getAgentSecret();
 
        String  accessTokenUrl = String.format(qywxInnerConfig.getAccessTokenUrl(), corpId, agentSecret);
        JSONObject response = RestUtils.get(accessTokenUrl);
        // 获取错误日志
        if(response.containsKey(Constants.QY_WX_ERR_CODE) && response.getInteger(Constants.QY_WX_ERR_CODE) != 0){
            logger.error(response.toString());
            throw new ServiceException("获取企业微信ACCESS_TOKEN异常");
        }
        return response.getString(Constants.QY_WX_ACCESS_TOKEN);
 
    }
 
 
    //********************************** H5应用 Oauth   *************************//
    /**
     * 构造网页授权链接
     * @param oauthRedirectUrl
     * @return
     */
    public String getOauthUrl(String oauthRedirectUrl){
//        应用授权作用域。
//        snsapi_base:静默授权,可获取成员的基础信息(UserId与DeviceId);
//        snsapi_userinfo:静默授权,可获取成员的详细信息,但不包含手机、邮箱等敏感信息;
//        snsapi_privateinfo:手动授权,可获取成员的详细信息,包含手机、邮箱等敏感信息(已不再支持获取手机号/邮箱)。
        String corpId = qywxInnerConfig.getCorpId();
        String state = qywxInnerConfig.getAuthorizeState();
        String agentId = qywxInnerConfig.getAgentId();
 
        // 构造网页授权链接 redirect_uri
        return String.format(qywxInnerConfig.getOauthUrl(), corpId, oauthRedirectUrl, agentId, state);
    }
 
    /**
     * 获取访问用户身份
     * 获取访问用户敏感信息
     * @param code
     * @return
     */
    public JSONObject getOauthUser(String code) {
        String accessToken = getAccessToken();
 
        // 获取访问用户身份
        String getOauthUrl = String.format(qywxInnerConfig.getOauthUserUrl(), accessToken, code);
        JSONObject response = RestUtils.get(getOauthUrl);
        if(response.containsKey(Constants.QY_WX_ERR_CODE) && response.getInteger(Constants.QY_WX_ERR_CODE) != 0){
            logger.error(response.toString());
            throw new ServiceException("获取企业微信信息异常");
        }
        logger.info("----------------userinfo-------------");
        logger.info(response.toString());
 
        //获取通讯录用户详情get
        String userId = response.getString(Constants.QY_WX_USER_ID);
        // 成员票据,最大为512字节,有效期为1800s。 scope为snsapi_privateinfo,获取访问用户敏感信息
        String userTicket = response.getString(Constants.QY_WX_USER_TICKET);
 
        // 获取用户详情 包含部门信息
        // String url = String.format(qywxInnerConfig.getUserDetailUrl(),accessToken,userId);
        // 获取访问用户敏感信息
        String url = String.format(qywxInnerConfig.getUserDetailUrlAuth(), accessToken);
        JSONObject json = new JSONObject();
        json.put(Constants.QY_WX_USER_TICKET, userTicket);
        JSONObject detailResponse = RestUtils.post(url, json);
        //获取错误日志
        if(detailResponse.containsKey(Constants.QY_WX_ERR_CODE) && detailResponse.getInteger(Constants.QY_WX_ERR_CODE) != 0){
            logger.error(detailResponse.toString());
            throw new ServiceException("获取企业微信信息异常");
        }
        logger.info("----------------userinfo detail -------------");
        logger.info(detailResponse.toString());
 
        return detailResponse;
    }
}