• tp实现微信授权登陆(附源码)


    官方开发文档地址 

    https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419316505&token=&lang=zh_CN;

    步骤:

    1.识别浏览器,普通浏览器跳到登陆页面;微信打开的话,发起微信网页授权登陆,微信用户允许授权第三方应用后,微信会拉起应用或重定向到第三方网站,并且带上授权临时票据code参数;

    2.通过code参数加上AppID和AppSecret等,通过API换取access_token;

    3.通过access_token进行接口调用,获取用户基本数据资源或帮助用户实现基本操作。

    <?php
    namespace HomeController;
    use ThinkController;
    class CommonController extends Controller {
        /*
        * 自动执行
        */
        public function _initialize(){
            //判断是否在微信打开
            $ua = $_SERVER['HTTP_USER_AGENT'];
            //MicroMessenger 是android/iphone版微信所带的
            //Windows Phone 是winphone版微信带的  (这个标识会误伤winphone普通浏览器的访问)
            if(strpos($ua, 'MicroMessenger') == false && strpos($ua, 'Windows Phone') == false){
                //普通浏览器
                if(!$_SESSION['username']) {
                    header('Location:xxx');
                }
            }else{  
                //微信浏览器
                $users = M('User');
                $appid = 'xxx';
                $secret = 'xxx';
                if(!$_SESSION['username']) {
                    //微信网页授权
                    $redirect_uri = urlencode ('http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
                    $url ="https://open.weixin.qq.com/connect/oauth2/authorize?appid=$appid&redirect_uri=$redirect_uri&response_type=code&scope=snsapi_userinfo&state=1&connect_redirect=1#wechat_redirect";
                    header("Location:".$url);
                    $code = $_GET["code"];
      
                    //第一步:取得openid
                    $oauth2Url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=$appid&secret=$secret&code=$code&grant_type=authorization_code";
                    $oauth2 = $this->getJson($oauth2Url);
                    //第二步:根据全局access_token和openid查询用户信息
                    $access_token = $oauth2["access_token"];
                    $openid = $oauth2['openid'];
                    $get_user_info_url = "https://api.weixin.qq.com/sns/userinfo?access_token=$access_token&openid=$openid&lang=zh_CN";
                    $userinfo = $this->getJson($get_user_info_url);
                    //save用户信息
                    if($userinfo['openid']){
                        $username = $userinfo['openid'];
                        $nickname = $userinfo['nickname'];
                        $headimg = $userinfo['headimgurl'];
                        $province = $userinfo['province'];
                        $city = $userinfo['city'];
                        $sex = $userinfo['sex'];
                        $user = $users->where(array('username' => $username))->find();
                        if ($user) {
                            $users->where(array('username' => $username))->save(array('nickname' => $nickname, 'avatar' => $headimg, 'lasttime' => time()));
                        }else{
                            $users->add(array('username' => $username, 'nickname' => $nickname, 'avatar' => $headimg, 'province' => $province, 'city' => $city, 'gender' => $sex, 'regtime' => time(), 'lasttime' => time()));
                            // $data = array('username' => $username, 'nickname' => $nickname, 'avatar' => $headimg, 'province' => $province, 'city' => $city, 'gender' => $sex, 'regtime' => time(), 'lasttime' => time());
                        }
                        $_SESSION['username'] = $username;
                        if($user['tel'] == NULL){
                            //如果用户手机号为空的话跳转到绑定手机号页面
                            header('Location:xxx'); 
                        }
                    }                
                }else{
                    $user = D('User')->getUserInfo();  //getUserInfo()是model根据session('username')获取用户数据的方法
                    if($user['tel'] == NULL){
                        header('Location:xxx');
                    }
                }
      
                //获取接口调用凭证access_token
                $accessurl = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.$appid.'&secret='.$secret;
                $access_token = S('access_token');
                if(!$access_token){
                    $access = $this->getJson($accessurl);
                    if(!empty($access['access_token'])){
                        S('access_token',$access['access_token'],$access['expires_in']);
                    }
                }
                //分享
                /*$share = new WechatShare($appid, $_SESSION['username']);
                $this->shareScript = $share->getSgin($access_token);
                $this->assign('shareScript', $this->shareScript);
                $this->assign('sharewechaid', $_SESSION['username']);
                if($_GET['sharewechaid']){
                    $this->assign('getsharewechaid', $_GET['sharewechaid']);
                }*/ 
            }
         
    }
      
        public function getJson($url){
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            $output = curl_exec($ch);
            curl_close($ch);
            return json_decode($output, true);
        }
    }

    关注回复MySQL,获取跟MySQL优化处理方案

    关注回复workerman,获取跟workerman相关的所有资料!

    关注回复wx,可添加我,咨询你想要的视频、资料教程等!

    轻轻关注,将推“心”的不错经验和知识!

  • 相关阅读:
    QT UAC问题汇总贴
    被动的流氓
    Web前端优化需要注意的点
    VS快捷键
    延时过程中要加上app.processEvents(),进度条里也要加上这句
    Nim语言:Pascal的语法,Python的缩进
    QString转换成LPCWSTR
    Pascal编译器大全(非常难得)
    WCF学习心得----(三)服务承载
    SafeSEH原理及绕过技术浅析
  • 原文地址:https://www.cnblogs.com/Jackey-fighting/p/10003495.html
Copyright © 2020-2023  润新知