zoukankan      html  css  js  c++  java
  • 微信网页授权

    使用的框架Thinkphp3.2.3版本

    微信公众平台地址:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842

    扫二维码进入的页面地址:AppWeb-report-certifiScope

    控制器ReportController.classs.php代码:

    /**
    * 扫码进入的页面,引导用户跳转到统计页面
    */
    public function certifScope(){
            $common = new CommonController();
            $res = $common->wxOauthGetInfo();
            //如果session里面有数据,则不会再进行微信授权操作
            if($res['is_redirect'] == 1){
                redirect(U("Report-certificate"));
                exit();
            }
        }
    /**
     * 邮政金融证书统计
     * 扫码之后的跳转页面
     */
    public function certificate(){
        $common = new CommonController();
        $res = $common->wxOauthGetInfo();
        $userid = $res['userid'];
        //查询用户是否已经填写过信息
        $info = $common->getUserAllInfo($userid);
        $is_add = $info['is_add'];//是否添加过用户信息 0 没有添加 1 添加过
        if($is_add == 1){
            //查看页面
            redirect(U("Report-showcertificate?uid={$userid}"));
            exit();
        }else{
            $data['uid'] = $userid;
            $this->assign($data);
            $this->display();
        }
    }
    

     

    微信授权CommonController.class.php代码:
    namespace AppWebCommon;
    use ThinkController;
    class CommonController extends Controller
    {
        var $openid;
        var $unionid;
        var $appid;
        var $appsecret;
        protected function _initialize(){
            session_start();
            $cg_wx = C("WEIXIN_OPTIONS");
            $this->appid = $cg_wx['appid'];
            $this->appsecret = $cg_wx['appsecret'];
        }
    
        public function wxOauthGetInfo(){
            $scope = C("WEIXIN_WEB_OPTIONS")['scope'];
            $this->user = session("user");
            $this->openid = session("openid");
            if(!$this->openid){
                if (!isset($_GET['code'])){//没有code,去微信接口获取code码
                    $callback = "http://www.jinpeiwang.cn/AppWeb-report-certificate";//微信服务器回调url
                    $this->get_code($callback,$scope);
                } else {//获取code后跳转回来到这里了
                    if($scope == 'snsapi_userinfo'){
                        //用户认证授权方式
                        $code = $_GET['code'];
                        $data = $this->get_access_token($code);//获取网页授权access_token和用户openid
                        session('openid', $data['openid']);
                        $data_all = $this->get_user_info($data['access_token'],$data['openid']);//获取微信用户信息
                        //查询用户是否已经存在openid
                        $has = $this->getInfoByOpenid($data_all['openid']);
                        if(isset($has) && !empty($has)){
                            //已存在
                            $this->updateCertificateUserByWx($has['id'],$data_all['openid'],$data_all['nickname'],$data_all['unionid'],$data_all['headimgurl']);
                            $addUserID = $has['id'];
                        }else{
                            $addUserID = $this->addCertificateUserByWx($data_all['openid'],$data_all['nickname'],$data_all['unionid'],$data_all['headimgurl']);
                        }
                        session('user', $addUserID);
                    }elseif($scope == 'snsapi_base'){
                        //静默授权方式
                        $code = $_GET['code'];
                        $data = $this->get_access_token($code);//获取网页授权access_token和用户openid
                        session('openid', $data['openid']);
                        //查询用户是否已经存在openid
                        $has = $this->getInfoByOpenid($data['openid']);
                        if(isset($has) && !empty($has)){
                            //已存在
                            $addUserID = $has['id'];
                        }else{
                            $addUserID = $this->addCertificateUserByWx($data['openid'],'','','');
                        }
                        session('user', $addUserID);
                    }
                }
                $is_redirect = 0;
            }else{
                if(!$this->user){
                    $has = $this->getInfoByOpenid($this->openid);
                    $addUserID = $has['id'];
                    session('user', $addUserID);
                }else{
                    $addUserID = $this->user;
                }
                $is_redirect = 1;
            }
            return array('userid' => $addUserID,'is_redirect'=>$is_redirect);
        }
    
        /**
         * @param $callback
         * 获取code
         */
        private function get_code($callback,$scope){
            $appid = $this->appid;
            $state = md5(uniqid(rand(), TRUE));//唯一ID标识符绝对不会重复
            $url = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid=' . $appid . '&redirect_uri=' . urlencode($callback) .  '&response_type=code&scope=' . $scope . '&state=' . $state . '#wechat_redirect';
            header("Location:$url");
         }
    
        /**
         * @param $code
         * @return mixed
         * 根据code获取access_token
         */
        private function get_access_token($code){
            $appid = $this->appid;
             $appsecret = $this->appsecret;
             $url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid=' . $appid . '&secret=' . $appsecret . '&code=' . $code . '&grant_type=authorization_code';
             $user = json_decode(file_get_contents($url));
             if (isset($user->errcode)) {
                 echo 'error:' . $user->errcode.'<hr>msg  :' . $user->errmsg;exit;
             }
             $data = json_decode(json_encode($user),true);//返回的json数组转换成array数组
             return $data;
         }
    
        /**
         * @param $access_token
         * @param $openid
         * @return mixed
         * 获取授权用户的信息
         */
         private function get_user_info($access_token,$openid){
             $url = 'https://api.weixin.qq.com/sns/userinfo?access_token=' . $access_token . '&openid=' . $openid . '&lang=zh_CN';
             $user = json_decode(file_get_contents($url));
            if (isset($user->errcode)) {
                echo 'error:' . $user->errcode.'<hr>msg  :' . $user->errmsg;exit;
             }
             $data = json_decode(json_encode($user),true);//返回的json数组转换成array数组
             return $data;
         }
    
            /**
         * @param $openid
         * @param $nickname
         * @param $unionid
         * @param $headimgurl
         * @return mixed
         * 添加获取微信授权用户信息到数据表
         */
         public function addCertificateUserByWx($openid,$nickname,$unionid,$headimgurl){
             $cuser = M("certificate_user");
             $data = array(
                 'openid' => $openid,
                 'nickname' => $nickname,
                 'unionid' => $unionid,
                 'headimgurl' => $headimgurl,
                 'is_add' => 0
             );
             $addID = $cuser->add($data);
             return $addID;
         }
    
        /**
         * @param $openid
         * @return mixed
         * 根据openid查询用户信息
         */
         public function getInfoByOpenid($openid){
             $cuser = M("certificate_user");
             $res = $cuser->where(array('openid' => $openid))->field("id,openid")->find();
             return $res;
         }
    
        /**
         * @param $uid
         * @param $openid
         * @param $nickname
         * @param $unionid
         * @param $headimgurl
         * @return bool
         * 修改用户微信网页授权获取的信息
         */
        public function updateCertificateUserByWx($uid,$openid,$nickname,$unionid,$headimgurl){
            $cuser = M("certificate_user");
            $data = array(
                'nickname' => $nickname,
                'unionid' => $unionid,
                'headimgurl' => $headimgurl
            );
            $res = $cuser->where(array('id'=>$uid,'openid'=>$openid))->save($data);
            return $res;
        }
    
        /**
         * @return array|false|mixed|PDOStatement|string|	hinkCollection
         * 获取所有的证书
         */
        public function getAllCertificates(){
            $data = F("certificates_data");//数据放入到快缓存中
            $data = json_decode($data,true);
            if(!empty($data)){
                $result = $data;
            }else{
                $certificate = M("certificate");
                $res = $certificate->alias("c1")
                    ->join("LEFT JOIN certificate c2 on c1.id=c2.parent")
                    ->where(array('c1.`status`'=>1,'c1.parent'=>0,'c2.`status`'=>1))
                    ->field("c1.id as pid,c1.`name` as pname,c1.parent,c2.id as cid,c2.`name` as cname,c2.parent as cparent")
                    ->select();
                $result = array();
                if(isset($res) && !empty($res)){
                    foreach($res as $k => $v){
                        if(isset($result[$v['pid']])){
                            $arr = array('id'=>$v['cid'],'name'=>$v['cname']);
                            array_push($result[$v['pid']]['child'],$arr);
                        }else{
                            $result[$v['pid']] = array(
                                'id' => $v['pid'],
                                'name' => $v['pname'],
                                'child' => array(array(
                                    'id' => $v['cid'],
                                    'name' => $v['cname']
                                ))
                            );
                        }
                    }
                    $result = array_merge($result);
                    F("certificates_data",json_encode($result));
                }
            }
            return $result;
        }
    
        /**
         * @param $uid
         * @return array
         * 根据uid获取用户信息
         */
        public function getUserAllInfo($uid){
            $certificate = M("certificate_user");
            $res = $certificate->alias("cuser")
                ->where(array('cuser.id'=>$uid))
                ->field("cuser.id as uid,cuser.`name`,cuser.sex,cuser.idcard,cuser.education,cuser.birthday,cuser.phone,cuser.financial_time,cuser.post_status,cuser.province,cuser.city,cuser.area,cuser.branch,cuser.is_add,cuser.employ_type")
                ->find();
            if(isset($res) && !empty($res)){
                $result = $res;
                $result['code'] = 1;
                $result['birthdate'] = !empty($val['birthday'])?date('Y-m-d',$val['birthday']):'';
                $result['financialdate'] = !empty($val['financial_time'])?date('Y-m-d',$val['financial_time']):'';
                $result['list'] = $this->getCertificatesByUid($uid);
            }else{
                $result['code'] = 0;
            }
            return $result;
        }
    
        /**
         * @param $uid
         * @return Model|ThinkModel
         * 根据会员编号获取用户证书
         */
        public function getCertificatesByUid($uid){
            $relation = M("certificate_user_relation");
            $res = $relation->alias("relation")
                ->join("LEFT JOIN `certificate` c on relation.cid=c.id")
                ->join("LEFT JOIN certificate c1 on c.parent=c1.id")
                ->where(array('relation.uid'=>$uid))
                ->field("relation.id,relation.cid,relation.`cname`,c.`name`,relation.number,c1.`name` as pname")
                ->order("relation.id desc")
                ->select();
            if(isset($res) && !empty($res)){
                $result = array();
                foreach($res as $k => $v){
                    if(empty($v['cid']) && $v['cname'] != ''){
                        $cname = $v['cname'];
                    }elseif(!empty($v['pname'])){
                        $cname = $v['pname'].'-'.$v['name'];
                    }else{
                        $cname = $v['name'];
                    }
                    $result[] = array(
                        'id' => $v['cid'],
                        'cname' => $cname,
                        'number' => $v['number']
                    );
                }
                $result = array_merge($result);
            }else{
                $result = array();
            }
            return $result;
        }
    
    }
    

      

    转载于:https://www.cnblogs.com/lfjblog/p/10892800.html

  • 相关阅读:
    JVM 综述
    看 Netty 在 Dubbo 中如何应用
    Netty 心跳服务之 IdleStateHandler 源码分析
    Netty 高性能之道
    Netty 解码器抽象父类 ByteToMessageDecoder 源码解析
    Netty 源码剖析之 unSafe.write 方法
    Netty 出站缓冲区 ChannelOutboundBuffer 源码解析(isWritable 属性的重要性)
    Netty 源码剖析之 unSafe.read 方法
    Netty 内存回收之 noCleaner 策略
    Netty 源码阅读的思考------耗时业务到底该如何处理
  • 原文地址:https://www.cnblogs.com/twodog/p/12134863.html
Copyright © 2011-2022 走看看