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

之前讲过微信的公众号自动登录的菜单配置,这次记录一下在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后面

扫描二维码关注公众号,回复: 4519869 查看本文章

     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是否正确,同时,还要检查是否给你访问的网页域名授权

猜你喜欢

转载自blog.csdn.net/heyuqing32/article/details/84851618