基于CI框架的微信网页授权库示例

5年以前  |  阅读数:1099 次  |  编程语言:PHP 

本文实例讲述了基于CI框架的微信网页授权库。分享给大家供大家参考,具体如下:

这里演示建立在CI框架上的微信网页授权功能。

1. 微信小类库,网页授权放置在libraries文件夹


    <?php
    if ( ! defined('BASEPATH')) exit('No direct script access allowed');
    Class Weixin
    {
        private $appId;
        private $appSecret;
        function __construct()
        {
          $this->appId = trim('你的appid');
          $this->appSecret = trim('你的appsecret');
        }
        function redirect_url($redirect)
        {
          /*授权页面*/
          $url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=$this->appId&redirect;_uri=$redirect&response;_type=code&scope;=snsapi_userinfo&state;=STATE#wechat_redirect";
          return $url;
        }
        /* 通过code换取access_token*/
        function access_token($code)
        {
          /*获取到的code换取access_token和openid*/
          $post_url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=$this->appId&secret;=$this->appSecret&code;=$code&grant;_type=authorization_code";
                 // echo $post_url;exit();
          $return = $this->postdata($post_url);
          // print_r($return);exit();
          $access_token = $return['access_token'];
          $openid = $return['openid'];
          /*获取微信用户数据*/
          $get_userinfo = "https://api.weixin.qq.com/sns/userinfo?access_token=$access_token&openid;=$openid〈=zh_CN";
          $userinfo = json_decode(file_get_contents($get_userinfo));
          return $userinfo;
        }
        function eff($access_token,$openid)
        {
          /*检测access_token是否正确,errcode=0 为正确*/
          $eff_url = "https://api.weixin.qq.com/sns/auth?access_token=$access_token&openid;=$openid";
          $get_eff =json_decode(file_get_contents($eff_url));
          return $get_eff;
        }
        //通过curl方式提交code换取access_token数据
        function postdata($url)
        {
           header('Content-Type:text/html;charset=utf-8');
           // echo $url;exit();
          $curl = curl_init();
          curl_setopt($curl, CURLOPT_URL, $url);
          curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
          curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
          curl_setopt($curl, CURLOPT_SSLVERSION, 1);
          // 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);
          // var_dump($output);exit();
          // print_r($output);exit();
          $access = json_decode($output,true);
          return $access;
        }
        /*
          这个位置开始是控制器index()传入的微信用户资料处理
        */
          function save_session($data)
          {
            foreach ($data as $key => $value) {
              // $_SESSION['uid'] = $value['uid'];
              // $_SESSION['nickname'] = $value['nickname'];
              // $_SESSION['fullname'] = $value['fullname'];
              // $_SESSION['status'] = $value['status'];
              // $_SESSION['groups'] = $value['groups'];
              $_SESSION[$key] = $value;
            }
            return $_SESSION;
            // print_r($_SESSION);exit();
            // unset($_SESSION[0]);
          }
        function obj_to_arr($data)
        {
          // 进行转换成数组 使用 obj_to_arr方式
          $data = is_object($data)?get_object_vars($data):$data;
            foreach ($data as $key => $value)
            {
              $arr[$key] = $value;
            }
            return $arr;
        }
    }

