admin管理员组

文章数量:1559119

微信网页授权

首先创建微信的第三方类库 项目是tp5 所以我就放在了\extend\oauth\wxlogin\wxlogin.php;

appid = 'wx0000090'; //微信appid
        $this->callbackurl  = 'http://' . $_server['http_host'] . '/member/member/wxback';//回调地址
        $this->appsecret    = 'ca6a577393a';//密钥
    }
    /**
     * 获取微信url
     * @return [type] [description]
     */
    public function wxindex
    {
        //--微信登录-----生成唯一随机串防csrf攻击
        $state = md5(uniqid(rand(), true));
        session::set('wx_state', $state); //存到session
        $callback = urlencode($this->callbackurl);
        //'https://open.weixin.qq/connect/qrconnect?appid=appid&redirect_uri=redirect_uri&response_type=code&scope=scope&state=state#wechat_redirect';
        $wxurl = "https://open.weixin.qq/connect/qrconnect?appid="
        . $this->appid . "&redirect_uri="
            . $callback . "&response_type=code&scope=snsapi_login&state="
            . $state . "#wechat_redirect";
        return $wxurl;die;
        // header("location: $wxurl");
    }
    /**
     * 获取微信返回信息
     * @return [type] [description]
     */
    public function wxgetuserinfo(){
    	if ($_get['state'] != session::get('wx_state')) {
    	    return ['status'=>-1,'msg'=>'请求失败'];
    	}
    	$url = 'https://api.weixin.qq/sns/oauth2/access_token?appid=' . $this->appid . '&secret=' . $this->appsecret . '&code=' . $_get['code'] . '&grant_type=authorization_code';
    	$arr = tc;
    	$arr = json_decode($arr,true);
    	//得到 access_token 与 openid
    	$url       = 'https://api.weixin.qq/sns/userinfo?access_token=' . $arr['access_token'] . '&openid=' . $arr['openid'] . '&lang=zh_cn';
    	$user_info = tc;
    	$user_info = json_decode($user_info,true);
    	return ['status'=>1,'msg'=>'成功','data'=>$user_info];
    }
}

然后在控制器中调用  返回微信登录的url && 处理用户的信息

    /**
     * 获取微信登录url
     * @return [type] [description]
     */
    public function wxlogin
    {
        $weixin = new \oauth\wxlogin\wxlogin;
        $wxurl  = $weixin->wxindex;
        return $wxurl;
    }
     /**
     * 微信回调接收用户信息 && 处理登录 && 注册
     * @return [type] [description]
     */
    public function wxback()
    {
        $weixin = new \oauth\wxlogin\wxlogin;
        $wxdata = $weixin->wxgetuserinfo();
        if ($wxdata['status'] != 1) {jsonencode('数据有误');}
        //进行项目逻辑处理开始
        //结束
    }

使用qq登录

首先创建qq需要的类库 

tp5中 我放在了\extend\oauth\qqlogin中;里面有两个文件,类库qqconnent.php和调用类库的qqlogin.php

