微信公众号授权以及微信扫码授权登录
1.进行配置
首先我为了方便先新建了settings.php 配置文件。
配置信息
<?php
// +----------------------------------------------------------------------
// +----------------------------------------------------------------------
return array(
//微信配置
'weixin' => array(
'APP_KEY' => '您的APP_KEY', //应用注册成功后分配的 APP ID
'APP_SECRET' => '您的APP_SECRET', //应用注册成功后分配的KEY
'CALLBACK' => urlencode('http://*******/Home/Index/weixin'), //定义回调URL通用的URL
'CODE' => 'https://open.weixin.qq.com/connect/qrconnect' //定义微信的code地址
),
//微信公众号授权登
'oauth' => array(
'APP_KEY' => '您的APP_KEY', //应用注册成功后分配的 APP ID
'APP_SECRET' => '您的APP_SECRET', //应用注册成功后分配的KEY
'CALLBACK' => urlencode('http://******/Home/Index/oauth'), //定义回调URL通用的URL
'CODE' => 'https://open.weixin.qq.com/connect/oauth2/authorize' //定义微信的code地址
),
);
2.微信扫码登录微信授权登录
接收type值,如果是weixin是扫码登录,oauth是微信授权登录
<?php
namespace Home\Controller;
use Think\Controller;
class IndexController extends BaseController {
private $settings = '';
public function __construct($type)
{
parent::__construct();
//读取三方登录的配置文件
$this -> settings = include( APP_PATH . 'Home/Conf/settings.php' );
//微信登录code
if(I('get.type') == 'weixin') {
// var_dump($this -> settings['weixin']['CODE']);die;
header("Location:".$this -> settings['weixin']['CODE']."?appid=".$this -> settings['weixin']['APP_KEY']."&redirect_uri=".$this -> settings['weixin']['CALLBACK']."&response_type=code&scope=snsapi_login&state=STATE#wechat_redirect");
}
//微信授权登录
if(I('get.type') == 'oauth') {
// var_dump($this -> settings['weixin']['CODE']);die;
header("Location:".$this -> settings['oauth']['CODE']."?appid=".$this -> settings['oauth']['APP_KEY']."&redirect_uri=".$this -> settings['oauth']['CALLBACK']."&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect");
}
}
//微信扫码登录回去code
public function weixin()
{
if(isset($_GET['code']) && $_GET['code']) {
// var_dump($_GET['code']);die;
$code = $_GET['code'];
$accUrl = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid='.$this -> settings['weixin']['APP_KEY'].'&secret='.$this -> settings['weixin']['APP_SECRET'].'&code='.$code.'&grant_type=authorization_code';
$json = curl_get_https($accUrl);
$json = json_decode($json);
$checkurl = "https://api.weixin.qq.com/sns/userinfo?access_token=".$json->access_token."&openid=".$json->openid;
$data = json_decode(curl_get_https($checkurl));
// var_dump($data-> unionid);die;
//定义数组
$result = array();
$result = M('user') -> where(array('uid' => $data-> unionid)) -> find();
//执行登录操作
if(! $result) {
//写入数据库
$userinfo = array(
'uid' => $data -> unionid,
'name' => $data -> nickname,
'sex' => $data -> sex,
'addtime' => time()
);
$result['id'] = M('user') ->add($userinfo);
// $result['username'] = $data -> headimgurl;
// $result['headpic'] = $data -> nickname;
}
//执行写入session
$_SESSION['userinfo']['uid'] = $result['id'];
$_SESSION['userinfo']['name'] = $result['name'];
redirect('/');
} else {
echo '<script>alert("登录失败");location="/"</script>';die;
}
}
//微信授权登录
public function oauth(){
if(isset($_GET['code']) && $_GET['code']) {
$code = $_GET['code'];
$accUrl = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid='.$this -> settings['oauth']['APP_KEY'].'&secret='.$this -> settings['oauth']['APP_SECRET'].'&code='.$code.'&grant_type=authorization_code';
$json = curl_get_https($accUrl);
$json = json_decode($json);
$checkurl = "https://api.weixin.qq.com/sns/userinfo?access_token=".$json->access_token."&openid=".$json->openid;
$data = json_decode(curl_get_https($checkurl));
$result = array();
$result = M('user') -> where(array('uid' => $data-> unionid)) -> find();
//执行登录操作
if(! $result) {
//写入数据库
$userinfo = array(
'uid' => $data -> unionid,
'name' => $data -> nickname,
'sex' => $data -> sex,
'addtime' => time()
);
$result['id'] = M('user') ->add($userinfo);
// $result['username'] = $data -> headimgurl;
// $result['headpic'] = $data -> nickname;
}
//执行写入session
$_SESSION['userinfo']['uid'] = $result['id'];
$_SESSION['userinfo']['name'] = $result['name'];
redirect('/');
} else {
echo '<script>alert("登录失败");location="/"</script>';die;
}
}
}
//获取HTTPS get值
function curl_get_https($url){
$curl = curl_init(); // 启动一个CURL会话
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // 跳过证书检查
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, true); // 从证书中检查SSL加密算法是否存在
$tmpInfo = curl_exec($curl); //返回api的json对象
//关闭URL请求
curl_close($curl);
return $tmpInfo; //返回json对象
}
注意:
- 微信授权的域名要在公众号网页授权相绑定