微信公衆平臺開發——微信受權登陸(OAuth2.0)

一、OAuth2.0簡介php

  OAuth(開放受權)是一個開放標準,容許用戶讓第三方應用訪問該用戶在某一網站上存儲的私密的資源(如照片,視頻,聯繫人列表),而無需將用戶名和密碼提供給第三方應用。html

  容許用戶 提供一個令牌而不是用戶名和密碼來訪問他們存放在特定服務提供者的數據。每個令牌受權一個特定的網站(例如,視頻編輯網站)在特定的時段(例如,接下來的2小時內)內訪問特定的資源(例如僅僅是某一相冊中的視頻)。這樣,OAuth容許用戶受權第三方網站訪問他們存儲在另外的服務提供者上的信息,而不須要分享他們的訪問許可或他們數據的全部內容。
  咱們這裏主要模擬在微信公衆號中使用OAuth2.0進行受權,獲取用戶的基本信息的過程。詳細的開發文檔可查看微信的官方文檔。  

微信公衆平臺開發者文檔:json

http://mp.weixin.qq.com/wiki/14/89b871b5466b19b3efa4ada8e577d45e.htmlapi

 
二、獲取測試公衆帳號及其相關配置

1)、公衆測試帳號獲取數組

  訪問上面的鏈接,選擇「接口測試號申請」得到直接打開http://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/index經過微信客戶端掃碼登陸便可登陸。瀏覽器

  登陸完便可獲取到一個測試公衆帳號的信息。主要有appId和appsecret兩個參數,這將惟一標示一個公衆號,而且須要將他們做爲參數獲取用戶的信息。安全

2)、關注公衆號服務器

   用戶只有關注了這個公衆號了,才能經過打開有公衆號信息的連接去受權第三方登陸,並獲取用戶信息的操做。故咱們還須要用咱們的微信關注微信號,操做以下:
  仍是剛剛那個登陸成功後跳轉的頁面,咱們能夠看到,該頁面有一個二維碼,咱們能夠經過掃描該二維碼進行關注,關注成功在右邊的「用戶列表」會多一個用戶的信息。以下圖所示:
 3)、配置回調函數
  咱們在微信客戶端訪問第三方網頁(即咱們本身的網頁)的時候,咱們能夠經過微信網頁受權機制,咱們不只要有前面獲取到的appid和appsecret還須要有當用戶受權以後,回調的域名設置,即用戶受權後,頁面會跳轉到哪裏。具體的配置以下:

  仍是在剛剛的頁面,有一個「網頁受權獲取用戶基本信息」,點擊後面的修改微信

 
   填寫回調的域名:
 
  若是你的網址沒有被列入過黑名單,就會在頂部出現
 
 而後,域名配置就成功了!

注意app

一、這裏填寫的是域名(是一個字符串),而不是URL,所以請勿加http://等協議頭;
二、受權回調域名配置規範爲全域名,好比須要網頁受權的域名爲:www.qq.com,配置之後此域名下面的頁面http://www.qq.com/music.html 、 http://www.qq.com/login.html 均可以進行OAuth2.0鑑權。但http://pay.qq.com 、 http://music.qq.com 、 http://qq.com沒法進行OAuth2.0鑑權

  到這裏,咱們就獲取到咱們必須用到的測試信息了,包括

  • 公衆號appID、appsecret的獲取;
  • 關注咱們測試的公衆號;
  • 配置掃碼用戶受權後回調的域名。
三、微信受權登陸並獲取用戶基本信息

  微信受權使用的是OAuth2.0受權的方式。主要有如下簡略步驟

  第一步:用戶贊成受權,獲取code

  第二步:經過code換取網頁受權access_token

  第三步:刷新access_token(若是須要)

  第四步:拉取用戶信息(需scope爲 snsapi_userinfo)

 

  詳細的步驟以下:

  1.用戶關注微信公衆帳號。

  2.微信公衆帳號提供用戶請求受權頁面URL。

  3.用戶點擊受權頁面URL,將向服務器發起請求

  4.服務器詢問用戶是否贊成受權給微信公衆帳號(scope爲snsapi_base時無此步驟)

  5.用戶贊成(scope爲snsapi_base時無此步驟)

  6.服務器將CODE經過回調傳給微信公衆帳號

  7.微信公衆帳號得到CODE

  8.微信公衆帳號經過CODE向服務器請求Access Token

  9.服務器返回Access Token和OpenID給微信公衆帳號

  10.微信公衆帳號經過Access Token向服務器請求用戶信息(scope爲snsapi_base時無此步驟)

  11.服務器將用戶信息回送給微信公衆帳號(scope爲snsapi_base時無此步驟)

