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


Posted in PHP onNovember 25, 2016

本文实例讲述了基于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&lang=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框架的PHP程序设计有所帮助。

PHP 相关文章推荐
把从SQL中取出的数据转化成XMl格式
Oct 09 PHP
PHP 页面跳转到另一个页面的多种方法方法总结
Jul 07 PHP
微信支付开发教程(一)微信支付URL配置
May 28 PHP
PHP改进计算字符串相似度的函数similar_text()、levenshtein()
Oct 27 PHP
Smarty中常用变量操作符汇总
Oct 27 PHP
ThinkPHP中redirect用法分析
Dec 05 PHP
Zend Framework入门教程之Zend_Db数据库操作详解
Dec 08 PHP
php实现遍历文件夹的方法汇总
Mar 02 PHP
PHP截取发动短信内容的方法
Jul 04 PHP
php unlink()函数使用教程
Jul 12 PHP
php+croppic.js实现剪切上传图片功能
Aug 14 PHP
PHP判断是否微信访问的方法示例
Mar 27 PHP
php监测数据是否成功插入到Mysql数据库的方法
Nov 25 #PHP
thinkphp整合微信支付代码分享
Nov 24 #PHP
Yii2中使用asset压缩js,css文件的方法
Nov 24 #PHP
微信自定义分享php代码分析
Nov 24 #PHP
php插入含有特殊符号数据的处理方法
Nov 24 #PHP
PHP合并数组的2种方法小结
Nov 24 #PHP
PHP magento后台无法登录问题解决方法
Nov 24 #PHP
You might like
PHP出错界面
2006/10/09 PHP
php miniBB中文乱码问题解决方法
2008/11/25 PHP
php中长文章分页显示实现代码
2012/09/29 PHP
使用PHP编写的SVN类
2013/07/18 PHP
将word转化为swf 如同百度文库般阅读实现思路及代码
2013/08/09 PHP
php连接mysql之mysql_connect()与mysqli_connect()的区别
2020/07/19 PHP
javascript英文日期(有时间)选择器
2007/05/02 Javascript
jquery Mobile入门—外部链接切换示例代码
2013/01/08 Javascript
使用js实现关闭js弹出层的窗口
2014/02/10 Javascript
javascript匀速动画和缓冲动画详解
2016/10/20 Javascript
Vue中组件之间数据的传递的示例代码
2017/09/08 Javascript
一个Vue视频媒体多段裁剪组件的实现示例
2018/08/09 Javascript
使用webpack搭建vue项目及注意事项
2019/06/10 Javascript
vue登录页面cookie的使用及页面跳转代码
2019/07/10 Javascript
在Koa.js中实现文件上传的接口功能
2019/10/08 Javascript
Element Rate 评分的使用方法
2020/07/27 Javascript
js实现滑动进度条效果
2020/08/21 Javascript
[01:14]DOTA2亚洲邀请赛小组赛赛前花絮
2017/03/27 DOTA
Python中字符串的修改及传参详解
2016/11/30 Python
python实现随机森林random forest的原理及方法
2017/12/21 Python
Python实现的读取电脑硬件信息功能示例
2018/05/30 Python
Python谱减法语音降噪实例
2019/12/18 Python
Tensorflow的常用矩阵生成方式
2020/01/04 Python
使用 PyTorch 实现 MLP 并在 MNIST 数据集上验证方式
2020/01/08 Python
Python使用enumerate获取迭代元素下标
2020/02/03 Python
python GUI库图形界面开发之PyQt5信号与槽基本操作
2020/02/25 Python
使用tensorflow进行音乐类型的分类
2020/08/14 Python
详解使用scrapy进行模拟登陆三种方式
2021/02/21 Python
css3 clip实现圆环进度条的示例代码
2018/02/07 HTML / CSS
通过HTML5规范搞定i、em、b、strong元素的区别
2017/03/04 HTML / CSS
夏尔巴人登珠峰品牌:Sherpa Adventure Gear
2018/02/08 全球购物
函授大学生自我鉴定
2014/02/05 职场文书
小学毕业典礼主持词
2014/03/27 职场文书
优秀的应届生自荐信
2014/05/23 职场文书
战友聚会策划方案
2014/06/13 职场文书
2015年高校保卫处工作总结
2015/07/23 职场文书