迪拜de天空

从未如此喜欢

Thinkphp微信Auth实战开发

Thinkphp微信Auth实战开发

<?php
/**
* Created by PhpStorm.
* User: Mikkle
* Email:776329498@qq.com
* Date: 2016/12/28
* Time: 14:08
*/

namespace app\api\controller;
use com\Wechat;
use think\Cache;
use think\Model;
use think\Session;

class Auth extends Base
{
protected $isWechatBrowser = false;
protected $scope = 'snsapi_base';
protected $uuid;
protected $open_id;
protected $member_info;
protected $options;
protected $isReg = false;
protected $no_login = false;
public function _initialize()
{
    parent::_initialize(); // TODO: Change the autogenerated stub
    $user_agent = $this->request->server('HTTP_USER_AGENT');
    if (! strpos($user_agent, 'MicroMessenger') === false ) $this->isWechatBrowser = true;
    //判断提交方式和是否微信浏览器
    if ($this->request->method() == 'GET' && $this->isWechatBrowser === true){
        //未登录 重新登录
        if (!$this->checkAuth()&& !$this->no_login )  $this->wxoauth();
        $this->isLogin=true;
        //设置全局登录
        $this->loginGlobal();
        if($this->isReg){
         //   if(!$this->checkUuidMobile()) $this->redirect('/index/WC_html_1/mainContainer.html#user/user_blind.html');
        }
    }

}

/**
 * 设置全局登录
 * #User: Mikkle
 * #Email:776329498@qq.com
 * #Date:
 * @return bool
 */
public function loginGlobal(){
    if (!$this->open_id) return false;
    $member=model('base/user');
    $member_info=$member->infoByOpenId($this->open_id);
    if (!$member_info){
        $data=[
            'nickname'=>$this->member_info['nickname'],
            'headimgurl'=>$this->member_info['headimgurl'],
            'wechat_openid'=>$this->open_id,
        ];
        $member->editData($data);
        $member_info=$member->infoByOpenId($this->open_id);
        $this->isReg = true;
    }
    $fans=model('base/WeFans');
    $fans_info=$fans->infoByOpenId($this->open_id);
    $this->member_info['appid']=$this->getOptions();
    if (!$fans_info){
        $fans->allowField(true)->save($this->member_info);
    }else{
        $fans->allowField(true)->save($this->member_info,['id' => $fans_info['id']]);
    }
    //设置全局登录 微信浏览器登录
    if (!$this->checkLoginGlobal())  $this->setLoginGlobal($member_info,2);
    $this->uuid = $member_info['uuid'];
}

/**
 * 微信内页登录
 * #User: Mikkle
 * #Email:776329498@qq.com
 * #Date:
 * @return bool
 */
public function wxoauth()
{
    if ($this->checkAuth()) return false;
    $code = $this->request->param('code');
    if (Session::has('code','html5') && $code == Session::get('code','html5') && $code) return false;
    if (!$this->options) $this->getOptions();
    $options = [
        'token'=>$this->options["token"], //填写你设定的key
        'appid'=>$this->options["appid"], //填写高级调用功能的app id
        'appsecret'=>$this->options["appsecret"] //填写高级调用功能的密钥
    ];
    Session::set('appid',$this->options["appid"],'html5');
    $we_obj = new Wechat($options);
    if ($code) {
        $json = $we_obj->getOauthAccessToken();
        if (!$json) {
            $this->redirect($this->request->baseUrl());
           // die('获取用户授权失败,请重新确认<a href="'.$this->request->baseUrl().'" >点击重试</a>');
        }
        $this->open_id = $json["openid"];
        $access_token = $json['access_token'];
        Session::set('open_id',$this->open_id,'html5');
        Session::set('code',$code,'html5');
        $user_info = $we_obj->getUserInfo($this->open_id);
        $user_info['appid']=Session::get('appid','html5');
        if ($user_info && !empty($user_info['nickname'])) {
            $this->member_info = $user_info;
        } elseif (strstr($json['scope'],'snsapi_userinfo')!==false) {
            $user_info = $we_obj->getOauthUserinfo($access_token,$this->open_id);
            $user_info['appid']=Session::get('appid','html5');
            if ($user_info && !empty($user_info['nickname'])) {
                $this->member_info = $user_info;
            } else {
                return $this->open_id;
            }
        }
        if ($this->member_info) {
            Session::set('member_info',$this->member_info,'html5');
            Session::set('open_id',$this->open_id,'html5');
            Session::delete('wx_redirect','html5');
            return $this->open_id;
        }
        $this->scope = 'snsapi_userinfo';
    }

    if ($this->scope=='snsapi_base') {
        $url = $this->request->url(true);
        Session::set('wx_redirect',$url,'html5');
    } else {
        $url =Session::get('wx_redirect','html5');
    }
    if (!$url) {
        Session::delete('wx_redirect','html5');
        die('获取用户授权失败');
    }


    $oauth_url = $we_obj->getOauthRedirect($url,"wxbase",$this->scope);
    header('Location:'.$oauth_url);
    die;


}

/**
 * 获取微信Options 使用缓存
 * #User: Mikkle
 * #Email:776329498@qq.com
 * #Date:
 * @param int $appid
 * @return mixed
 */
public function getOptions( $appid = 1){
    if(Cache::has('weOptions')){
        $weOptions=Cache::get('weOptions');
    }else{
        $weOptions=model('we/We')->info($appid)->toarray();
        Cache::set('weOptions',$weOptions,3600);
    }
    $this->options=$weOptions;
    $this->appid=$weOptions["appid"];
    return $weOptions["appid"];

}

/**
 * 判断登录是否成功
 * #User: Mikkle
 * #Email:776329498@qq.com
 * #Date:
 * @return bool
 */
public function checkAuth()
{
    if (!Session::has('member_info','html5')&&!Session::has('open_id','html5')){
        return false;
    }else{
        $this->member_info = Session::get('member_info','html5');
        $this->open_id = Session::get('open_id','html5');
        $this->appid = Session::get('appid','html5');
        if (!$this->options) $this->getOptions();
        return true;
    }
}

}

评论系统未开启,无法评论!