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('数据有误');}
//逻辑处理
}
j9九游会老哥俱乐部交流区的版权声明:本文标题:网站使用微信网页授权,qq登录 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dongtai/1727384872a1112289.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论