百搜论坛欢迎您的加入!
adimg adimg
 
昨日:篇  今日:篇   总帖:篇   会员:
博主最大Lv63   
以Thinkphp3.2为基础的QQ第三方认证登录扩展类     

基于Thinkphp3.2的QQ第三方认证登录扩展类

基于Thinkphp3.2的qq第三方认证登录扩展类,其实以下类也是我从TP官网收集整理得来的,稍微做了一下修改和完善。

这里我将文件放存在“/Application/Common/Lib/Qqconnect.class.php”。(其实这个文件路径根据自己喜好来放)

实例化

1

$Qqconnect = new \Common\Lib\Qqconnect();

在__construct方法中你可以直接写你的app_id、app_key和回调地址
也可以根据自己的喜好,改一下代码传参或者写到配置文件。

调用方法:

1. 在qq的登录按钮的方法中调用getAuthCode方法

1

2

$qqobj=new \Org\Util\Qqconnect();

$qqobj->getAuthCode();

2.在回调地址的方法中调用getUsrInfo方法

1

2

$qqobj=new \Org\Util\Qqconnect();

$result=$qqobj->getUsrInfo();

3.getAuthCode方法中的参数scope根据自身需要添加值get_user_info,list_album,upload_pic,do_like。

Qqconnect.class.php

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

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

<?php

// +----------------------------------------------------------------------

// | Copyright (c) 2015.

// +----------------------------------------------------------------------

// | Author: qiandutianxia <852997402@qq.com>

// +----------------------------------------------------------------------

namespace Common\Lib;

/**

 *  qq第三方登录认证

 */

class Qqconnect {

    private static $data;

    //APP ID

    private $app_id="";

    //APP KEY

    private $app_key="";

    //回调地址

    private $callBackUrl="";

    //Authorization Code

    private $code="";

    //access Token

    private $accessToken="";

    private $openid="";

  

    public function __construct(){

        $this->app_id="";

        $this->app_key="";

        $this->callBackUrl=""; //你的回调地址

        //检查用户数据

        if(empty($_SESSION['QC_userData'])){

            self::$data = array();

        }else{

            self::$data = $_SESSION['QC_userData'];

        }

    }

  

  

    //获取Authorization Code

    public function getAuthCode(){

        $url="https://graph.qq.com/oauth2.0/authorize";

        $param['response_type']="code";

        $param['client_id']=$this->app_id;

        $param['redirect_uri']=$this->callBackUrl;

  

        //生成唯一随机串防CSRF攻击

        $state = md5(uniqid(rand(), TRUE));

        $_SESSION['state']=$state;

        $param['state']=$state;

        $param['scope']="get_user_info";

        $param =http_build_query($param,'','&');

        $url=$url."?".$param;

        header("Location:".$url);

    }

  

    //通过Authorization Code获取Access Token

    private function _getAccessToken(){

        $this->code=$_GET['code'];

        $url="https://graph.qq.com/oauth2.0/token";

        $param['grant_type']="authorization_code";

        $param['client_id']=$this->app_id;

        $param['client_secret']=$this->app_key;

        $param['code']=$this->code;

        $param['redirect_uri']=$this->callBackUrl;

        $param =http_build_query($param,'','&');

        $url=$url."?".$param;

        return $this->getUrl($url);

    }

  

    //获取openid

    public function _setOpenID(){

        $rzt=$this->_getAccessToken();

        parse_str($rzt,$data);

        $this->accessToken=$data['access_token'];

        $url="https://graph.qq.com/oauth2.0/me";

        $param['access_token']=$this->accessToken;

        $param =http_build_query($param,'','&');

        $url=$url."?".$param;

        $response=$this->getUrl($url);

  

        //--------检测错误是否发生

        if(strpos($response, "callback") !== false){

            $lpos = strpos($response, "(");

            $rpos = strrpos($response, ")");

            $response = substr($response, $lpos + 1, $rpos - $lpos -1);

        }

        $user = json_decode($response);

  

        if(isset($user->error)){

            exit("错误代码:100007");

        }

          

        return $user->openid;

    }

  

  

    //获取信息

    public function getUserInfo(){

        if($_GET['state'] != $_SESSION['state']){

            exit("错误代码:300001");

        }

  

        $openid=$this->_setOpenID();

        if(empty($openid)){

            return false;

        }

        session('openid',$openid);

        $url="https://graph.qq.com/user/get_user_info";

        $param['access_token']=$this->accessToken;

        $param['oauth_consumer_key']=$this->app_id;

        $param['openid']=$openid;

        $param =http_build_query($param,'','&');

        $url=$url."?".$param;

        $rzt=$this->getUrl($url);

        return $rzt;

    }

  

