微信公众号--测试号--用户授权登陆

时间:2025-05-12 09:52:10
<?php
namespace Home\Controller;
use Think\Controller;
/**
  * 微信授权相关接口
  */
class WechatController extends Controller
{
     public $app_id     = '';
     public $app_secret = '';
     public $host       = '';
     /*构造方法*/
     public function __construct()
     {
         parent::__construct();
         $this->app_id = C('WECHAT_INIT')['appid'];
         $this->app_secret = C('WECHAT_INIT')['appsecret'];
         $this->host = C('WECHAT_HOST');
     }
     
     public function post_request($url, $post = null) {
         $curl = curl_init();
         if (stripos($url, "https://") !== FALSE) {
             curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
             curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
             curl_setopt($curl, CURLOPT_SSLVERSION, 1); //CURL_SSLVERSION_TLSv1
         }
         curl_setopt($curl, CURLOPT_URL, $url);
         curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)');
         curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
         
         if ($post) {
             curl_setopt($curl, CURLOPT_POST, 1);
             curl_setopt($curl, CURLOPT_POSTFIELDS, $post);
         }
         
         curl_setopt($curl, CURLOPT_TIMEOUT, 10);
         curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
         $data = curl_exec($curl);
         if (curl_errno($curl)) {
             return curl_error($curl);
         }
         curl_close($curl);
         return $data;
     }
     /**
      * 获取access_token
      * @return mixed
      */
     public function access_token()
     {
         $url = "/cgi-bin/token?grant_type=client_credential&appid={$this->app_id}&secret={$this->app_secret}";
         $token_data = $this->post_request($url);
         $token_data = json_decode($token_data, TRUE);
         if($token_data['access_token'] != '')
         {
             return $token_data['access_token'];
         }
     }
   /**
   * 获取微信授权链接
   * @param string $redirect_uri 跳转地址
   * @param mixed $state 参数
   */
    public function get_authorize_url($redirect_uri = '', $state = '')
    {
        $redirect_uri = urlencode($this->host.$redirect_uri);
        $url =  "/connect/oauth2/authorize?appid={$this->app_id}&redirect_uri={$redirect_uri}&response_type=code&scope=snsapi_userinfo&state={$state}#wechat_redirect";
        header('Location: ' . $url);
        die;
    }
    /**
    * 获取授权token
    * @param string $code 通过get_authorize_url获取到的code
    */
   public function get_access_token($code = '')
   {
      $token_url = "/sns/oauth2/access_token?appid={$this->app_id}&secret={$this->app_secret}&code={$code}&grant_type=authorization_code";
      $token_data = $this->http($token_url);
      if($token_data[0] == 200)
      {
          return json_decode($token_data[1], TRUE);
      }
       return FALSE;
   }
     /**
       * 获取授权后的微信用户信息
       *
       * @param string $access_token
       * @param string $open_id
       */
     public function get_user_info($access_token = '', $open_id = '')
    {
        if($access_token && $open_id)
        {
            $info_url = "/sns/userinfo?access_token={$access_token}&openid={$open_id}&lang=zh_CN";
            $info_data = $this->http($info_url);
            if($info_data[0] == 200)
            {
                return json_decode($info_data[1], TRUE);
            }
        }
        return FALSE;
    }
    public function http($url, $method, $postfields = null, $headers = array(), $debug = false)
    {
           $ci = curl_init();
           curl_setopt($ci, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
           curl_setopt($ci, CURLOPT_CONNECTTIMEOUT, 30);
           curl_setopt($ci, CURLOPT_TIMEOUT, 30);
           curl_setopt($ci, CURLOPT_RETURNTRANSFER, true);
            switch ($method) {
                case 'POST':
                    curl_setopt($ci, CURLOPT_POST, true);
                    if (!empty($postfields)) {
                        curl_setopt($ci, CURLOPT_POSTFIELDS, $postfields);
                        $this->postdata = $postfields;
                    }
                    break;
            }
            curl_setopt($ci, CURLOPT_URL, $url);
            curl_setopt($ci, CURLOPT_HTTPHEADER, $headers);
            curl_setopt($ci, CURLINFO_HEADER_OUT, true);
            $response = curl_exec($ci);
            $http_code = curl_getinfo($ci, CURLINFO_HTTP_CODE);
            if ($debug) {
                echo "=====post data======\r\n";
                var_dump($postfields);
                echo '=====info=====' . "\r\n";
                print_r(curl_getinfo($ci));
                echo '=====$response=====' . "\r\n";
                print_r($response);
            }
            curl_close($ci);
            return array($http_code, $response);
    }
}