文档章节

基于TP5的微信的公众号获取登录用户信息

月夜中徘徊
 月夜中徘徊
发布于 08/17 01:04
字数 1031
阅读 408
收藏 5

之前讲过微信的公众号自动登录的菜单配置,这次记录一下在TP5项目中获取自动登录的用户信息并存到数据库的操作

基本的流程为:微信设置自动登录的菜单—>访问的URL指定的函数里获取用户信息—>将信息存到数据库中->返回视图

也可以参考下列流程图:

 

接下来我们一步步编写代码。

 

一. 在公众号内设置菜单,可参考我的另一篇文章:公众号打开网页自动登陆配置

二. 在配置文件(config.php)中加上公众号信息

    // 公众号配置
    'wechat'           => [ 
        
        // AppId
        'AppId'               => "你的公众号AppId", // 微信支付APPID
        // AppSecret
        'AppSecret'           => "你的公众号AppSecret", // 公众帐号secert (公众号支付专用)
       
    ],

三. 在指定的URL对应的函数里编写代码

     3.1 引入Session类和配置文件类,实例化配置文件类

use \think\Session;
use \think\Config;
    // 获取配置文件里的信息
    $wx_config = Config::get('wechat');

     

     3.2 另外编写一个函数,用于请求微信接口,获取数据 

    // 用于请求微信接口获取数据
    function get_by_curl($url,$post = false){
        $ch = curl_init();
        curl_setopt($ch,CURLOPT_URL,$url);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        if($post){
            curl_setopt($ch, CURLOPT_POST, 1);
            curl_setopt($ch, CURLOPT_POSTFIELDS,$post);
        }
        $result = curl_exec($ch);
        curl_close($ch);
        return $result;
    }

 

以下流程直接贴全部完整代码

     3.3 获取页面url的code参数值,并与AppId和AppSecret组合URL,调用get_by_curl()函数获取用户openid和access_token

       这里的code参数是你之前设定的那个菜单的url在微信内访问后,会根据用户信息自动生成,跳转到你的url后会自动加在url后面

     3.4 用openid和access_token组合url,调用get_by_curl()函数获取用户详情信息

     3.5 将用户信息取出,根据openid判断当前用户是否存在数据库中,不存在则新增到数据库

     3.6 如果当前用户存在且信息有改变,则改变数据库中对应的用户信息

     3.7 将用户openid作为标识存到session中

     3.8 返回视图

        // 获取页面URL的CODE参数,判断是否有值
        if(isset($_GET['code'])) {
            // 获取openid和access_token
            $app_id = $wx_config['AppId'];
            $app_secret = $wx_config['AppSecret'];
            $code = $_GET['code'];
            // 发送请求,获取用户openid和access_token
            $data = $this->get_by_curl('https://api.weixin.qq.com/sns/oauth2/access_token?appid='.$app_id.'&secret='.$app_secret.'&code='.$code.'&grant_type=authorization_code');
            $data = json_decode($data);
            
            // 防止第二次访问动态链接报错
            // 判断是否获取到当前用户的openid
            if(isset($data->openid)){
                $open_id = $data->openid;
                $access_token = $data->access_token;

                // 获取当前用户信息
                $user_info = $this->get_by_curl('https://api.weixin.qq.com/sns/userinfo?access_token='.$access_token.'&openid='.$open_id.'&lang=zh_CN');
                $user_info = json_decode($user_info);

                // 取出用户信息
                /*
                *user_openid :用户openId
                *user_nickname :用户昵称
                *user_sex :性别
                *user_province :省
                *user_city :城市
                *user_headimgurl :用户头像url
                */
                $user_openid = $user_info->openid;
                $user_nickname = $user_info->nickname;
                $user_sex = $user_info->sex;
                $user_province = $user_info->province;
                $user_city = $user_info->city;
                $user_headimgurl = $user_info->headimgurl;

                // 以下操作可按照自己的需求编写,这里只做例子
                
                // 判断用户是否存在
                $data_user = model('app\admin\model\User')
                            ->where('open_id','=',$user_openid)
                            ->find();
                if(empty($data_user)){
                    $new_user = model('app\admin\model\User');
                    $new_user->data([
                            'open_id' =>  $user_openid,
                            'name'  =>  $user_nickname,
                            'sex'  =>  $user_sex,
                            'province'  =>  $user_province,
                            'city'  =>  $user_city,
                            'headimgurl'  =>  $user_headimgurl,
                            'join_time' => time(),
                    ]);
                    // 新增用户到数据库
                    $new_user->save();
                }



                $cur_user = model('app\admin\model\User')
                            ->where('open_id','=',$user_openid)
                            ->find();

                // 判断当前用户是否修改过信息,若有变动则更新
                if(strcmp($cur_user->name,$user_nickname)!=0||strcmp($cur_user->headimgurl,$user_headimgurl)!=0){
                    $cur_user->name = $user_nickname;
                    $cur_user->headimgurl = $user_headimgurl;
                    // 更新当前用户信息
                    $cur_user->save();
                }

                // 将当前用户openid作为标识存到session里
                Session::set('open_id', $cur_user->open_id);

            }
            
        }
