php教程

超轻量级php框架startmvc

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

更新时间:2020-03-15 10:16:37 作者:startmvc
本文实例讲述了基于CI框架的微信网页授权库。分享给大家供大家参考,具体如下:这里演

本文实例讲述了基于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;
 }
}

CI框架 微信 网页授权库