刚接触学习写的一个获取微信用户信息的类

浏览:2963 发布日期:2016/07/19 分类:功能实现
刚接触学习新写一个获取微信OPENID以及用户信息的类,相对比较简单。
<?php
namespace Home\Controller;
use Think\Controller;
/**
 * 
 * 获取用户openid类
 * 该类实现了从微信公众平台获取code、通过code获取openid和access_token、
 * 
 * @author Rookie
 *
 */
class WxOpenIdController extends Controller
{

    public static $access_token = array();
    private static $appid = '';
    private static $appecrt = '';
    public static $access_error = '';
    private static $file = 'account_token.json';
    public static $userInfoError = '';
    public static $openid = '';

    public function _initialize () {
        self::$appid = C('WX_APPID');
        self::$appecrt = C('WX_APPSERCT');
    }


    /**
     * [getOpenId 获取用户OPENID]
     * @return [type] [description]
     */
    public function getOpenId () {
        if (!isset($_GET['code'])) {
            //如果没有收到CODE返回值,就发送请求
            $baseUrl = urlencode('http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING']);
            $url = self::PingUrl($baseUrl);
            header("location:$url");
            exit;
        }else{
            $code = $_GET['code'];
            $openid = self::caretFrom($code);            
            return $openid;
        }
    }
    /**
     * [getUserInfo 获取用户信息]
     * @param  string $openid [description]
     * @return [array]         [description]
     */
    public function getUserInfo ($openid = '') {

        if ($openid == '') {
            $openid = $this->getOpenId();
        }

        $url['access_token'] = self::getToken();
        $url['openid'] = $openid;
        $url['lang'] = 'zh_CN';

        $newurl = self::ToUrlParams($url);

        $baseUrl = "https://api.weixin.qq.com/cgi-bin/user/info?".$newurl;

        $data = self::https_post($baseUrl);

        $data = json_decode($data,true);

        if (!isset($data['errcode']) && $data['openid'] != '') {
            return $data;
        }else{
            self::$userInfoError = 'ERRORCODE:'.$data['errcode'].',errmsg:'.$data['errmsg'];
            return FALSE;
        }

    }
    /**
     * [getToken 获取access_token]
     * @return [type] [description]
     */
    public static function getToken () {

        $token = json_decode(self::get_file(),true);

        if ($token['expires_time'] < time()) {
            $access_token = self::accessToken();
        }else{
            $access_token = $token;
        }
        return $access_token['access_token'];

    } 

    /**
     * [accessToken 生成accountToken]
     * @return [array] [返回 $access_token['access_token'] $access_token['expires_time']]
     */
    private static function accessToken () {
        $url['grant_type'] = 'client_credential';
        $url['appid'] = self::$appid;
        $url['secret'] = self::$appecrt;

        $newurl = self::ToUrlParams($url);
        $baseUrl = 'https://api.weixin.qq.com/cgi-bin/token?'.$newurl;
        $data = self::https_post($baseUrl);

        $data = json_decode($data,true);

        if ($data['access_token'] != '') {
            $access_token['access_token'] = $data['access_token'];
            $access_token['expires_time'] = time() + 7200;
            self::$access_token = $access_token;
            self::set_file(json_encode($access_token));
            return $access_token;
        }else{
            self::$access_error = "ERRORCODE:".$data['errcode'].',errmsg:'.$data['errmsg'];
            return FALSE;
        }

    }

    /**
     * [get_file 读取文件缓存]
     * @param  string $file [description]
     * @return [type]       [description]
     */
    private static function get_file ($file = '') {
        if ($file == '') {
            $file = self::$file;
        }
        return trim(file_get_contents($file));
    }

    /**
     * [set_file_put 写入文件缓存]
     * @param [type] $data [description]
     */
    private static function set_file($data){
        $file= self::$file;
        $fp = fopen($file,'w');
        fwrite($fp,$data);
        fclose($fp);
    }

    /**
     * [PingUrl 重组URL]
     * @param [string] $baseUrl [当前网址]
     * return string  返回发送的跳转的网址
     */
    private static function PingUrl ($baseUrl) {
        $url['appid'] = self::$appid;
        $url['redirect_uri'] = $baseUrl;
        $url['response_type'] = 'code';
        $url['scope'] = 'snsapi_base';     //snsapi_base 只获取用户openid  snsapi_userinfo 弹出授权窗口 可获取用户地区 性别 昵称等信息
        $url['state'] = "STATE"."#wechat_redirect";
        $newsUrl = self::ToUrlParams($url);
        return "https://open.weixin.qq.com/connect/oauth2/authorize?".$newsUrl;
    }
    /**
     * [caretFrom 重组获取用户ID所需的参数]
     * @param  [string] $code [返回的code参数]
     * @return [string]       [用户openid]
     */
    private static function caretFrom ($code) {
        $data['appid'] = self::$appid;
        $data['secret'] = self::$appecrt;
        $data['code'] = $code;
        $data['grant_type'] = 'authorization_code';
        $newString = self::ToUrlParams($data);
        return self::SendFrom($newString);
    }
    /**
     * [SendFrom 获取opnid]
     * @param [string] $str [description]
     */
    private static function SendFrom ($str) {
        $url = "https://api.weixin.qq.com/sns/oauth2/access_token?".$str;
        $data = self::https_post($url);
        $data = json_decode($data,true);
        self::$openid = $data['openid'];
        return $data['openid'];
    }

    /**
     * [https_post POST OR GET发送]
     * @param  [string] $url  [接口地址]
     * @param  [array] $data [接口数据]
     * @return [json]       []
     */
    private static function https_post ($url,$data = null) {
        $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_REFERER,"http://www.baidu.com");  //构造来路
        //结束
        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);
        return $output;
    }

    /**
     * [ToUrlParams 重组url参数]
     * @param [array] $data [需要重组的数组]
     */
    protected static function ToUrlParams ($data) {
         $url = "";
         foreach ($data as $key => $value) {
              $url .= $key . "=" .$value ."&";
         }
         $url = trim($url,"&");
         return $url;
    }

}
评论( 相关
后面还有条评论,点击查看>>