php json微信登录,基于ThinkPHP5微信H5授权登录获取用户信息(改进版)

编程入门 行业动态 更新时间:2024-10-25 10:32:21

php json微信登录,基于ThinkPHP5微信H5授权登录获取<a href=https://www.elefans.com/category/jswz/34/1766089.html style=用户信息(改进版)"/>

php json微信登录,基于ThinkPHP5微信H5授权登录获取用户信息(改进版)

不需要在网上找什么乱七八糟的东西,直接来之即用岂不是很完美。

只需要有一台服务器即可,没备案都可以玩这个功能。不需要拥有服务号,看完全文你就明白了。

数据库篇:-- 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<?php

/**

* Created by PhpStorm.

* User: wudi

* Date: 2019/1/28

* Time: 10:31

*/

namespace app\card\controller;

use think\Db;

class Wxgetuserinfo

{

/**

* 调用方法

* 具体参考tp5的命名空间

* $class = new \app\card\controller\Wxgetuserinfo();

* $class->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='='.$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 = '=' . $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 = '=' . $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时,代表此用户没有关注该公众号,拉取不到其余信息。*/

/*.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='='.$appid.'&redirect_uri='.$redirect_uri.'&response_type=code&scope=snsapi_base&state=1#wechat_redirect';

header("location:$url");exit();

}

$code=trim($_GET['code']);

$url='='.$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='='.$access_token.'&openid=OPENID&lang=zh_CN';

$user=file_get_contents($url);

$arr=json_decode($user,true);

//获取用户的openid

$openid=$arr['openid'];

$url="=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="=".$access_token."&openid=".$openid."&lang=zh_CN";

$res=file_get_contents($url);

// var_dump($res);

return $res['subscribe'];

}

}

中间库:Basesdns.php<?php

/**

* Created by PhpStorm.

* User: wudi

* Date: 2019/1/28

* Time: 14:37

*/

namespace app\card\controller;

use think\Controller;

use think\Db;

use think\Request;

class Basesdns extends Controller

{

/**

* 检测是否授权登录

* 初始化方法,可以控制用户权限、获取菜单等等,只要是继承base类的其它业务类就不需要再重写

*/

public function _initialize()

{

parent::_initialize();

$class = new \app\card\controller\Wxgetuserinfo();

$class->index();

$userinfo=session('userinfo');

if(!$userinfo){

$class = new \app\card\controller\Wxgetuserinfo();

$class->index();

}

$this->userinfo=session('userinfo');

}

}

应用库,写日常逻辑的,需要继承中间库,个人认为前面所有的缓存只需要存一个openid就可以了。

Index.php<?php

namespace app\card\controller;

use think\Db;

use think\Request;

class Index extends Basesdns

{

/*首页*/

public function index()

{

$userinfo=session('userinfo');

$userinfo=Db::name('wxuser')->where('openid',$userinfo['openid'])->find();

session('userinfo',$userinfo);

$this->assign('userinfo',$userinfo);

return $this->fetch();

}

}

config.php 用来配置 微信的appid跟secret。

另外需要注意的是,公众号必须要加上对应服务器的ip白名单,以及网页授权回调域名配置。

这里再说一个很多人不知道的小消息,就是即使你没有服务号,也可以完成这个代码测试,只要你有一台服务器就可以了,没备案都没关系,那就是微信测试号。

更多推荐

php json微信登录,基于ThinkPHP5微信H5授权登录获取用户信息(改进版)

本文发布于:2024-02-25 21:42:15,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1700376.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:用户信息   改进版   json   php

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!