1. 程式人生 > >微信公眾平臺開發 網頁授權獲取使用者基本資訊

微信公眾平臺開發 網頁授權獲取使用者基本資訊

如果使用者在微信中(Web微信除外)訪問公眾號的第三方網頁,公眾號開發者可以通過此介面獲取當前使用者基本資訊(包括暱稱、性別、城市、國家)。利用使用者資訊,可以實現體驗優化、使用者來源統計、帳號繫結、使用者身份鑑權等功能。請注意,“獲取使用者基本資訊介面是在使用者和公眾號產生訊息互動時,才能根據使用者OpenID獲取使用者基本資訊,而網頁授權的方式獲取使用者基本資訊,則無需訊息互動,只是使用者進入到公眾號的網頁,就可彈出請求使用者授權的介面,使用者授權後,就可獲得其基本資訊(此過程甚至不需要使用者已經關注公眾號。)”


本介面是通過OAuth2.0來完成網頁授權的,是安全可靠的,關於OAuth2.0的詳細介紹,可以參考OAuth2.0協議標準。在微信公眾號請求使用者網頁授權之前,開發者需要先到公眾平臺網站的我的服務頁中配置授權回撥域名。

關於配置授權回撥域名的說明:

具體而言,網頁授權流程分為三步:

  1. 引導使用者進入授權頁面同意授權,獲取code
  2. 通過code換取網頁授權access_token(與基礎支援中的access_token不同)
  3. 如果需要,開發者可以重新整理網頁授權access_token,避免過期
  4. 通過網頁授權access_token和openid獲取使用者基本資訊

第一步:使用者同意授權,獲取code

在確保微信公眾賬號擁有授權作用域(scope引數)的許可權的前提下(服務號獲得高階介面後,預設帶有scope引數中的snsapi_base和snsapi_userinfo),引導關注者開啟如下頁面:

引數說明

引數是否必須說明
appid 公眾號的唯一標識
redirect_uri 授權後重定向的回撥連結地址
response_type 返回型別,請填寫code
scope 應用授權作用域,snsapi_base (不彈出授權頁面,直接跳轉,只能獲取使用者openid),snsapi_userinfo (彈出授權頁面,可通過openid拿到暱稱、性別、所在地。並且,即使在未關注的情況下,只要使用者授權,也能獲取其資訊
state 重定向後會帶上state引數,開發者可以填寫任意引數值
#wechat_redirect 直接在微信開啟連結,可以不填此引數。做頁面302重定向時候,必須帶此引數

下圖為scope等於snsapi_userinfo時的授權頁面:

網頁授權

使用者同意授權後

如果使用者同意授權,頁面將跳轉至 redirect_uri/?code=CODE&state=STATE。若使用者禁止授權,則重定向後不會帶上code引數,僅會帶上state引數redirect_uri?state=STATE

code說明 :
code作為換取access_token的票據,每次使用者授權帶上的code將不一樣,code只能使用一次,5分鐘未被使用自動過期。

第二步:通過code換取網頁授權access_token

首先請注意,這裡通過code換取的網頁授權access_token,與基礎支援中的access_token不同。公眾號可通過下述介面來獲取網頁授權access_token。如果網頁授權的作用域為snsapi_base,則本步驟中獲取到網頁授權access_token的同時,也獲取到了openid,snsapi_base式的網頁授權流程即到此為止。

請求方法

引數說明

引數是否必須說明
appid 公眾號的唯一標識
secret 公眾號的appsecret
code 填寫第一步獲取的code引數
grant_type 填寫為authorization_code

返回說明

正確時返回的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 使用者唯一標識,請注意,在未關注公眾號時,使用者訪問公眾號的網頁,也會產生一個使用者和公眾號唯一的OpenID
scope 使用者授權的作用域,使用逗號(,)分隔


錯誤時微信會返回JSON資料包如下(示例為Code無效錯誤):

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

第三步:重新整理access_token(如果需要)

由於access_token擁有較短的有效期,當access_token超時後,可以使用refresh_token進行重新整理,refresh_token擁有較長的有效期(7天、30天、60天、90天),當refresh_token失效的後,需要使用者重新授權。

請求方法

引數是否必須說明
appid 公眾號的唯一標識
grant_type 填寫為refresh_token
refresh_token 填寫通過access_token獲取到的refresh_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"}

第四步:拉取使用者資訊(需scope為 snsapi_userinfo)

如果網頁授權作用域為snsapi_userinfo,則此時開發者可以通過access_token和openid拉取使用者資訊了。

請求方法

引數說明

引數描述
access_token 網頁授權介面呼叫憑證,注意:此access_token與基礎支援的access_token不同
openid 使用者的唯一標識

返回說明

正確時返回的JSON資料包如下:

引數描述
openid 使用者的唯一標識
nickname 使用者暱稱
sex 使用者的性別,值為1時是男性,值為2時是女性,值為0時是未知
province 使用者個人資料填寫的省份
city 普通使用者個人資料填寫的城市
country 國家,如中國為CN
headimgurl 使用者頭像,最後一個數值代表正方形頭像大小(有0、46、64、96、132數值可選,0代表640*640正方形頭像),使用者沒有頭像時該項為空
privilege 使用者特權資訊,json 陣列,如微信沃卡使用者為(chinaunicom)


錯誤時微信會返回JSON資料包如下(示例為openid無效):

{"errcode":40003,"errmsg":" invalid openid "}