zoukankan      html  css  js  c++  java
  • 【TP3.2.3】微信网页授权--基类

    非常好用的微信授权 基类:其他的微信权限类都可以继承至该类:

    <?php
    
    namespace WechatController;
    
    use ThinkController;
    
    //微信接口基础类,其他微信类都继承这个基础类。可以自动判断用户状态,获取用户信息。
    class WxbaseController extends Controller
    {
    
        public $appid = 'wxba****';                   //微信APPID,公众平台获取
        public $appsecret = '332*******b4237'; //微信APPSECREC,公众平台获取
        public $index_url = "http://www.你的域名.cn/项目目录/index.php?m=分组&c=控制器&a=方法";  //微信回调地址,要跟公众平台的配置域名相同
        public $code;
        public $openid;
      public $access_token_array;
    
    
        /**
         *检测有无$_SESSION['openid'],如果有,直接忽略。
         *如果没有$_SESSION['openid'],就依次执行getCode、getOpenId、getUserInfo来获取用户信息。目的是解决CODE只能获取一次,刷新页面openid会丢失的问题。
         *再判断是否在数据库中,没有则写入数据库。最后将open_id写入session。
      **/
        public function _initialize()
        {
                if (!$_SESSION['openid']) {                             //如果$_SESSION中没有openid,说明用户刚刚登陆,就执行getCode、getOpenId、getUserInfo获取他的信息
                    $this->code = $this->getCode();
                    $this->access_token_array = $this->getOpenId();
                    $userInfo = $this->getUserInfo();
                    if ($userInfo) {
                        $ins = M('Wechat_user_info');    //其他框架请自行调整方法。
                        $map['openid'] = $userInfo['openid'];
                        $result = $ins->where($map)->find();            //根据OPENID查找数据库中是否有这个用户,如果没有就写数据库。继承该类的其他类,用户都写入了数据库中。
                        if (!$result) {
                            $ins->add($userInfo);
                        }
                        session('openid', $userInfo['openid']);         //写到$_SESSION中。微信缓存很坑爹,调试时请及时清除缓存再试。
                    }
                }
    
        }
    
        /**
         * @explain
         * 获取code,用于获取openid和access_token
         * @remark
         * code只能使用一次,当获取到之后code失效,再次获取需要重新进入
         * 不会弹出授权页面,适用于关注公众号后自定义菜单跳转等,如果不关注,那么只能获取openid
         **/
        public function getCode()
        {
            if (isset($_GET["code"])) {
                return $_GET["code"];
            } else {
                $str = "location: https://open.weixin.qq.com/connect/oauth2/authorize?appid=" . $this->appid . "&redirect_uri=" . $this->index_url . "&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect";
                header($str);
                exit;
            }
        }
    
        /**
         * @explain
         * 用于获取用户openid
         **/
        public function getOpenId()
        {
            $access_token_url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" . $this->appid . "&secret=" . $this->appsecret . "&code=" . $this->code . "&grant_type=authorization_code";
            $access_token_json = $this->https_request($access_token_url);
            $access_token_array = json_decode($access_token_json, TRUE);
            return $access_token_array;
        }
    
        /**
         * @explain
         * 通过code获取用户openid以及用户的微信号信息
         * @return
         * @remark
         * 获取到用户的openid之后可以判断用户是否有数据,可以直接跳过获取access_token,也可以继续获取access_token
         * access_token每日获取次数是有限制的,access_token有时间限制,可以存储到数据库7200s. 7200s后access_token失效
         **/
        public function getUserInfo()
        {
    
            $userinfo_url = "https://api.weixin.qq.com/sns/userinfo?access_token=".$this->access_token_array['access_token'] ."&openid=" . $this->access_token_array['openid']."&lang=zh_CN";
            $userinfo_json = $this->https_request($userinfo_url);
            $userinfo_array = json_decode($userinfo_json, TRUE);
            return $userinfo_array;
        }
    
    
        /**
         * @explain
         * 发送http请求,并返回数据
         **/
        public function https_request($url, $data = null)
        {
            $curl = curl_init();
            curl_setopt($curl, CURLOPT_URL, $url);
            curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
            curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
            if (!empty($data)) {
                curl_setopt($curl, CURLOPT_POST, 1);
                curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
            }
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
            $output = curl_exec($curl);
            curl_close($curl);
            return $output;
        }
    }
  • 相关阅读:
    使用C#代码审批/转签K2 Blackpearl流程
    K2 K2Blackpearl安装步骤详解(服务端)
    部署K2 Blackpearl流程时出错(由于目标计算机积极拒绝,无法连接)
    部署K2 Blackpearl流程时出错(与基础事务管理器的通信失败或Communication with the underlying transaction manager has failed.
    解析AFNetWorking 网络框架(二)
    python学习——练习题(5)
    python学习——练习题(4)
    python学习——练习题(3)
    python学习——练习题(2)
    python学习——练习题(1)
  • 原文地址:https://www.cnblogs.com/xuzhengzong/p/8605619.html
Copyright © 2011-2022 走看看