国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目錄
1、關(guān)注用戶列表及用戶分組信息
2、獲取AIP調(diào)用者的的Token?
3、獲取關(guān)注用戶列表
4、獲取用戶詳細(xì)信息
首頁 微信小程序 微信開發(fā) C#開發(fā)微信門戶及應(yīng)用(4)--關(guān)注用戶列表及詳細(xì)信息管理

C#開發(fā)微信門戶及應(yīng)用(4)--關(guān)注用戶列表及詳細(xì)信息管理

Feb 16, 2017 pm 04:34 PM

在上個(gè)月的對(duì)C#開發(fā)微信門戶及應(yīng)用做了介紹,寫過了幾篇的隨筆進(jìn)行分享,由于時(shí)間關(guān)系,間隔了一段時(shí)間沒有繼續(xù)寫這個(gè)系列的博客了,并不是對(duì)這個(gè)方面停止了研究,而是繼續(xù)深入探索這方面的技術(shù),為了更好的應(yīng)用起來,專心做好底層的技術(shù)開發(fā)。

微信的很重要的一個(gè)特點(diǎn)就是能夠利用其平臺(tái)龐大的用戶群體,因此很容易整合在CRM(客戶關(guān)系管理)系統(tǒng)里面,服務(wù)號(hào)和訂閱好都能夠向關(guān)注者推送相關(guān)的產(chǎn)品消息,還能和48小時(shí)內(nèi)響應(yīng)消息和事件的活躍用戶進(jìn)行交互對(duì)話,因此用戶信息是微信API里面非常重要的一環(huán),本隨筆主要介紹獲取關(guān)注用戶、查看用戶信息、分組管理等方面的開發(fā)應(yīng)用。

1、關(guān)注用戶列表及用戶分組信息

在微信的管理平臺(tái)上,我們可以看到自己賬號(hào)的關(guān)注者用戶,以及用戶分組信息,如下所示。

C#開發(fā)微信門戶及應(yīng)用(4)--關(guān)注用戶列表及詳細(xì)信息管理 ?

上面的管理界面,能看到關(guān)注者用戶的基礎(chǔ)信息,但是使用微信API獲取到的是一個(gè)稱之為OpenID的列表,我們先了解這個(gè)東西是什么?微信API的說明給出下面的解析:

關(guān)注者列表由一串OpenID(加密后的微信號(hào),每個(gè)用戶對(duì)每個(gè)公眾號(hào)的OpenID是唯一的。對(duì)于不同公眾號(hào),同一用戶的openid不同)組成。公眾號(hào)可通過本接口來根據(jù)OpenID獲取用戶基本信息,包括昵稱、頭像、性別、所在城市、語言和關(guān)注時(shí)間。

上面的解析意思很清楚了,就是一個(gè)用戶關(guān)注我們的公眾號(hào),那么不管他是第幾次關(guān)注,對(duì)我們公眾號(hào)來說,都是一個(gè)確定的值;但是,一個(gè)用戶對(duì)其他公眾號(hào),卻有著其他不同的OpenID。

微信提供了為數(shù)不多的幾個(gè)關(guān)鍵字信息,用來記錄用戶的相關(guān)內(nèi)容,根據(jù)用戶的相關(guān)定義,我們定義一個(gè)實(shí)體類,用來放置獲取回來的用戶信息。

