• php 微信公众平台OAuth2.0网页授权,获取用户信息代码类封装demo


    get_wx_data.php

    <?php
    /**
     * 获取微信用户信息
     * @author: Lucky hypo
     */
    class GetWxData{
        private $appid = 'xxx';
        private $appsecret = 'xxxxxx';
        /**
         * 1、获取微信用户信息,判断有没有code,有使用code换取access_token,没有去获取code。
         * @return array 微信用户信息数组
         */
        public function get_user_all(){
            if (!isset($_GET['code'])){//没有code,去微信接口获取code码
                $callback = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'];//微信服务器回调url,这里是本页url
                $this->get_code($callback);
            } 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']);//获取微信用户信息
                return $data_all;
            }
        }
        /**
         * 2、用户授权并获取code
         * @param string $callback 微信服务器回调链接url
         */
        private function get_code($callback){
            $appid = $this->appid;
            $scope = 'snsapi_userinfo';
            $state = md5(uniqid(rand(), TRUE));//唯一ID标识符绝对不会重复
            $url = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid=' . $appid . '&redirect_uri=' . urlencode($callback) .  '&response_type=code&scope=' . $scope . '&state=' . $state . '#wechat_redirect';
            header("Location:$url");
        }
        /**
         * 3、使用code换取access_token
         * @param string 用于换取access_token的code,微信提供
         * @return array access_token和用户openid数组
         */
        private function get_access_token($code){
            $access_token_file = './access_token.txt';
            $get_data_status = false;
            $data = file_get_contents($access_token_file);
            if($data){
                $data = json_decode($data,true);
                $expire_time = isset($data['expire_time'])?$data['expire_time']:'0';
                if(time() > ($expire_time - 600)){
                    $get_data_status = true;
                }
            }else{
                $get_data_status = true;
            }
            if($get_data_status == true){
                $appid = $this->appid;
                $appsecret = $this->appsecret;
                $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.'<hr>msg  :' . $user->errmsg;exit;
                }
                $data = json_decode(json_encode($user),true);//返回的json数组转换成array数组
                $data['expire_time'] = time()+$data['expires_in'];
                file_put_contents($access_token_file,json_encode($data));
            }
    
            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.'<hr>msg  :' . $user->errmsg;exit;
            }
            $data = json_decode(json_encode($user),true);//返回的json数组转换成array数组
            return $data;
        }
    
        //对外开放,获取access_token
        public function get_access_token_open(){
            if (!isset($_GET['code'])){//没有code,去微信接口获取code码
                $protocol = ((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') || $_SERVER['SERVER_PORT'] == 443) ? "https://": "http://";
                //$callback = $protocol.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'];//微信服务器回调url,这里是本页url
                $callback = $protocol.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];//微信服务器回调url,这里是本页url
                $this->get_code($callback);
            } else {//获取code后跳转回来到这里了
                $code = $_GET['code'];
                $data = $this->get_access_token($code);//获取网页授权access_token和用户openid
                return $data;
            }
        }
    }
    
    //使用方法:
    $getWxData = new GetWxData();
    if(isset($_GET['model']) && $_GET['model'] == 'get_access_token'){
        $data = $getWxData->get_access_token_open();
        echo(json_encode($data));exit();
    }else{
        $data = $getWxData->get_user_all();
        echo '<pre>';
        print_r($data);
        exit();
    }
    
    //访问链接:
    //http://127.0.0.1/get_wx_data.php
    //http://127.0.0.1/get_wx_data.php?model=get_access_token
    ?>
  • 相关阅读:
    tornado源码分析-多进程
    create a cocos2d-x-3.0 project in Xcode
    记录自己的傻逼的错误:找不到或无法载入主类
    MVC5 Entity Framework学习之实现主要的CRUD功能
    Linux中实现多网卡绑定总结
    it码农之心灵鸡汤(一)
    【高级算法】遗传算法解决3SAT问题(C++实现)
    MySQL-分区表-1
    OpenSift源代码编译过程记录
    Android Studio 视图解析
  • 原文地址:https://www.cnblogs.com/-mrl/p/11120218.html
Copyright © 2020-2023  润新知