Line   A
last analyzed

Complexity

Total Complexity 12

Size/Duplication

Total Lines 130
Duplicated Lines 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
eloc 51
c 2
b 0
f 0
dl 0
loc 130
rs 10
wmc 12

7 Methods

Rating   Name   Duplication   Size   Complexity  
A getRedirectUrl() 0 13 2
A userInfo() 0 15 2
A getUserInfo() 0 10 2
A openid() 0 4 1
A call() 0 13 1
A parseToken() 0 7 2
A getToken() 0 16 2
1
<?php
2
3
namespace tinymeng\OAuth2\Gateways;
4
5
use tinymeng\OAuth2\Connector\Gateway;
6
use tinymeng\OAuth2\Exception\OAuthException;
7
use tinymeng\OAuth2\Helper\ConstCode;
8
use tinymeng\OAuth2\Helper\Str;
9
10
/**
11
 * Class Line
12
 * 开发平台: https://developers.line.biz/en/
13
 * 接口文档: https://developers.line.biz/en/reference/line-login/#issue-access-token
14
 * @package tinymeng\OAuth2\Gateways
15
 * @Author: TinyMeng <[email protected]>
16
 * @Created: 2018/11/9
17
 */
18
class Line extends Gateway
19
{
20
    const API_BASE            = 'https://api.line.me/v2/';
21
    protected $AuthorizeURL   = 'https://access.line.me/oauth2/v2.1/authorize';
22
    protected $AccessTokenURL = 'https://api.line.me/oauth2/v2.1/token';
23
    protected $headers = [
24
        'Content-Type: application/x-www-form-urlencoded'
25
    ];
26
27
    /**
28
     * 得到跳转地址
29
     */
30
    public function getRedirectUrl()
31
    {
32
        //存储state
33
        $this->saveState();
34
        //登录参数
35
        $params = [
36
            'response_type' => $this->config['response_type'],
37
            'client_id'     => $this->config['app_id'],
38
            'redirect_uri'  => $this->config['callback'],
39
            'scope'         => $this->config['scope'],
40
            'state'         => $this->config['state'] ?: Str::random(),
41
        ];
42
        return $this->AuthorizeURL . '?' . http_build_query($params);
43
    }
44
45
    /**
46
     * 获取当前授权用户的openid标识
47
     */
48
    public function openid()
49
    {
50
        $result = $this->getUserInfo();
51
        return $result['userId'];
52
    }
53
54
    /**
55
     * 获取格式化后的用户信息
56
     */
57
    public function userInfo()
58
    {
59
        $result = $this->getUserInfo();
60
61
        $userInfo = [
62
            'open_id'  => $result['userId'],
63
            'access_token'=> $this->token['access_token'] ?? '',
64
            'union_id'=> $result['userId'],
65
            'channel' => ConstCode::TYPE_LINE,
66
            'nickname'    => $result['displayName'],
67
            'gender'  => ConstCode::GENDER, //line不返回性别信息
68
            'avatar'  => isset($result['pictureUrl']) ? $result['pictureUrl'] . '/large' : '',
69
            'native'   => $result,
70
        ];
71
        return $userInfo;
72
    }
73
74
    /**
75
     * 获取原始接口返回的用户信息
76
     */
77
    public function getUserInfo()
78
    {
79
        $this->getToken();
80
81
        $data = $this->call('profile', $this->token, 'GET');
82
83
        if (isset($data['error'])) {
84
            throw new OAuthException($data['error_description']);
85
        }
86
        return $data;
87
    }
88
89
    /**
90
     * 发起请求
91
     *
92
     * @param string $api
93
     * @param array $params
94
     * @param string $method
95
     * @return array
96
     */
97
    private function call($api, $params = [], $method = 'GET')
98
    {
99
        $method  = strtoupper($method);
100
        $request = [
101
            'method' => $method,
102
            'uri'    => self::API_BASE . $api,
103
        ];
104
105
        $headers = ['Authorization: ' . $this->token['token_type'] . ' ' . $this->token['access_token']];
106
107
        $data = $this->$method($request['uri'], $params, $headers);
108
109
        return json_decode($data, true);
110
    }
111
112
113
    /**
114
     * Description:  获取AccessToken
115
     * @author: JiaMeng <[email protected]>
116
     * Updater:
117
     */
118
    protected function getToken(){
119
        if (empty($this->token)) {
120
            /** 验证state参数 */
121
            $this->checkState();
122
123
            /** 获取参数 */
124
            $params = $this->accessTokenParams();
125
            $params = http_build_query($params);
126
127
            /** 获取access_token */
128
            $token =  $this->post($this->AccessTokenURL, $params,$this->getHeaders());
0 ignored issues
show
Bug introduced by
$params of type string is incompatible with the type array expected by parameter $params of tinymeng\OAuth2\Connector\Gateway::post(). ( Ignorable by Annotation )

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

128
            $token =  $this->post($this->AccessTokenURL, /** @scrutinizer ignore-type */ $params,$this->getHeaders());
Loading history...
129
130
            /** 解析token值 */
131
            $this->token = $this->parseToken($token);
0 ignored issues
show
Bug introduced by
It seems like $token can also be of type true; however, parameter $token of tinymeng\OAuth2\Gateways\Line::parseToken() 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

131
            $this->token = $this->parseToken(/** @scrutinizer ignore-type */ $token);
Loading history...
132
        }else{
133
            return $this->token;
134
        }
135
    }
136
137
    /**
138
     * 解析access_token方法请求后的返回值
139
     * @param string $token 获取access_token的方法的返回值
140
     */
141
    protected function parseToken($token)
142
    {
143
        $token = json_decode($token, true);
144
        if (isset($token['error'])) {
145
            throw new OAuthException($token['error_description']);
146
        }
147
        return $token;
148
    }
149
}
150