????///?<summary>
????///?高級(jí)接口獲取的用戶信息。????///?在關(guān)注者與公眾號(hào)產(chǎn)生消息交互后,公眾號(hào)可獲得關(guān)注者的OpenID????///?(加密后的微信號(hào),每個(gè)用戶對(duì)每個(gè)公眾號(hào)的OpenID是唯一的。對(duì)于不同公眾號(hào),同一用戶的openid不同)。????///?公眾號(hào)可通過本接口來根據(jù)OpenID獲取用戶基本信息,包括昵稱、頭像、性別、所在城市、語言和關(guān)注時(shí)間。????///?</summary>
????public?class?UserJson?:?BaseJsonResult
????{????????///?<summary>
????????///?用戶是否訂閱該公眾號(hào)標(biāo)識(shí),值為0時(shí),代表此用戶沒有關(guān)注該公眾號(hào),拉取不到其余信息。????????///?</summary>
????????public?int?subscribe?{?get;?set;?}????????///?<summary>
????????///?用戶的標(biāo)識(shí),對(duì)當(dāng)前公眾號(hào)唯一????????///?</summary>
????????public?string?openid?{?get;?set;?}????????///?<summary>
????????///?用戶的昵稱????????///?</summary>
????????public?string?nickname?{?get;?set;?}????????///?<summary>
????????///?用戶的性別,值為1時(shí)是男性,值為2時(shí)是女性,值為0時(shí)是未知????????///?</summary>
????????public?int?sex?{?get;?set;?}????????///?<summary>
????????///?用戶的語言,簡(jiǎn)體中文為zh_CN????????///?</summary>
????????public?string?language?{?get;?set;?}????????///?<summary>
????????///?用戶所在城市????????///?</summary>
????????public?string?city?{?get;?set;?}????????///?<summary>
????????///?用戶所在省份????????///?</summary>
????????public?string?province?{?get;?set;?}????????///?<summary>
????????///?用戶所在國(guó)家????????///?</summary>
????????public?string?country?{?get;?set;?}????????///?<summary>
????????///?用戶頭像,最后一個(gè)數(shù)值代表正方形頭像大?。ㄓ?、46、64、96、132數(shù)值可選,0代表640*640正方形頭像),用戶沒有頭像時(shí)該項(xiàng)為空????????///?</summary>
????????public?string?headimgurl?{?get;?set;?}????????///?<summary>
????????///?用戶關(guān)注時(shí)間,為時(shí)間戳。如果用戶曾多次關(guān)注,則取最后關(guān)注時(shí)間????????///?</summary>
????????public?long?subscribe_time?{?get;?set;?}
????}

根據(jù)分組信息定義,我們定義一個(gè)分組的實(shí)體類信息。

????///?<summary>
????///?分組信息????///?</summary>
????public?class?GroupJson?:?BaseJsonResult
????{????????///?<summary>
????????///?分組id,由微信分配????????///?</summary>
????????public?int?id?{?get;?set;?}????????///?<summary>
????????///?分組名字,UTF8編碼????????///?</summary>
????????public?string?name?{?get;?set;?}
????}

2、獲取AIP調(diào)用者的的Token?

在做微信API的開發(fā),很多時(shí)候,我們都需要傳入一個(gè)AccessToken,這個(gè)就是區(qū)分調(diào)用者和記錄會(huì)話信息的字符串,因此,在學(xué)習(xí)所有API開發(fā)之前,我們需要很好理解這個(gè)訪問控制參數(shù)。

C#開發(fā)微信門戶及應(yīng)用(4)--關(guān)注用戶列表及詳細(xì)信息管理

這個(gè)對(duì)象的定義,我們可以從微信的API說明中了解。

access_token是公眾號(hào)的全局唯一票據(jù),公眾號(hào)調(diào)用各接口時(shí)都需使用access_token。正常情況下access_token有效期為7200秒,重復(fù)獲取將導(dǎo)致上次獲取的access_token失效。由于獲取access_token的api調(diào)用次數(shù)非常有限,建議開發(fā)者全局存儲(chǔ)與更新access_token,頻繁刷新access_token會(huì)導(dǎo)致api調(diào)用受限,影響自身業(yè)務(wù)。

根據(jù)上面的說明定義,我們可以看到,它是一個(gè)和身份,以及會(huì)話時(shí)間有關(guān)的一個(gè)參數(shù),而且它的產(chǎn)生次數(shù)有限制,因此要求我們需要對(duì)它進(jìn)行緩存并重復(fù)利用,在會(huì)話到期之前,我們應(yīng)該盡可能重用這個(gè)參數(shù),避免反復(fù)請(qǐng)求,增加服務(wù)器壓力,以及調(diào)用的時(shí)間。

我定義了一個(gè)方法,用來構(gòu)造生成相關(guān)的Access Token,而且它具有緩存的功能,但具體如何緩存及使用,對(duì)我API的調(diào)用是透明的,我們只要用的時(shí)候,就對(duì)它調(diào)用就是了。

????????///?獲取憑證接口????????///?</summary>
????????///?<param name="appid">第三方用戶唯一憑證</param>
????????///?<param name="secret">第三方用戶唯一憑證密鑰,既appsecret</param>
????????string?GetAccessToken(string?appid,?string?secret);

緩存主要是基于.NET4增加的類庫(kù)MemoryCache,這個(gè)是一個(gè)非常不錯(cuò)的緩存類。

我的獲取AccessToken的操作實(shí)現(xiàn)代碼如下所示。