1)、用戶受權並獲取code

  在域名(前面配置的回調域名)根目錄下,新建一個文件,命名爲oauth.php(名字隨便你取,下面的redirect_uri作相應修改便可)該php實現的功能也很簡單,只是將url上的code參數取出來並打印出來而已,方便咱們進行接下來的操做。

  Oauth.php中的內容以下:

複製代碼
<?php
if (isset($_GET['code'])){
    echo $_GET['code'];
}else{
    echo "NO CODE";
}
?>
複製代碼

   這個php的主要目的是當用戶確認受權登陸以後,會調轉到redirect_uri這個地址上,並帶上code參數(微信生成),咱們爲了方便獲取,這裏也能夠是一個空白的頁面,下面有其餘方法獲得url上面的code參數。

  請求受權頁面的構造方式:

https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect

 參數說明

參數

必須

說明

appid

公衆號的惟一標識(這個就是咱們前面申請的)

redirect_uri

受權後重定向的回調連接地址(咱們前面申請的)

response_type

返回類型,請填寫code

scope

應用受權做用域,snsapi_base (不彈出受權頁面,直接跳轉,只能獲取用戶openid),snsapi_userinfo (彈出受權頁面,可經過openid拿到暱稱、性別、所在地。而且,即便在未關注的狀況下,只要用戶受權,也能獲取其信息)

state

重定向後會帶上state參數,開發者能夠填寫a-zA-Z0-9的參數值,最多128字節,該值會被微信原樣返回,咱們能夠將其進行比對,防止別人的攻擊。

#wechat_redirect

直接在微信打開連接,能夠不填此參數。作頁面302重定向時候,必須帶此參數

 

  應用受權做用域:因爲snsapi_base只能獲取到openid,意義不大,因此咱們使用snsapi_userinfo。
  回調地址:填寫爲剛纔上傳後的oauth.php的文件地址,
  state參數:隨便一個數字,這裏填123

  尤爲注意:因爲受權操做安全等級較高,因此在發起受權請求時,微信會對受權連接作正則強匹配校驗,若是連接的參數順序不對,受權頁面將沒法正常訪問

  構造請求url以下:

https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx4a22b50d7e897f97&redirect_uri=http%3a%2f%2fad.seewo.com%2foauth.php&response_type=code&scope=snsapi_userinfo&state=123#wechat_redirect

   這個須要發到微信中,使用微信瀏覽器才能打開。

  點開上面的連接,點擊確認登陸便可跳轉到剛剛配置的回調頁面,並獲取了微信傳回的code參數,用於下面的操做。

受權頁面以下:

受權後跳轉的頁面(咱們前面配置的redirect_uri):

  假如咱們沒有在php中打印出了code,這個時候咱們能夠經過右上角按鈕中的複製連接,獲得連接以下:

http://ad.seewo.com/oauth2.php?code=0217a07e9c194dbf539c45c266b2dcfZ&state=123

 code說明 :

code做爲換取access_token的票據,每次用戶受權帶上的code將不同,code只能使用一次,5分鐘未被使用自動過時。

1)、使用code換取access_token

換取網頁受權access_token頁面的構造方式:

https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

參數說明

參數

是否必須

說明

appid

公衆號的惟一標識

secret

公衆號的appsecret

code

填寫第一步獲取的code參數

grant_type

填寫爲authorization_code

code:在這裏填寫爲上一步得到的值。
構造的url以下,在網頁中打開連接就行:

https://api.weixin.qq.com/sns/oauth2/access_token?appid=wx41cb8dbd827a16e9&secret=d4624c36b6795d1d99dcf0547af5443d&code=00137323023ab55775be09d6d8e75ffA&grant_type=authorization_code 

  只有獲取code的連接必須是在微信客戶端中點開的,獲取access_token和用戶信息能夠直接在網頁打開便可。

