关于ThinkPHP微信授权登录,很久以前借鉴了这位大人的案例,可以整合实现PC微网站用户快速绑定登录,不过需要自行开发。
主页:https://github.com/PowerDos
案例主页:https://github.com/PowerDos/WeChatOAuth2.0
这里看下他写了个公共控制器OAuth2Controller。
<?php
namespace Home\Controller;
//作者:Gavin Github:https://github.com/PowerDos
use Think\Controller;
class OAuth2Controller extends Controller {
public function _initialize(){
//判断是否验证过
if((session("?userOpenid")&&session("?userSex"))||(session("?userOpenid")&&session("?userNickname"))){
//已验证过
if(!session("?userID")){
$this->redirect('Bind/Bind','',2,"<h1>请先绑定账号再使用,将自动跳转到绑定页面</h1>");
}
}else{
//进入验证
//方法放在./Application/Home/Common/function.php下
Check();
}
}
}
然后这里有个demo控制器继承了公共控制器。
<?php
namespace Home\Controller;
//作者:Gavin Github:https://github.com/PowerDos
class IndexController extends OAuth2Controller {
public function index(){
$this->show("这个是测试案例");
}
}
而且还在公共模块配置文件中做了相关的配置。
<?php
//作者:Gavin Github:https://github.com/PowerDos
//这里填入的TOKEN
define("TOKEN", "weixin");
//这里填入的你域名
define("_URL_","www.baidu.com");
//这里填入你公众号的APPID
define("_APPID_","");
//这里填入你公众号的APPSECRET
define('_APPSECRET_','');
return array(
//'配置项'=>'配置值'
'DB_TYPE' => 'mysql', // 数据库类型
'DB_HOST' => '127.0.0.1', // 服务器地址
'DB_NAME' => '', // 数据库名
'DB_USER' => '', // 用户名
'DB_PWD' => '', // 密码
'DB_PORT' => '3306', // 端口
'DB_PARAMS' => array(\PDO::ATTR_CASE => \PDO::CASE_NATURAL) ,
'MODULE_ALLOW_LIST' => array('Home','Admin'),//模块
'DEFAULT_MODULE' => 'Home',
'URL_ROUTER_ON' => true,
'URL_ROUTE_RULES'=>array(
'index$' => 'Home/Index/index', //定义路由
)
);
最后是实现获取用户信息的相关逻辑,这里放在了Home模块下的公共方法文件下。
<?php
//作者:Gavin Github:https://github.com/PowerDos
//检测用户信息
function Check(){
if(!session("?userOpenid")){
$data=getOpenid();
session('userOpenid',$data);
}else{
$data=session('userOpenid');
}
$model=M();
if($rst=$model->table('wUserInfo')->where("openid='{$data}'")->select()){
//设置SESSION
setSession($rst[0]);
return true;
}else{
//设置临时变量
if(!session("?status")){
unset($_GET['code']);
session("status","1");
}
//获取用户所以信息
getUserInfo();
}
}
//获取用户openid
function getOpenid(){
if(!$_GET['code']){
//获取当前的url地址
$rUrl=_URL_.__ACTION__.'.html';
$url="https://open.weixin.qq.com/connect/oauth2/authorize?appid="._APPID_."&redirect_uri=".$rUrl."&response_type=code&scope=snsapi_base&state=123456#wechat_redirect";
//跳转页面
redirect($url,0);
}else{
$aUrl="https://api.weixin.qq.com/sns/oauth2/access_token?appid="._APPID_."&secret="._APPSECRET_."&code=".$_GET['code']."&grant_type=authorization_code";
//获取网页授权access_token和openid等
$data=getHttp($aUrl);
return $data['openid'];
}
}
//获取用户详细信息
function getUserInfo(){
if(!$_GET['code']){
//获取当前的url地址
$rUrl=_URL_.__ACTION__.'.html';
$url="https://open.weixin.qq.com/connect/oauth2/authorize?appid="._APPID_."&redirect_uri=".$rUrl."&response_type=code&scope=snsapi_userinfo&state=123456#wechat_redirect";
//跳转页面
redirect($url,0);
}else{
$getOpenidUrl="https://api.weixin.qq.com/sns/oauth2/access_token?appid="._APPID_."&secret="._APPSECRET_."&code=".$_GET['code']."&grant_type=authorization_code";
//获取网页授权access_token和openid等
$data=getHttp($getOpenidUrl);
$getUserInfoUrl="https://api.weixin.qq.com/sns/userinfo?access_token=".$data['access_token']."&openid=".$data['openid']."&lang=zh_CN";
//获取用户数据
$userInfo=getHttp($getUserInfoUrl);
//默认设置头像是132*132的
$userInfo['headimgurl']=substr($userInfo['headimgurl'],0,strlen($userInfo['headimgurl'])-1);
$userInfo['headimgurl']=$userInfo['headimgurl'].'132';
// 将信息插入数据库
$userInfo['addtime']=date("Y-m-d H:i:s");
//删除language元素
unset($userInfo['language']);
$model=M();
if($model->table('wUserInfo')->data($userInfo)->add()){
setSession($userInfo);
session("status",null);
}else{
echo "验证错误";
}
}
}
//设置SESSION
function setSession($data){
session('userOpenid',$data['openid']);
session('userNickname',$data['nickname']);
session('userSex',$data['sex']);
session('userHeadimgurl',$data['headimgurl']);
session('userID',$data['stuID']);
}
//获取access_token
function getAccess_token(){
//URL
$url="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="._APPID_."&secret="._APPSECRET_;
//get请求
$data=getHttp($url);
//缓存access_token
S('access_token',$data['access_token'],7000);
return $data['access_token'];
}
//get请求
function getHttp($url){
$ch=curl_init();
//设置传输地址
curl_setopt($ch, CURLOPT_URL, $url);
//设置以文件流形式输出
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//接收返回数据
$data=curl_exec($ch);
curl_close($ch);
$jsonInfo=json_decode($data,true);
return $jsonInfo;
}
//post请求
function postHttp($url,$json){
$ch=curl_init();
//设置传输地址
curl_setopt($ch, CURLOPT_URL, $url);
//设置以文件流形式输出
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//设置已post方式请求
curl_setopt($ch, CURLOPT_POST, 1);
//设置post文件
curl_setopt($ch, CURLOPT_POSTFIELDS, $json);
$data=curl_exec($ch);
curl_close($ch);
$jsonInfo=json_decode($data,true);
return $jsonInfo;
}
发表评论 取消回复