    public function getOpenId(){

        if($_GET['state'] != $_SESSION['state']){

            exit("错误代码:300001");

        }

        $rzt=$this->_getAccessToken();

        parse_str($rzt,$data);

        $this->accessToken=$data['access_token'];

        $url="https://graph.qq.com/oauth2.0/me";

        $param['access_token']=$this->accessToken;

        $param =http_build_query($param,'','&');

        $url=$url."?".$param;

        $response=$this->getUrl($url);

  

        //--------检测错误是否发生

        if(strpos($response, "callback") !== false){

            $lpos = strpos($response, "(");

            $rpos = strrpos($response, ")");

            $response = substr($response, $lpos + 1, $rpos - $lpos -1);

        }

        $info = object_array(json_decode($response));

        $qq['access_token'] = $this->accessToken;

        $qq['openid']       = $info['openid'];

        session('qq',$qq);

        return $info['openid'];

    }

  

  

    public function getInfo($openid='',$accessToken=''){

        $url="https://graph.qq.com/user/get_user_info";

        $param['oauth_consumer_key']=$this->app_id;

        $param['access_token']=$accessToken;

        $param['openid']=$openid;

        $param =http_build_query($param,'','&');

        $url=$url."?".$param;

        $rzt=$this->getUrl($url);

        $info = object_array(json_decode($rzt));

        return $info;

    }

  

  

    //CURL GET

    private function getUrl($url){

        $ch = curl_init($url);

        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

        curl_setopt($ch, CURLOPT_TIMEOUT, 5);

        if (!empty($options)){

            curl_setopt_array($ch, $options);

        }

        $data = curl_exec($ch);

        curl_close($ch);

        return $data;

    }

  

  

    //CURL POST

    private function postUrl($url,$post_data){

        $ch = curl_init();

        curl_setopt($ch, CURLOPT_POST, 1);

        curl_setopt($ch, CURLOPT_URL, $url);

        curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);

        ob_start();

        curl_exec($ch);

        $result = ob_get_contents();

        ob_end_clean();

        return $result;

    }

}

下面是控制器中的代码

LoginController.class.php该文件主要包含两个方式

点击QQ登陆的时候访问的地址

1

2

3

4

public function qq_login(){

        $Qqconnect = new \Common\Lib\Qqconnect();

        $Qqconnect->getAuthCode();

    }

回调访问地址

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

public function callback(){

        $Qqconnect = new \Common\Lib\Qqconnect();

        $openid = $Qqconnect->getOpenId();

        $qq = session('qq');

  

  

  

        $Member = M('Member');

        $map = array();

        $map['openid'] = $openid;

        $userInfo = $Member->where($map)->find();

  

  

        if(!empty($userInfo)){

            $this->success('登陆成功!',U('Member/index'));

        }else{

            $Qqconnect = new \Common\Lib\Qqconnect();

            $userInfo = $Qqconnect->getInfo($qq['openid'],$qq['access_token']);

            print_r($userInfo);

            exit;

    }

以上只是简单的示例,大家可以参考一下再进行修改和完善。如有不明白的地方可以留言讨论。

推荐教程:《PHP视频教程

以上就是以Thinkphp3.2为基础的QQ第三方认证登录扩展类的详细内容

 0  已被阅读了1327次  楼主 2020-06-23 09:28:13
回复列表

回复:以Thinkphp3.2为基础的QQ第三方认证登录扩展类

联系站长 友链申请桂ICP备19000949号-1     桂ICP备19000949号-1
您的IP:3.17.150.163,2024-05-07 03:48:43,Processed in 0.07114 second(s).
免责声明: 本网不承担任何由内容提供商提供的信息所引起的争议和法律责任。
Powered by HadSky 7.12.9
已有0次打赏
(0) 分享
分享
取消
免责声明
1、本站资源,均来自网络,版权归原作者,所有资源和文章仅限用于学习和研究目的 。
2、不得用于商业或非法用途,否则,一切责任由该用户承担 !
如果觉得本文还不错请点个赞或者打赏点轻币哦~
拒绝伸手党,拿走请回复,尊重楼主,尊重你我他~

侵权删除请致信 E-Mail:207882320@qq.com