Issues (27)

src/Gateways/Dingtalk.php (3 issues)

Labels
1
<?php
2
/**
3
 * 钉钉开放平台 https://open.dingtalk.com/
4
 * api接口文档: https://open.dingtalk.com/document/orgapp-server/obtain-identity-credentials
5
 */
6
namespace tinymeng\OAuth2\Gateways;
7
8
use tinymeng\OAuth2\Connector\Gateway;
9
use tinymeng\OAuth2\Exception\OAuthException;
10
use tinymeng\OAuth2\Helper\ConstCode;
11
12
class Dingtalk extends Gateway
13
{
14
    const API_BASE = 'https://api.dingtalk.com/';
15
    protected $AuthorizeURL = 'https://login.dingtalk.com/oauth2/auth';
16
    protected $AccessTokenURL = 'https://api.dingtalk.com/v1.0/oauth2/userAccessToken';
17
    protected $UserInfoURL = 'https://api.dingtalk.com/v1.0/contact/users/me';
18
19
    /**
20
     * 得到跳转地址
21
     */
22
    public function getRedirectUrl()
23
    {
24
        $this->switchAccessTokenURL();
0 ignored issues
show
The method switchAccessTokenURL() does not exist on tinymeng\OAuth2\Gateways\Dingtalk. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

24
        $this->/** @scrutinizer ignore-call */ 
25
               switchAccessTokenURL();

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
25
        $params = [
26
            'client_id'     => $this->config['app_id'],
27
            'redirect_uri'  => $this->config['callback'],
28
            'response_type' => $this->config['response_type'],
29
            'scope'         => $this->config['scope'] ?: 'openid',
30
            'state'         => $this->config['state'] ?: '',
31
            'prompt'        => 'consent'
32
        ];
33
        return $this->AuthorizeURL . '?' . http_build_query($params);
34
    }
35
36
    /**
37
     * 获取当前授权用户的openid标识
38
     */
39
    public function openid()
40
    {
41
        $this->getToken();
42
        return $this->token['openId'] ?? '';
43
    }
44
45
    /**
46
     * 获取格式化后的用户信息
47
     */
48
    public function userInfo()
49
    {
50
        $result = $this->getUserInfo();
51
52
        $userInfo = [
53
            'open_id'      => $this->openid(),
54
            'union_id'     => $this->token['unionId'] ?? '',
55
            'channel'      => ConstCode::TYPE_DINGTALK,
56
            'nickname'     => $result['nick'] ?? '',
57
            'gender'       => ConstCode::GENDER,
58
            'avatar'       => $result['avatarUrl'] ?? '',
59
            'type'         => ConstCode::getTypeConst(ConstCode::TYPE_DINGTALK, $this->type),
60
            'access_token' => $this->token['accessToken'] ?? '',
61
            'native'       => $result
62
        ];
63
        return $userInfo;
64
    }
65
66
    /**
67
     * 获取原始接口返回的用户信息
68
     */
69
    public function getUserInfo()
70
    {
71
        $this->getToken();
72
        
73
        $headers = [
74
            'x-acs-dingtalk-access-token' => $this->token['accessToken']
75
        ];
76
        
77
        $data = $this->get($this->UserInfoURL, [], $headers);
78
        return json_decode($data, true);
79
    }
80
81
    /**
82
     * 获取access_token
83
     */
84
    protected function getAccessToken()
85
    {
86
        $params = [
87
            'clientId'     => $this->config['app_id'],
88
            'clientSecret' => $this->config['app_secret'],
89
            'code'         => isset($_REQUEST['code']) ? $_REQUEST['code'] : '',
90
            'grantType'    => 'authorization_code'
91
        ];
92
        
93
        $response = $this->post($this->AccessTokenURL, $params);
94
        $response = json_decode($response, true);
0 ignored issues
show
It seems like $response can also be of type true; however, parameter $json of json_decode() does only seem to accept string, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

94
        $response = json_decode(/** @scrutinizer ignore-type */ $response, true);
Loading history...
95
        
96
        if (!isset($response['accessToken'])) {
97
            throw new OAuthException('获取钉钉 access_token 出错:' . json_encode($response));
98
        }
99
        return $response;
100
    }
101
102
    /**
103
     * 检验授权凭证AccessToken是否有效
104
     */
105
    public function validateAccessToken($accessToken = null)
106
    {
107
        try {
108
            $accessToken = $accessToken ?? $this->token['accessToken'];
109
            $headers = [
110
                'x-acs-dingtalk-access-token' => $accessToken
111
            ];
112
            $data = $this->get($this->UserInfoURL, [], $headers);
113
            $data = json_decode($data, true);
114
            return isset($data['nick']);
115
        } catch (\Exception $e) {
116
            return false;
117
        }
118
    }
119
120
    /**
121
     * 刷新AccessToken续期
122
     */
123
    public function refreshToken($refreshToken)
124
    {
125
        $params = [
126
            'clientId'     => $this->config['app_id'],
127
            'clientSecret' => $this->config['app_secret'],
128
            'grantType'    => 'refresh_token',
129
            'refreshToken' => $refreshToken,
130
        ];
131
        
132
        $response = $this->post($this->AccessTokenURL, $params);
133
        $response = json_decode($response, true);
0 ignored issues
show
It seems like $response can also be of type true; however, parameter $json of json_decode() does only seem to accept string, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

133
        $response = json_decode(/** @scrutinizer ignore-type */ $response, true);
Loading history...
134
        
135
        if (isset($response['accessToken'])) {
136
            $this->token = $response;
137
            return true;
138
        }
139
        return false;
140
    }
141
}