微信授权实现

转载请说明出处


<?php

namespace app\home\controller;

use app\home\model\BaseModel;

use think\Controller;

use think\Db;


class Base extends Controller

{

    public function _initialize()

    {

       

     // $model = new BaseModel();

     // $cate = $model->getAllCate();

     // //dump($cate);exit;

     //    $this->assign('cate', $cate);

        $users = Db::name('wxuser')->where(array('userid'=>1))->find();

        session('users',$users);

        // session('users',null);

        if(empty(session('users'))) {

            $this->getWxInfo();

        }



    }


    //微信授权

    private function getWxInfo() {

        $config = Db::name('wxconfig')->where( array("id" => 1) )->find();

        $code = isset($_GET['code']) ? $_GET['code'] : '';

        if(empty($code)){

            $this->Oauth($config);

            exit;

        } else {

            $token_url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid='.$config["appid"].'&secret='.$config ["appsecret"].'&code='.$code.'&grant_type=authorization_code';

            $wxuser = $this->curlGet($token_url);

            $wxuserobj         = json_decode($wxuser, 1);

            $openid         = $wxuserobj['openid'];

            $access_token   = $wxuserobj['access_token'];

            //如果全局access_token过期,重新获取

            if(time() > ( $config['expire'] - 100 ) ){

                $acc = $this->curlGet('https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.$config['appid'].'&secret='.$config['appsecret']);

                if($acc){

                    $to =  json_decode($acc, true);

                    $con = array();

                    $con['access_token'] = $to['access_token'];

                    $con['expire'] = 7100 + time();

                    Db::name('wxconfig')->where(array('id'=>1))->update($con);

                    $config ["access_token"] = $con['access_token'];

                }

            }

            //查看是否获取过微信号信息

            $user = Db::name('wxuser')->where(array('openid'=>$openid))->find();

            $userinfo = false;

            if(!$user || time() > $user['exprise_in']) {

                $userinfo = $this->getwx($access_token,$openid);

            }

            if($userinfo) {

                $data = array();

                // $data['access_token'] = $access_token;

                $data['nickname'] = $userinfo['nickname'];

                $data['headimg'] = $userinfo['headimgurl'];

                $data['sex'] = $userinfo['sex'];

                $data['city'] = $userinfo['city'];

                $data['province'] = $userinfo['province'];

                $data['country'] = $userinfo['country'];

                $data['openid'] = $openid;

                if(!$user) {

                    Db::name('wxuser')->insert($data);

                    $data['id'] = Db::name('wxuser')->getLastInsID();

                    Db::name('wxuser')->where('userid',$data['id'])->update(['is_follow' => 1]);

                } else {

                    Db::name('wxuser')->where(array('id'=>$user['id']))->update($data);

                }

                $user = $data;

            }

            $infoArr = array('wx' => $user);

            session('user',$infoArr);

            if(isset($infoArr['user'])) {

                unset($infoArr['user']);

            }

            session('users',$infoArr);

            

        }

    }

    //获取微信信息

    private function getwx($access_token,$openid) {

        $urlinfo = 'https://api.weixin.qq.com/sns/userinfo?access_token='.$access_token.'&openid='.$openid.'&lang=zh_CN';

        $info = $this->curlGet($urlinfo);

        $userinfo = json_decode($info, 1);

        return $userinfo;

    }

    //用户授权,获取code

    public function Oauth($config) {

        $url = $this->get_url();

        header('location:https://open.weixin.qq.com/connect/oauth2/authorize?appid='.$config["appid"].'&redirect_uri='.$url.'&response_type=code&scope=snsapi_userinfo&state=oauth#wechat_redirect');

    }

    //

    private function get_url() {

        $sys_protocal = isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == '443' ? 'https://' : 'http://';

        $php_self = $_SERVER['PHP_SELF'] ? $_SERVER['PHP_SELF'] : $_SERVER['SCRIPT_NAME'];

        $path_info = isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : '';

        $relate_url = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : $php_self.(isset($_SERVER['QUERY_STRING']) ? '?'.$_SERVER['QUERY_STRING'] : $path_info);

        return $sys_protocal.(isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : '').$relate_url;

    }

    public function curlGet($url){

        $oCurl = curl_init();

        if(stripos($url,"https://")!==FALSE){

            curl_setopt($oCurl, CURLOPT_SSL_VERIFYPEER, FALSE);

            curl_setopt($oCurl, CURLOPT_SSL_VERIFYHOST, FALSE);

            curl_setopt($oCurl, CURLOPT_SSLVERSION, 1); //CURL_SSLVERSION_TLSv1

        }

        curl_setopt($oCurl, CURLOPT_URL, $url);

        curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1 );

        $sContent = curl_exec($oCurl);

        $aStatus = curl_getinfo($oCurl);

        curl_close($oCurl);

        if(intval($aStatus["http_code"])==200){

            return $sContent;

        }else{

            return false;

        }

    }


}

阅读更多
个人分类: 开发
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

微信授权实现

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