2. 通过code换access_token获取用户信息,controller文件


    <?php
    if ( ! defined('BASEPATH')) exit('No direct script access allowed');
    Class Coupon_index extends CI_Controller
    {
        function __construct()
        {
          parent::__construct();
          $this->load->library(array('weixin','session'));
          $this->load->helper('url');
          // $this->load->ldap_mod_del(link_identifier, dn, entry)
          $this->load->model('Coupon_model');
        }
        /**
         *优惠券主程序
         */
        function index()
        {
          $this->load->view('/coupon/index.html');
        }
        function User_exists()
        {
          /*
            检测改微信用户是否存在
            $user_arr 获取的是通过get_code返回的微信用户信息,此时的信息是通过微信服务器返回的,不能记录session
            $user std_obj模式,转换为数组
            $user_exists 扔入model中,检测数据表中是否存在该用户
            $redirect 走完流程后,跳转到首页
            if语句的作用,是 判断通过model返回数据表的信息,如果为空则把微信用户信息录入到表中,再读取出来,存进session。
            else 则数据表已经存在该用户,直接读取,存进session
            需要注意的是,使用foreach的原因,是二维数组转一维数组
          */
            $user_arr = $this->Get_code();
            // var_dump($user_arr);exit();
            $user = $this->weixin->obj_to_arr($user_arr);
            // var_dump($user);exit();
            // print_r($user);exit();
            $user_exists = $this->Coupon_model->CheckUser('cou_user',$user);
            // print_r($user_exists);exit();
            // $redirect = 'http://yourwebname.com/coupon/index.php/Coupon/Coupon_index/Coupon_Get/bid/1';
            // $return_url = $this->session->return_url;
            $redirect = 'http://yourwebname.com'.$this->session->return_url;
            // echo $redirect;exit();
            if(empty($user_exists))
            {
               /*
             由于微信获取到的用户数据是stdclass对象格式
             所以需要进行转换成数组 使用 obj_to_arr方式
             */
            //加入自定义的字符进入数组
            unset($user['privilege']);
            $user_exists['nickname']   = $user['nickname'];
            $user_exists['openid']    = $user['openid'];
            $user_exists['language']   = $user['language'];
            $user_exists['city']     = $user['city'];
            $user_exists['country']    = $user['country'];
            $user_exists['province']   = $user['province'];
            $user_exists['headimgurl']  = $user['headimgurl'];
            $user_exists['sex']      = $user['sex'];
            $user_exists['fullname']   = $user['nickname'];
            $user_exists['telphone']   = '';
            $user_exists['login_ip']   =$this->input->ip_address();
            $user_exists['last_ip']    =$this->input->ip_address();
            $user_exists['groups']    = REGISTER_GROUP_ID;
            $user_exists['status']    = 1;
            $user_exists['login_time']  = date("Y-m-d");
             $insert_id = $this->Coupon_model->insert_one('cou_user',$user_exists);
            $user_exists['uid'] = $insert_id;
            }
            else{
             $user_exists = $user_exists[0];
            }
            // $return_url = $this->session->back_url;
            // if(isset($return_url))header('location:'.$return_url);
            /*由Coupon_idex中的Get_Coupon处理*/
            $this->session->set_userdata($user_exists);
            if(isset($this->session->return_url))header('location:'.$this->session->return_url);
            // print_r($user_exists);exit();
            header('location:'.$redirect);
        }
        function Coupon_start()
        {
          /*进入领取页面,需要先经过授权*/
          $redirect_url = 'Coupon/Coupon_index/User_exists';
          $redirect = urlencode('http://yourwebname.com/coupon/index.php/'.$redirect_url);
          // $redirect = urlencode('http://yourwebname.com/coupon/index.php/Coupon/Coupon_index/Get_code');
          $return = $this->weixin->redirect_url($redirect);
           header('location:'.$return);
        }
        public function Get_code()
        {
          if(isset($_GET['code']))
          {
            $code = $_GET['code'];
            // echo $code;exit();
            $user_arr = $this->weixin->access_token($code);
            //跳转到用户检测中check_exists()去
            // echo $user_arr;exit();
            // var_dump($user_arr);
            return $user_arr;
          }else{
            //否则检测cookie中是否存在该用户,如果有,则return回首页
              echo 'error';
          }
         }
         public function Coupon_Get()
         {
          /*获取商家bid,读取相关信息*/
          // $b_name = $this->uri->segment(4, 0);
          $nickname = $this->session->nickname;
          $openid = $this->session->openid;
          $status = $this->session->status;
          $_SESSION['return_url'] = $_SERVER['REQUEST_URI'];
          // $this->session->set_userdata($return_url);
          // echo $this->session->return_url;exit();
          if(empty($nickname))header('location:'.'http://yourwebname.com/coupon/index.php/Coupon/Coupon_index/Coupon_start');
          $bid = $this->uri->segment(5, 0);
          /*扔进Coupon_model中,读取bid中的商家信息*/
          $content = $this->Coupon_model->Coupon_Business('cou_business',$bid);
          // print_r($content);
          // echo $bid;
          // echo $b_name;
          $data['bname']   = $content['bname'];
          $data['discount']  = $content['discount'];
          $data['bimg']    = $content['bimg'];
          $data['contents']  = $content['contents'];
          $data['amount']   = $content['amount'];
          $data['nickname']  = $nickname;
          $data['status']   = $status;
          $data['js'] = json_encode(array($content['bname'],$content['discount'],$nickname,$status));
          // echo $data['js'];exit();
          // print_r($data);
          $this->load->view('/coupon/index.html',$data);
          // echo $nickname;
          // echo $status;
        }
    }

更多关于CodeIgniter相关内容感兴趣的读者可查看本站专题:《codeigniter入门教程》、《CI(CodeIgniter)框架进阶教程》、《php优秀开发框架总结》、《ThinkPHP入门教程》、《ThinkPHP常用方法总结》、《Zend FrameWork框架入门教程》、《php面向对象程序设计入门教程》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总

希望本文所述对大家基于CodeIgniter框架的PHP程序设计有所帮助。

 相关文章:
PHP分页显示制作详细讲解
SSH 登录失败:Host key verification failed
获取IMSI
将二进制数据转为16进制以便显示
获取IMEI
文件下载
贪吃蛇
双位运算符
PHP自定义函数获取搜索引擎来源关键字的方法
Java生成UUID
发送邮件
年的日历图
提取后缀名
在Zeus Web Server中安装PHP语言支持
让你成为最历害的git提交人
Yii2汉字转拼音类的实例代码
再谈PHP中单双引号的区别详解
指定应用ID以获取对应的应用名称
Python 2与Python 3版本和编码的对比
php封装的page分页类完整实例