qqconnect.php内容 主要调用在qqlogin.php中

 '成功',
        100000 => '缺少参数response_type或response_type非法',
        100001 => '缺少参数client_id',
        100002 => '缺少参数client_secret',
        100003 => 'http head中缺少authorization',
        100004 => '缺少参数grant_type或grant_type非法',
        100005 => '缺少参数code',
        100006 => '缺少refresh token',
        100007 => '缺少access token',
        100008 => '该appid不存在',
        100009 => 'client_secret(即appkey)非法',
        100010 => '回调地址不合法,常见原因请见:回调地址常见问题及修改方法',
        100011 => 'app不处于上线状态',
        100012 => 'http请求非post方式',
        100013 => 'access token非法',
        100014 => 'access token过期。 token过期时间为3个月。如果存储的access token过期,请重新走登录流程,根据使用authorization_code获取access_token或使用implicit_grant方式获取access_token获取新的access token值',
        100015 => 'access token废除。 token被回收,或者被用户删除。请重新走登录流程,根据使用authorization_code获取access_token或使用implicit_grant方式获取access_token获取新的access token值',
        100016 => 'access token验证失败',
        100017 => '获取appid失败',
        100018 => '获取code值失败',
        100019 => '用code换取access token值失败',
        100020 => 'code被重复使用',
        100021 => '获取access token值失败',
        100022 => '获取refresh token值失败',
        100023 => '获取app具有的权限列表失败',
        100024 => '获取某openid对某appid的权限列表失败',
        100025 => '获取全量api信息、全量分组信息',
        100026 => '设置用户对某app授权api列表失败',
        100027 => '设置用户对某app授权时间失败',
        100028 => '缺少参数which',
        100029 => '错误的http请求',
        100030 => '用户没有对该api进行授权,或用户在腾讯侧删除了该api的权限。请用户重新走登录、授权流程,对该api进行授权',
        100031 => '第三方应用没有对该api操作的权限。请发送邮件进行openapi权限申请',
        100032 => '过载,一开始未细分时可以用',
        100033 => '缺少uin参数',
        100034 => '缺少skey参数',
        100035 => '用户未登陆',
        100036 => 'refreshtoken失效',
        100037 => 'refreshtoken已过期',
        100038 => 'refreshtoken已废除',
        100039 => 'refreshtoken到达调用上限',
        100040 => 'refreshtoken的appkey非法',
        100041 => 'refreshtoken的appid非法',
        100042 => 'refreshtoken非法',
        100043 => 'app处于暂停状态',
        100044 => 'md5校验失败',
        100045 => '用户改密token失效',
        100046 => 'g_tk校验失败',
        100048 => '没有设置companyid',
        100049 => 'appid没有权限(get_unionid)',
        100050 => 'openid解密失败,一般是openid和appid不匹配',
        100051 => '调试模式无权限',
    ];
    #接口地址
    private $link = [
        'oauth'          => 'https://graph.qq/oauth2.0/authorize', #获取authorization code
        'getaccesstoken' => 'https://graph.qq/oauth2.0/token', #获取或刷新access token
        'getopenid'      => 'https://graph.qq/oauth2.0/me', #access_token
        'getuserinfo'    => 'https://graph.qq/user/get_user_info', #获取用户基本信息
    ];
    #appid
    private $appid;
    #appkey
    private $appkey;
    #请求用户授权时向用户显示的可进行授权的列表get_user_info,list_album...逗号分开,默认get_user_info
    private $scope;
    #回调地址(务必于应用上填写的一致)
    private $redirect_uri;
    #错误代码
    private $errcode;
    #错误信息
    private $errmsg;
    #单例
    private static $_instance;
    public function __construct()
    {
        $this->appid        = '10789456';//申请的appid  (qq互联)
        $this->appkey       = 'd6ee34aa24df27';//申请的appkey
        $this->redirect_uri = request()->domain() . '/member/member/qqaction';
    }
    public static function main()
    {
        if (!isset(self::$_instance)) {
            if (func_num_args() < 2) {
                exit('实例化-参数个数错误!');
            }
            $args            = func_get_args();
            self::$_instance = new self($args[0], $args[1]);
        }
        return self::$_instance;
    }
    /**
     *获取错误信息代码
     *
     * @param string|array $flag 1:错误代码,2:错误信息,others:数组
     * @return  string|array
     */
    public function geterror($flag = 0)
    {
        switch ($flag) {
            case 0:$errmsg = $this->errmsg;
                break;
            case 1:$errmsg = $this->errcode;
                break;
            default:$errmsg = [
                    'errcode' => $this->errcode,
                    'errmsg'  => $this->errmsg,
                ];
                break;
        }
        return $errmsg;
    }
    #设置回调地址
    public function setredirecturi($uri)
    {
        $this->redirect_uri = $uri;
    }
    #获取回调地址
    public function getredirecturi()
    {
        return $this->redirect_uri;
    }
    /**
     *setscope 设置授权列表
     *
     * @param string|array $scope 授权列表,逗号分隔
     * @return void
     */
    public function setscope($scope)
    {
        if (is_array($scope)) {
            $scope = implode(',', $scope);
        }
        $this->scope = $scope;
    }
    #获取授权列表 true 数组,默认false 逗号分隔字符串
    public function getscope($flag = false)
    {
        if ($flag) {
            return explode(',', $this->scope);
        }
        return $this->scope;
    }
    /**
     *getoauthurl 获取授权地址
     */
    public function getoauth
    {
        $keysarr = [
            'response_type' => 'code',
            'client_id'     => $this->appid,
            'state'         => $state,
            'redirect_uri'  => urlencode($this->redirect_uri),
            'display'       => $display,
            'scope'         => $this->scope,
        ];
        return self::combine;
    }
    /**
     *getaccesstoken 通过code获取access_token
     *
     * @param string $code 授权获取的code
     * @return string
     */
    public function getaccesstoken($code)
    {
        $keysarr = [
            'grant_type'    => 'authorization_code',
            'client_id'     => $this->appid,
            'client_secret' => $this->appkey,
            'redirect_uri'  => urlencode($this->redirect_uri),
            'code'          => $code,
        ];
        $link    = self::combine;
        $resdata = self::qqc;
        //--------检测错误是否发生
        if (strpos($resdata, "callback") !== false) {
            $lpos    = strpos($resdata, "(");
            $rpos    = strrpos($resdata, ")");
            $resdata = substr($resdata, $lpos   1, $rpos - $lpos - 1);
            $resdata = json_decode($resdata, true);
            if (isset($resdata['error'])) {
                $this->errcode = $resdata['error'];
                $this->errmsg  = $this->err[$resdata['error']];
                return false;
            }
        } else {
            parse_str($resdata, $param);
            return $param['access_token'];
        }
    }
    /**
     *getuseropenid 通过access_token获取用户openid
     *
     * @param string $access_token
     * @return string
     */
    public function getuseropenid($access_token)
    {
        $link     = self::combine;
        $response = self::qqc;
        //--------检测错误是否发生
        if (strpos($response, "callback") !== false) {
            $lpos     = strpos($response, "(");
            $rpos     = strrpos($response, ")");
            $response = substr($response, $lpos   1, $rpos - $lpos - 1);
        }
        $user = json_decode($response, true);
        if (isset($user['error'])) {
            $this->errcode = $user['code'];
            $this->errmsg  = $this->err[$user['code']];
            return false;
        }
        return $user['openid'];
    }
    /**
     *getuserinfo 获取用户基本信息
     *
     * @param string $access_token
     * @param string $openid
     * @return boolean|array
     */
    public function getuserinfo($access_token, $openid)
    {
        $link = self::combine;
        $resdata = self::qqc;
        return self::checkresult($resdata);
    }
    /**
     *checkresult 请求结果处理
     *
     * @param string $resdata 待检测数据
     * @return boolean|array
     */
    public function checkresult($resdata)
    {
        $resdata = json_decode($resdata, true);
        if (!$resdata || $resdata['ret'] != 0) {
            $this->errcode = $resdata['ret'];
            $this->errmsg  = $resdata['msg'];
            return false;
        } else {
            return $resdata;
        }
    }
    /**
     * combineurl 拼接url
     * @param string $baseurl   基于的url
     * @param array  $keysarr   参数列表数组
     * @return string           返回拼接的url
     */
    public static function combine
    {
        $combined = $baseurl . "?";
        $valuearr = array();
        foreach ($keysarr as $key => $val) {
            $valuearr[] = "$key=$val";
        }
        $keystr = implode("&", $valuearr);
        $combined .= ($keystr);
        return $combined;
    }
	/**
	 * curl请求
	 */
    public function qqc
    {
        $ch = curl_init();
        curl_setopt($ch, curlopt_url, $url);
        curl_setopt($ch, curlopt_returntransfer, 1);
        curl_setopt($ch, curlopt_ssl_verifypeer, 0);
        curl_setopt($ch, curlopt_ssl_verifyhost, 0);
        curl_setopt($ch, curlopt_header, 0);
        $type = strtolower($type);
        switch ($type) {
            case 'get':
                break;
            case 'post':
                //post请求配置
                curl_setopt($ch, curlopt_post, 1);
                curl_setopt($ch, curlopt_postfields, $data);
                break;
        }
        $result = curl_exec($ch);
        curl_close($ch);
        return $result;
    }
}

