微信登陸解析

工做上須要作個微信登陸,以前沒有經驗,本身摸索,結果遇到了一些坑,固然是解決了,可是有一個坑好無語,就是回調地址不能有http://,結果連接裏的redirect_uri就要加上,否則就報參數錯誤。網上查找了好多redirect_uri參數錯誤的答案,居然沒人提到這點,害我百思不解,我也是醉了。
php

首先是微信網頁受權的官方文檔,主要是依靠這個來完成微信登陸功能
html

網頁受權數據庫

首先要有一個服務號,有appid,appsecret,登陸公衆平臺後填好回調網址,有這三樣就沒什麼問題了。json

下載一個微信開發者工具,成爲開發者,會方便開發,固然沒有也沒什麼問題,可是你就沒法在電腦上直接觀察調試結果了。api

這是登陸受權連接,只須要填寫appid和redirect_uri。注意redirect_uri要加http://,固然也有多是我這個回調網址特殊。snsapi_userinfo是獲取用戶全部信息,具體參考官方說明,就是網頁受權連接。微信

https://open.weixin.qq.com/connect/oauth2/authorize?appid=appid&redirect_uri=redirect_uri&response_type=code&scope=snsapi_userinfo&state=1#wechat_redire
cookie

不出意外點擊這個連接會出現受權登陸頁面,點登陸就會跳轉到回調地址。微信開發

登陸後的地址相似:app

www.???.com/?code=???&state=1
微信公衆平臺

獲得code能夠獲取access_token和opendi,code和access_token均可以當作令牌,opendi就是獲得用戶信息的關鍵。

插句話,要驗證可否順利獲得access_token,也順便驗證你的appid和appsecret是否沒問題,能夠到這個網址驗證,萬一以後出問題能夠排除appid和appsecret的錯誤。

微信公衆平臺接口調試工具

這是獲取access_token的連接:

https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=appid&secret=appsecret

直接上代碼,不出問題能夠獲得用戶信息:

<?php
class weixinclass
{
  var $appid;
  var $appsecret;
  //構造函數,獲取Access Token
  public function __construct($appid = NULL, $appsecret = NULL)
  {
    if($appid){
      $this->appid = $appid;
    }
    if($appsecret){
      $this->appsecret = $appsecret;
    }
    $this->access_token = "";
      $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$this->appid."&secret=".$this->appsecret;
      $res = $this->https_request($url);
      $result = json_decode($res, true);
      $this->access_token = $result["access_token"];
  }
//獲取用戶基本信息
  public function get_user_info($openid)
  {
    $url = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=".$this->access_token."&openid=".$openid."&lang=zh_CN";
    $res = $this->https_request($url);
    return json_decode($res, true);
  }
//https請求
  public function https_request($url, $data = null)
  {
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
    if (!empty($data)){
      curl_setopt($curl, CURLOPT_POST, 1);
      curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
    }
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    $output = curl_exec($curl);
    curl_close($curl);
    return $output;
  }
}
<?php
header('content-type:text/html;charset=utf-8');
class OauthAction extends Action {
    public function oauth2(){
    require_once 'weixinclass.php';
      $appid = '填appid';
      $appsecret = '填appsecret ';
      $weixin=new weixinclass($appid,$appsecret);
      if (isset($_GET['code'])){
        $url="https://api.weixin.qq.com/sns/oauth2/access_token?appid=".$appid."&secret=".$appsecret."&code=".$_GET['code']."&grant_type=authorization_code";
        $res = $weixin->https_request($url);
        $res=(json_decode($res, true));
        $row=$weixin->get_user_info($res['openid']);
        if ($row['openid']) {
          //這裏寫上邏輯,存入cookie,數據庫等操做
            echo "<pre>";
            print_r($row);die;
          cookie('weixin',$row['openid'],25920);
        }else{
          $this->error('受權出錯,請從新受權!');
        }
      }else{
        echo "NO CODE";
      }
      $this->display();
    }

}

上面的代碼也是參考一些別人的內容,經測試沒問題。而後打印出來的信息相似這樣:

Array
(
    [subscribe] => 
    [openid] => 
    [nickname] => nobody
    [sex] => 1
    [language] => zh_CN
    [city] => 
    [province] => 
    [country] => 亞美尼亞
    [headimgurl] => 
    [unionid] => 
    [remark] => 
    [groupid] => 0
    [tagid_list] => Array
        (
        )

)

end.

相關文章
相關標籤/搜索