基于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 相关文章推荐
php的计数器程序
Oct 09 PHP
优化PHP代码技巧的小结
Jun 02 PHP
Codeigniter框架的更新事务(transaction)BUG及解决方法
Jul 25 PHP
php socket实现的聊天室代码分享
Aug 16 PHP
PHP中提问频率最高的11个面试题和答案
Sep 02 PHP
PHP图片处理之使用imagecopyresampled函数裁剪图片例子
Nov 19 PHP
php通过ksort()函数给关联数组按照键排序的方法
Mar 18 PHP
在Mac OS上搭建PHP的Yii框架及相关测试环境
Feb 14 PHP
yii2.0实现pathinfo的形式访问的配置方法
Apr 06 PHP
基于PHP实现用户注册登录功能
Oct 14 PHP
thinkPHP模板中for循环与switch语句用法示例
Nov 30 PHP
Symfony2针对输入时间进行查询的方法分析
Jun 28 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
php5中date()得出的时间为什么不是当前时间的解决方法
2008/06/30 PHP
PHP判断一个gif图片是否为动态图片的方法
2014/11/19 PHP
PHP 7的一些引人注目的新特性简单介绍
2015/11/08 PHP
利用php_imagick实现复古效果的方法
2016/10/18 PHP
Zend Framework数据库操作方法实例总结
2016/12/11 PHP
实例讲解PHP表单处理
2019/02/15 PHP
javascript getElementsByName()的用法说明
2009/07/31 Javascript
javascript SpiderMonkey中的函数序列化如何进行
2012/12/05 Javascript
移动节点的jquery代码
2014/01/13 Javascript
javascript制作的cookie封装及使用指南
2015/01/02 Javascript
jQuery数据缓存用法分析
2015/02/20 Javascript
js+div实现文字滚动和图片切换效果代码
2015/08/27 Javascript
JS选取DOM元素的简单方法
2016/07/08 Javascript
AngularJS实现页面跳转后自动弹出对话框实例代码
2017/08/02 Javascript
微信小程序wx.previewImage预览图片实例详解
2017/12/07 Javascript
php 解压zip压缩包内容到指定目录的实例
2018/01/23 Javascript
layui实现table加载的示例代码
2018/08/14 Javascript
浅谈webpack4 图片处理汇总
2018/09/12 Javascript
[56:41]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 Newbee vs OG
2018/04/01 DOTA
[00:14]PWL:老朋友Mushi拍VLOG与中国玩家问好
2020/11/04 DOTA
python3使用smtplib实现发送邮件功能
2018/05/22 Python
用PyInstaller把Python代码打包成单个独立的exe可执行文件
2018/05/26 Python
Python 使用SFTP和FTP实现对服务器的文件下载功能
2020/12/17 Python
意大利专业化妆品品牌:KIKO MILANO
2017/02/01 全球购物
英国综合网上购物商城:The Hut
2018/07/03 全球购物
Nike德国官网:Nike.com (DE)
2018/11/13 全球购物
办公室文员工作职责
2014/01/31 职场文书
高中生评语大全
2014/04/25 职场文书
一分钟演讲稿
2014/04/30 职场文书
给校长的一封检讨书
2014/09/20 职场文书
具结保证书
2015/01/17 职场文书
2015小学毕业班工作总结
2015/07/21 职场文书
2015年高校保卫处工作总结
2015/07/23 职场文书
2016春季校长开学典礼致辞
2015/11/26 职场文书
python基于机器学习预测股票交易信号
2021/05/25 Python
Nginx缓存设置案例详解
2021/09/15 Servers