文档章节

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

月夜中徘徊
 月夜中徘徊
发布于 2018/08/17 01:04
字数 1031
阅读 675
收藏 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
博文 36
码字总数 13351
作品 0
贵阳
私信 提问
微信公众号开发之网页授权认证获取用户的详细信息,实现自动登陆

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

半山闲人
2017/04/15
0
0
ThinkPHP 5.0开发微信小程序商场实现全栈项目架构

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

15543555749
2018/05/19
0
0
wemall 7.0 开源系统更新,支持小程序开发

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

einsqing
2017/06/12
1K
1
微信公众号之智能绑定实现初始版本

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

rzg813
2014/09/02
0
0
微信JS-SDK之地理位置的获取与在线导航,集成百度地图实现在线地图搜索

原创声明:本文来源于本人另一博客【微信JS-SDK之地理位置的获取,集成百度地图实现在线地图搜索】原创作品,绝非他处摘取,转载请联系博主 本次讲解微信开发第三篇:获取用户地址位置信息,...

半山闲人
2017/05/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

更换本地git仓库的远程地址

参考学习链接:https://blog.csdn.net/mlq8087/article/details/81360025 本地 Git 仓库根目录下:cd .git ; 编辑 Git 配置文件:vim config ; shift + i 进入input 编辑模式 ; 修改 [rem...

Liens
15分钟前
1
0
Install hadoop, install hive, 及hive的使用

hadoop , hive 安装过程和配置文件(附件)。 注意: hadoop Name Node未做ha. Hive, 还是基本的hive on MR, 未使用on tez, on spark, 未配置LLAP、 HCatalog and WebHCat。 安装完之后,以...

墨子Zhai
16分钟前
1
0
如何处理缓存失效、缓存穿透、缓存并发等问题

缓存失效:   引起这个原因的主要因素是高并发下,我们一般设定一个缓存的过期时间时,可能有一些会设置5分钟啊,10分钟这些;并发很高时可能会出在某一个时间同时生成了很多的缓存,并且过...

我心中有猛狗
19分钟前
2
0
对于java 参数是值传递还是引用传递的

代码: package com.qimh.anotation;public class Test { static class Person{ private String name; public String getName() { return name;......

qimh
26分钟前
1
0
Pages Manager——可本地管理Pages服务内容,一键生成漂亮的文档界面。

Pages Manager Git地址 可本地管理Pages服务内容,一键生成漂亮的文档界面。在线预览 简单、轻便,无需安装数据库。 框架:spring-boot 数据库:sqlite 原理 本地维护一组markdown文档 将mar...

tanghc
36分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部