微信接入之獲取用戶頭像

前段時間寫了關於微信支付接入,順便就把獲取用戶暱稱,頭像的方式也歸納下,這個其實挺簡單的,具體的方法看官方文檔即可。這裏只提幾個重點。

scope參數

看過微信文檔的話,微信的規定是,對於scope參數,如果需要獲取用戶信息的話,scope參數爲snsapi_userinfo。但是我接下來,使用過一次userinfo,實際上用snsapi_base也可以獲得用戶信息,一模一樣的返回值,對於獲取頭像和暱稱完全沒有任何問題

獲取頭像

獲取頭像其實有一點麻煩的就是跨域問題。要解決這個跨域問題,可以採用設置一個代理服務器,或者通過配置相關服務器(ngix,apache)來解決。這個網上方法很多,我這裏說的是不通過配置服務器的方法。

在我們的項目中,我並不想使用配置一個web服務器或者代理,因爲我們是遊戲服務器,我們是自己實現的,並沒有使用什麼web服務器框架,那麼這種情況下,我們解決跨域的問題就是由我們的服務器後端直接對跨域資源發起請求,在獲得對應的資源後,再返回前端。OK,這就是具體方法

具體實現時,其實很簡單,獲取到頭像的url後,直接發起一個http請求並獲取返回即可。

注意:http請求方式爲“GET”

另外需要提的一點是,對response的返回,要直接使用stream.Read,如果使用streamReader,以文本方式讀取字節流讀出來的數據是無法轉成圖片的。(我查閱過MSDN關於這兩個接口的說明,只是讀取時一個是文本形式,一個是字節流形式,其他並沒有過多的說有什麼區別)。

然後記得將字節流以Base64方式轉換,交由我們的前端處理

request = HttpWebRequest.Create(url);
request.Method = "GET";
response = request.GetResponse();
stream = response.GetResponseStream();
var buffer = new byte[4096];
var num = stream.Read(buffer, 0, 4096);
var head = Convert.ToBase64String(buffer, 0, num);

stream.Dispose();
response.Close();

上面的代碼有一個問題,我後來才注意到,就是當圖片比較大的時候,比如頭像地址最後的參數是64以上,或是/0(此時返回640*640大小的圖片),這個時候,stream可能一次不能讀取完所有的數據,所以修改代碼爲

var request = HttpWebRequest.Create(url);
request.Method = "GET";
var response = request.GetResponse();
var stream = response.GetResponseStream();
var buffer = new byte[response.ContentLength];
var num = stream.Read(buffer, 0, (int)response.ContentLength);
var total = num;
while(num > 0)
{
    num = stream.Read(buffer, total, (int)(response.ContentLength - total));
    total += num;
}
head = Convert.ToBase64String(buffer, 0, total);
發佈了33 篇原創文章 · 獲贊 31 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章