当前位置 : 主页 > 网络编程 > PHP >

CI框架微信网页授权库

来源:互联网 收集:自由互联 发布时间:2021-06-30
最近在做的事情,就是想把微信网页授权建立CI框架上,总算成功了。代码看上去可能很小学生,还请多多指教. qq:1113288996如果有什么问题或者bug,请多多指正 1. [代码] 微信小类库,网
最近在做的事情,就是想把微信网页授权建立CI框架上,总算成功了。代码看上去可能很小学生,还请多多指教.

qq:1113288996 如果有什么问题或者bug,请多多指正

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://h5.imchaotan.com/coupon/index.php/Coupon/Coupon_index/Coupon_Get/bid/1';
                // $return_url = $this->session->return_url;
                $redirect = 'http://h5.imchaotan.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://h5.imchaotan.com/coupon/index.php/'.$redirect_url);
            // $redirect = urlencode('http://h5.imchaotan.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://h5.imchaotan.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;

         
        }
       
}

      

	
网友评论