????????///?<summary>
????????///?獲取每次操作微信API的Token訪問令牌????????///?</summary>
????????///?<param name="appid">應(yīng)用ID</param>
????????///?<param name="secret">開發(fā)者憑據(jù)</param>
????????///?<returns></returns>
????????public?string?GetAccessToken(string?appid,?string?secret)
????????{????????????//正常情況下access_token有效期為7200秒,這里使用緩存設(shè)置短于這個(gè)時(shí)間即可
????????????string?access_token?=?MemoryCacheHelper.GetCacheItem<string>("access_token",?delegate()
????????????????{????????????????????string?grant_type?=?"client_credential";????????????????????var?url?=?string.Format("http://www.miracleart.cn/{0}&appid={1}&secret={2}",
????????????????????????????????????????????grant_type,?appid,?secret);

????????????????????HttpHelper?helper?=?new?HttpHelper();????????????????????string?result?=?helper.GetHtml(url);????????????????????string?regex?=?"\"access_token\":\"(?<token>.*?)\"";
????????????????????string?token?=?CRegex.GetText(result,?regex,?"token");????????????????????return?token;
????????????????},????????????????new?TimeSpan(0,?0,?7000)//7000秒過期????????????);????????????return?access_token;????????????
????????}

由于我們知道,AccessToken默認(rèn)是7200秒過期,因此在這個(gè)時(shí)間段里面,我們盡可能使用緩存來記錄它的值,如果超過了這個(gè)時(shí)間,我們調(diào)用這個(gè)方法的時(shí)候,它會(huì)自動(dòng)重新獲取一個(gè)新的值給我們了。

?

3、獲取關(guān)注用戶列表

獲取關(guān)注用戶列表,一次拉取API調(diào)用,最多拉取10000個(gè)關(guān)注者的OpenID,可以通過多次拉取的方式來滿足需求。微信的接口定義如下所示。

http請(qǐng)求方式: GET(請(qǐng)使用https協(xié)議)
http://www.miracleart.cn/

這個(gè)接口返回的數(shù)據(jù)是

{"total":2,"count":2,"data":{"openid":["","OPENID1","OPENID2"]},"next_openid":"NEXT_OPENID"}

根據(jù)返回的Json數(shù)據(jù)定義,我們還需要定義兩個(gè)實(shí)體類,用來存放返回的結(jié)果。

????///?<summary>
????///?獲取關(guān)注用戶列表的Json結(jié)果????///?</summary>
????public?class?UserListJsonResult?:?BaseJsonResult
????{????????///?<summary>
????????///?關(guān)注該公眾賬號(hào)的總用戶數(shù)????????///?</summary>
????????public?int?total?{?get;?set;?}????????///?<summary>
????????///?拉取的OPENID個(gè)數(shù),最大值為10000????????///?</summary>
????????public?int?count?{?get;?set;?}????????///?<summary>
????????///?列表數(shù)據(jù),OPENID的列表????????///?</summary>
????????public?OpenIdListData?data?{?get;?set;?}????????///?<summary>
????????///?拉取列表的后一個(gè)用戶的OPENID????????///?</summary>
????????public?string?next_openid?{?get;?set;?}
????}????///?<summary>
????///?列表數(shù)據(jù),OPENID的列表????///?</summary>
????public?class?OpenIdListData
????{????????///?<summary>
????????///?OPENID的列表????????///?</summary>
????????public?List<string>?openid?{?get;?set;?}
????}

為了獲取相關(guān)的用戶信息,我定義了一個(gè)接口,用來獲取用戶的信息,接口定義如下所示。

????///?<summary>
????///?微信用戶管理的API接口????///?</summary>
????public?interface?IUserApi
????{????????///?<summary>
????????///?獲取關(guān)注用戶列表????????///?</summary>
????????///?<param name="accessToken">調(diào)用接口憑證</param>
????????///?<param name="nextOpenId">第一個(gè)拉取的OPENID,不填默認(rèn)從頭開始拉取</param>
????????///?<returns></returns>
????????List<string>?GetUserList(string?accessToken,?string?nextOpenId?=?null);????????///?<summary>
????????///?獲取用戶基本信息????????///?</summary>
????????///?<param name="accessToken">調(diào)用接口憑證</param>
????????///?<param name="openId">普通用戶的標(biāo)識(shí),對(duì)當(dāng)前公眾號(hào)唯一</param>
????????///?<param name="lang">返回國(guó)家地區(qū)語言版本,zh_CN?簡(jiǎn)體,zh_TW?繁體,en?英語</param>
????????UserJson?GetUserDetail(string?accessToken,?string?openId,?Language?lang?=?Language.zh_CN);

然后在實(shí)現(xiàn)類里面,我們分別對(duì)上面兩個(gè)接口進(jìn)行實(shí)現(xiàn),獲取用戶列表信息如下所示。

????????///?<summary>
????????///?獲取關(guān)注用戶列表????????///?</summary>
????????///?<param name="accessToken">調(diào)用接口憑證</param>
????????///?<param name="nextOpenId">第一個(gè)拉取的OPENID,不填默認(rèn)從頭開始拉取</param>
????????///?<returns></returns>
????????public?List<string>?GetUserList(string?accessToken,?string?nextOpenId?=?null)
????????{
????????????List<string>?list?=?new?List<string>();????????????string?url?=?string.Format("http://www.miracleart.cn/{0}",?accessToken);????????????if?(!string.IsNullOrEmpty(nextOpenId))
????????????{
????????????????url?+=?"&next_openid="?+?nextOpenId;
????????????}

????????????UserListJsonResult?result?=?JsonHelper<UserListJsonResult>.ConvertJson(url);????????????if?(result?!=?null?&&?result.data?!=?null)
????????????{
????????????????list.AddRange(result.data.openid);
????????????}????????????return?list;
????????}

我們看到,轉(zhuǎn)換的邏輯已經(jīng)放到了JsonHelper里面去了,這個(gè)輔助類里面分別對(duì)數(shù)值進(jìn)行了獲取內(nèi)容,驗(yàn)證返回值,然后轉(zhuǎn)換正確實(shí)體類幾個(gè)部分的操作。

獲取內(nèi)容,通過輔助類HttpHelper進(jìn)行,這個(gè)在我的公用類庫(kù)里面,里面的邏輯主要就是通過HttpRequest進(jìn)行數(shù)據(jù)的獲取操作,不在贅述。

HttpHelper?helper?=?new?HttpHelper();string?content?=?helper.GetHtml(url);

由于返回的內(nèi)容,我們需要判斷它是否正確返回所需的結(jié)果,如果沒有,拋出自定義的相關(guān)異常,方便處理,具體如下所示。

????????///?<summary>
????????///?檢查返回的記錄,如果返回沒有錯(cuò)誤,或者結(jié)果提示成功,則不拋出異常????????///?</summary>
????????///?<param name="content">返回的結(jié)果</param>
????????///?<returns></returns>
????????private?static?bool?VerifyErrorCode(string?content)
????????{????????????if?(content.Contains("errcode"))
????????????{
????????????????ErrorJsonResult?errorResult?=?JsonConvert.DeserializeObject<ErrorJsonResult>(content);????????????????//非成功操作才記錄異常,因?yàn)橛行┎僮魇欠祷卣5慕Y(jié)果({"errcode":?0,?"errmsg":?"ok"})
????????????????if?(errorResult?!=?null?&&?errorResult.errcode?!=?ReturnCode.請(qǐng)求成功)
????????????????{????????????????????string?error?=?string.Format("微信請(qǐng)求發(fā)生錯(cuò)誤!錯(cuò)誤代碼:{0},說明:{1}",?(int)errorResult.errcode,?errorResult.errmsg);
????????????????????LogTextHelper.Error(errorResult);????????????????????throw?new?WeixinException(error);//拋出錯(cuò)誤????????????????}
????????????}????????????return?true;
????????}

然后轉(zhuǎn)換為相應(yīng)的格式,就是通過Json.NET的類庫(kù)進(jìn)行轉(zhuǎn)換。

????????????T?result?=?JsonConvert.DeserializeObject<T>(content);????????????return?result;

這樣我們就可以在ConvertJson函數(shù)實(shí)體里面,完整的進(jìn)行處理和轉(zhuǎn)換了,轉(zhuǎn)換完整的函數(shù)代碼如下所示。

????///?
????///?Json字符串操作輔助類????///?
????public?class?JsonHelper?where?T?:?class,?new()
????{????????///?<summary>
????????///?檢查返回的記錄,如果返回沒有錯(cuò)誤,或者結(jié)果提示成功,則不拋出異常????????///?</summary>
????????///?<param name="content">返回的結(jié)果</param>
????????///?<returns></returns>
????????private?static?bool?VerifyErrorCode(string?content)
????????{????????????if?(content.Contains("errcode"))
????????????{
????????????????ErrorJsonResult?errorResult?=?JsonConvert.DeserializeObject<ErrorJsonResult>(content);????????????????//非成功操作才記錄異常,因?yàn)橛行┎僮魇欠祷卣5慕Y(jié)果({"errcode":?0,?"errmsg":?"ok"})
????????????????if?(errorResult?!=?null?&&?errorResult.errcode?!=?ReturnCode.請(qǐng)求成功)
????????????????{????????????????????string?error?=?string.Format("微信請(qǐng)求發(fā)生錯(cuò)誤!錯(cuò)誤代碼:{0},說明:{1}",?(int)errorResult.errcode,?errorResult.errmsg);
????????????????????LogTextHelper.Error(errorResult);????????????????????throw?new?WeixinException(error);//拋出錯(cuò)誤????????????????}
????????????}????????????return?true;
????????}????????///?
????????///?轉(zhuǎn)換Json字符串到具體的對(duì)象????????///?
????????///?返回Json數(shù)據(jù)的鏈接地址
????????///?
????????public?static?T?ConvertJson(string?url)
????????{
????????????HttpHelper?helper?=?new?HttpHelper();????????????string?content?=?helper.GetHtml(url);
????????????VerifyErrorCode(content);

????????????T?result?=?JsonConvert.DeserializeObject<T>(content);????????????return?result;
????????}
}

調(diào)用這個(gè)API的界面層代碼如下所示(測(cè)試代碼)

????????????IUserApi?userBLL?=?new?UserApi();
????????????List<string>?userList?=?userBLL.GetUserList(token)

?

4、獲取用戶詳細(xì)信息

上面的獲取列表操作,相對(duì)比較簡(jiǎn)單,而且不用POST任何數(shù)據(jù),因此通過Get協(xié)議就能獲取到所需的數(shù)據(jù)。

本小節(jié)繼續(xù)介紹獲取用戶詳細(xì)信息的操作,這個(gè)操作也是通過GET協(xié)議就可以完成的。

這個(gè)API的調(diào)用定義如下所示:

http請(qǐng)求方式:?GET
https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN

通過傳入一個(gè)OpenId,我們就能很好獲取到用戶的相關(guān)信息了。

前面小節(jié)我們已經(jīng)定義了它的接口,說明了傳入及返回值,根據(jù)定義,它的實(shí)現(xiàn)函數(shù)如下所示。

????????///?<summary>
????????///?獲取用戶基本信息????????///?</summary>
????????///?<param name="accessToken">調(diào)用接口憑證</param>
????????///?<param name="openId">普通用戶的標(biāo)識(shí),對(duì)當(dāng)前公眾號(hào)唯一</param>
????????///?<param name="lang">返回國(guó)家地區(qū)語言版本,zh_CN?簡(jiǎn)體,zh_TW?繁體,en?英語</param>
????????public?UserJson?GetUserDetail(string?accessToken,?string?openId,?Language?lang?=?Language.zh_CN)
????????{????????????string?url?=?string.Format("http://www.miracleart.cn/{0}&openid={1}&lang={2}",
???????????????????accessToken,?openId,?lang.ToString());

????????????UserJson?result?=?JsonHelper<UserJson>.ConvertJson(url);????????????return?result;
????????}

最后,我們結(jié)合獲取用戶列表和獲取用戶詳細(xì)信息的兩個(gè)API,我們看看調(diào)用的代碼(測(cè)試代碼)。

????????private?void?btnGetUsers_Click(object?sender,?EventArgs?e)
????????{
????????????IUserApi?userBLL?=?new?UserApi();
????????????List<string>?userList?=?userBLL.GetUserList(token);????????????foreach?(string?openId?in?userList)
????????????{
????????????????UserJson?userInfo?=?userBLL.GetUserDetail(token,?openId);????????????????if?(userInfo?!=?null)
????????????????{????????????????????
????????????????????string?tips?=?string.Format("{0}:{1}",?userInfo.nickname,?userInfo.openid);
????????????????????Console.WriteLine(tips);
????????????????}
????????????}
????????}

?

更多C#開發(fā)微信門戶及應(yīng)用(4)--關(guān)注用戶列表及詳細(xì)信息管理?相關(guān)文章請(qǐng)關(guān)注PHP中文網(wǎng)!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請(qǐng)聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動(dòng)的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機(jī)

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強(qiáng)大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)代碼編輯軟件(SublimeText3)

熱門話題

Laravel 教程
1601
29
PHP教程
1502
276