return $this->view->fetch('index');

 

至此就完成了公众号网页获取当前用户信息,并保存到数据库的操作

注意:如果无法获得数据,请检查AppIDAppSecret是否正确,同时,还要检查是否给你访问的网页域名授权

 

© 著作权归作者所有

共有 人打赏支持
月夜中徘徊
粉丝 7
博文 35
码字总数 13092
作品 0
贵阳
私信 提问
ThinkPHP 5.0开发微信小程序商场实现全栈项目架构

第1章 前言:不同的时代,不同的Web 我们说,做一个产品,真的只是做一个产品吗?恐怕不是。现代的Web产品是一个产品矩阵,需要有良好的服务器端架构来支撑整个产品体系。本小节,我们将对现...

15543555749
05/19
0
0
微信公众号开发之网页授权认证获取用户的详细信息,实现自动登陆

原创声明:本文转来源本人另一博客【http://blog.csdn.net/liaohaojian/article/details/70175835】绝非他人处转载 从接触公众号到现在,开发维护了2个公众号,开发过程中遇到很多问题,现在...

半山闲人
2017/04/15
0
0
微信公众号之智能绑定实现初始版本

微信公众号智能绑定实现步骤:微信公众号智能绑定功能所有的步骤都是以模拟实现的。 1.模拟打开微信公众帐号登录页面; URL地址:https://mp.weixin.qq.com/ 2.读取自己微信公众帐号的用户名...

rzg813
2014/09/02
0
0
wemall 7.0 开源系统更新,支持小程序开发

wemall7.0 开源系统,基于thinkphp5开发,支持composer,优化核心,减少依赖,基于全新的架构思想和命名空间。支持小程序和公众号开发。 1.【更新】优化系统安装 2.【更新】更新上传过滤 3....

einsqing
2017/06/12
960
1
使用浏览器访问或调试微信公众号(跳过微信认证)

因为大部分公众号web应用实际登录都是使用用户微信认证登录,下文主要是提供一种方法使在PC端使用任意浏览器绕过微信认证完成登录,后面就可以在浏览器中使用或调试web应用。 应用服务器(我们...

lulianqi15
08/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Confluence 6 教程:在 Confluence 中导航

当你对 Confluence 有所了解后,你会发现 Confluence 使用起来非常简单。这个教程主要是针对你使用的 Confluence 界面进行一些说明,同时向你展示在那里可以进行一些通用的任务和操作。 空间...

honeymose
27分钟前
2
0
sed, awk 练习

1. sed打印某行到某行之间的内容 2. sed 转换大小写 将单词首字母转化大写 将所有小写转化大写 3. sed 在某一行最后面添加一个数字 4. 删除某行到最后一行 解析: {:a;N;$!ba;d} :a : 是...

Fc丶
今天
2
0
babel6升级到7,jest-babel报错:Requires Babel "^7.0.0-0", but was loaded with "6.26.3".

自从将前端环境更新到babel7,jest-babel之前是基于babel6的,执行时候就会报:Requires Babel "^7.0.0-0", but was loaded with "6.26.3". 很烦,因为连续帮好几台电脑修复这个问题,所以记...

曾建凯
今天
1
0
探索802.11ax

802.11ax承诺在真实条件下改善峰值性能和最差情况。 如何改善今天的Wi-Fi? 在决定如何改进当前版本以外的Wi-Fi时,802.11ac,IEEE和Wi-Fi联盟调查了Wi-Fi部署和行为,以确定更广泛使用的障碍...

linuxprobe16
今天
2
0
使用linux将64G的SDCARD格式化为FAT32

一、命令如下: sudo fdisk -lsudo mkfs.vfat /dev/sda -Isudo fdisk /dev/sda Welcome to fdisk (util-linux 2.29.2). Changes will remain in memory only, until you decide to wri......

mbzhong
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部