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;
  }
}

}

文章作者: 迪拜de天空
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 迪拜de天空 !
评论
  目录