qqlogin.php内容

getoauth;
    }
    public function getuserinfo()
    {
        $code = $_get['code'];
        $state = $_get['state'];
        if ($state != session::get('state')) {
            return ['status'=>-1,'msg'=>'登录有误,请重新登录'];
        }
        $qqconnect = new \oauth\qqlogin\qqconnect();
        #获取access_token
        $access_token = $qqconnect->getaccesstoken($code);
        if (!$access_token) {
            return ['status' => -1, 'msg' => $qqconnect->geterror()];
        }
        #获取openid
        $openid = $qqconnect->getuseropenid($access_token);
        if (!$openid) {
            return ['status' => -1, 'msg' => $qqconnect->geterror()];
        }
        #获取用户基本信息
        $userinfo = $qqconnect->getuserinfo($access_token, $openid);
        if (!$userinfo) {
            return ['status' => -1, 'msg' => $qqconnect->geterror()];
        }
        $result = array_merge($userinfo, ['openid' => $openid]);
        return ['status' => 1, 'msg' => '成功', 'data' => $result];
    }
}

然后在控制器中调用

    /**
     * qq登录url
     * @return [type] [description]
     */
    public function qqlogin
    {
        $qqconnect  = new \oauth\qqlogin\qqlogin();
        $qqloginurl = $qqconnect->qqlogin;
        return $qqloginurl;
    }
    //qq回调
    public function qqaction()
    {
        $qqconnect = new \oauth\qqlogin\qqlogin();
        $profile   = $qqconnect->getuserinfo();
        if ($profile['status'] != 1) {jsonencode('数据有误');}
        
        //逻辑处理
    }

 

本文标签: 网页qq