不需要在网上找什么乱七八糟的东西,直接来之即用岂不是很完美。
只需要有一台服务器即可,没备案都可以玩这个功能。不需要拥有服务号,看完全文你就明白了。
数据库篇:
-- Adminer 4.6.3 MySQL dump
SET NAMES utf8;
SET time_zone = '+00:00';
SET foreign_key_checks = 0;
SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO';
DROP TABLE IF EXISTS `yy_wxuser`;
CREATE TABLE `yy_wxuser` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
`nickname` varchar(255) DEFAULT '' COMMENT '昵称',
`openid` varchar(255) DEFAULT '' COMMENT 'openid',
`avatar` varchar(255) DEFAULT '' COMMENT '头像',
`gender` tinyint(1) unsigned DEFAULT '1' COMMENT '性别',
`province` varchar(20) DEFAULT '0' COMMENT '省',
`city` varchar(20) DEFAULT '0' COMMENT '市',
`county` varchar(20) DEFAULT '0' COMMENT '县',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='用户表';
-- 2019-04-20 03:13:42
基本库,用于调起授权授权获取用户信息 Wxgetuserinfo.php
index();
*/
/**
* 1、获取用户信息
*/
public function delsession(){
session('userinfo', null);
session(null);
}
public function index(){
$appid = config('appid');
$secret = config('secret');
if(!session('?userinfo')){
if (!isset($_GET['code'])){//没有code,去微信接口获取code码
$request = request();
$callback = $request->url(true);//微信服务器回调url,这里是本页url
// $this->get_code($callback);
$redirect_uri=urlencode($callback);
$url='https://open.weixin.qq.com/connect/oauth2/authorize?appid='.$appid.'&redirect_uri='.$redirect_uri.'&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect';
header("location:$url");exit();
} else {//获取code后跳转回来到这里了
$code = $_GET['code'];
$data = $this->get_access_token($code);//获取网页授权access_token和用户openid
$data_all = $this->get_user_info($data['access_token'],$data['openid']);//获取微信用户信息
session('userinfo',$data_all);
$this->checkuser($data_all['openid'],$data_all);
return json($data_all);
}
}else{
$ret=session('userinfo');
return json($ret); //返回的获取到的微信用户信息
}
}
/**
* 3、使用code换取access_token
* @param string 用于换取access_token的code,微信提供
* @return array access_token和用户openid数组
*/
private function get_access_token($code){
$appid = config('appid');
$appsecret = config('secret');
$url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid=' . $appid . '&secret=' . $appsecret . '&code=' . $code . '&grant_type=authorization_code';
$user = json_decode(file_get_contents($url));
if (isset($user->errcode)) {
echo 'error:' . $user->errcode.'
msg :' . $user->errmsg;exit;
}
$data = json_decode(json_encode($user),true);//返回的json数组转换成array数组
return $data;
}
/**
* 4、使用access_token获取用户信息
* @param string access_token
* @param string 用户的openid
* @return array 用户信息数组
*/
private function get_user_info($access_token,$openid){
$url = 'https://api.weixin.qq.com/sns/userinfo?access_token=' . $access_token . '&openid=' . $openid . '&lang=zh_CN';
$user = json_decode(file_get_contents($url));
if (isset($user->errcode)) {
// echo 'error:' . $user->errcode.'
msg :' . $user->errmsg;exit;
}
$data = json_decode(json_encode($user),true);//返回的json数组转换成array数组
return $data;
}
/**
* 检查用户信息
* TODO 在这个地方如果在用户表加一个时间字段,就可以每隔多少次对数据库进行一次操作,而不是一直更新操作。
*/
public function checkuser($openid,$data){
$check=Db::name('wxuser')->where(array('openid'=>$openid))->find();
if($check){
/*更新用户信息*/
$updata=array();
$updata['avatar']=$data['headimgurl'];
$updata['createtime']=time();
$updata['nickname']=$data['nickname'];
Db::name('wxuser')->where('openid',$openid)->update($updata);
/*获取最新用户信息并存入缓存*/
$newinfo=Db::name('wxuser')->where(array('id'=>$check['id']))->find();
session('userinfo',$newinfo);
}else{
/*新增用户信息*/
$intdata=array();
$intdata = ['nickname' =>$data['nickname'], 'avatar' => $data['headimgurl'],'createtime'=>time(),'openid' => $data['openid'],'gender' => $data['sex'],'city' => $data['city'],'province' => $data['province'],'county' => $data['country']];
Db::name('wxuser')->insert($intdata);
$userId = Db::name('wxuser')->getLastInsID();
/*获取最新用户信息并存入缓存*/
if(!session('?userinfo')){
$newinfo=Db::name('wxuser')->where(array('id'=>$userId))->find();
// $newinfo=Db::name('wxuser')->where('id',$userId)->find();array('openid'=>$openid,'delstatus'=>1)
session('userinfo',$newinfo);
}
}
}
/*↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓*/
/*检测是否关注公众号*/
/*subscribe 用户是否订阅该公众号标识,值为0时,代表此用户没有关注该公众号,拉取不到其余信息。*/
/*https://www.cnblogs.com/mracale/p/9318349.html*/
public function checkisgz(){
$request = request();
$callback = $request->url(true);//微信服务器回调url,这里是本页url
$appid = config('appid');
$secret = config('secret');
//微信网页授权获取openid
$web_url=$callback;
if (!isset($_GET['code'])) {
$redirect_uri=urlencode($web_url);
$url='https://open.weixin.qq.com/connect/oauth2/authorize?appid='.$appid.'&redirect_uri='.$redirect_uri.'&response_type=code&scope=snsapi_base&state=1#wechat_redirect';
header("location:$url");exit();
}
$code=trim($_GET['code']);
$url='https://api.weixin.qq.com/sns/oauth2/access_token?appid='.$appid.'&secret='.$secret.'&code='.$code.'&grant_type=authorization_code';
$access=file_get_contents($url);
$data=json_decode($access,true);
$access_token=$data['access_token'];
$url='https://api.weixin.qq.com/sns/userinfo?access_token='.$access_token.'&openid=OPENID&lang=zh_CN';
$user=file_get_contents($url);
$arr=json_decode($user,true);
//获取用户的openid
$openid=$arr['openid'];
$url="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$appid."&secret=".$secret;
$access=file_get_contents($url);
$access_arr=json_decode($access,true);
//非网页的access_token
$access_token=$access_arr['access_token'];
$url="https://api.weixin.qq.com/cgi-bin/user/info?access_token=".$access_token."&openid=".$openid."&lang=zh_CN";
$res=file_get_contents($url);
// var_dump($res);
return $res['subscribe'];
}
}
中间库:Basesdns.php
index();
$userinfo=session('userinfo');
if(!$userinfo){
$class = new \app\card\controller\Wxgetuserinfo();
$class->index();
}
$this->userinfo=session('userinfo');
}
}
应用库,写日常逻辑的,需要继承中间库,个人认为前面所有的缓存只需要存一个openid就可以了。
Index.php
where('openid',$userinfo['openid'])->find();
session('userinfo',$userinfo);
$this->assign('userinfo',$userinfo);
return $this->fetch();
}
}
另外需要注意的是,公众号必须要加上对应服务器的ip白名单,以及网页授权回调域名配置。
这里再说一个很多人不知道的小消息,就是即使你没有服务号,也可以完成这个代码测试,只要你有一台服务器就可以了,没备案都没关系,那就是微信测试号。
注册微信测试号的地址是:
http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
推进观看的链接:http://www.cnblogs.com/hui9527/p/8473982.html 这个代码还不错。