返回說明

正確時返回的JSON數據包以下:

複製代碼
{

   "access_token":"ACCESS_TOKEN",

   "expires_in":7200,

   "refresh_token":"REFRESH_TOKEN",

   "openid":"OPENID",

   "scope":"SCOPE"

}
複製代碼

 

參數

描述

access_token

網頁受權接口調用憑證,注意:此access_token與基礎支持的access_token不一樣

expires_in

access_token接口調用憑證超時時間,單位(秒)

refresh_token

用戶刷新access_token

openid

用戶惟一標識

scope

用戶受權的做用域,使用逗號(,)分隔


  錯誤時微信會返回JSON數據包以下(示例爲Code無效錯誤):

{"errcode":40029,"errmsg":"invalid code"}

2)、經過access_token、openid獲取用戶信息 

請求方法:

https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID

  參數說明

參數

描述

access_token

網頁受權接口調用憑證,注意:此access_token與基礎支持的access_token不一樣

openid

用戶的惟一標識

  構造url以下:

https://api.weixin.qq.com/sns/userinfo?access_token=OezXcEiiBSKSxW0eoylIeABONBTt9gBE6cK3arF_L6aOvwU4ynS5ZxG4r6ZUIJxh7y_ClmPRkYbMeOc_r30LAGB2IEAlCFsQQvfQMJSwHcU6109-6vz603Jho4oZhdns6AOXwoxaWcLujT1RWnC_hQ&openid=oF3PcsnsrMiJzEwalZZbAfWQpxCI

  能夠在瀏覽器中直接執行這個。

  獲得的json格式數據以下:

複製代碼
{

   "openid":" OPENID",

   " nickname": NICKNAME,

   "sex":"1",

   "province":"PROVINCE"

   "city":"CITY",

   "country":"COUNTRY",

    "headimgurl":    "http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/46", 

"privilege":[

"PRIVILEGE1"

"PRIVILEGE2"

    ],

    "unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"

}
複製代碼

參數

描述

openid

用戶的惟一標識

nickname

用戶暱稱

sex

用戶的性別,值爲1時是男性,值爲2時是女性,值爲0時是未知

province

用戶我的資料填寫的省份

city

普通用戶我的資料填寫的城市

country

國家,如中國爲CN

headimgurl

用戶頭像,最後一個數值表明正方形頭像大小(有0、4六、6四、9六、132數值可選,0表明640*640正方形頭像),用戶沒有頭像時該項爲空。若用戶更換頭像,原有頭像URL將失效。

privilege

用戶特權信息,json 數組,如微信沃卡用戶爲(chinaunicom)

unionid

只有在用戶將公衆號綁定到微信開放平臺賬號後,纔會出現該字段。詳見:獲取用戶我的信息(UnionID機制)

  錯誤時微信會返回JSON數據包以下(示例爲openid無效):

{"errcode":40003,"errmsg":" invalid openid "}
值得注意的地方:

  用戶管理類接口中的「獲取用戶基本信息接口」,是在用戶和公衆號產生消息交互或關注後事件推送後,才能根據用戶OpenID來獲取用戶基本信息。這個接口,包括其餘微信接口,都是須要該用戶(即openid)關注了公衆號後,才能調用成功的。

  網頁受權獲取用戶基本信息也遵循UnionID機制。即若是開發者有在多個公衆號,或在公衆號、移動應用之間統一用戶賬號的需求,須要前往微信開放平臺(open.weixin.qq.com)綁定公衆號後,纔可利用UnionID機制來知足上述需求。

  UnionID機制的做用說明:若是開發者擁有多個移動應用、網站應用和公衆賬號,可經過獲取用戶基本信息中的unionid來區分用戶的惟一性,由於同一用戶,對同一個微信開放平臺下的不一樣應用(移動應用、網站應用和公衆賬號),unionid是相同的。

  尤爲注意:因爲公衆號的secret和獲取到的access_token安全級別都很是高,必須只保存在服務器,不容許傳給客戶端。後續刷新access_token、經過access_token獲取用戶信息等步驟,也必須從服務器發起。

相關文章
相關標籤/搜索