?? ??? C#?? WeChat ?? ? ?????? ??? ???? ??? ?? ???? ??????. ?? ???? ?? ??? ? ??? ???? ?? ???? ?????. ?? ?? ??? ??????. ??? ? ??? ??? ???? ????? ???? ?? ? ? ???? ?? ?? ?? ??? ??????.
WeChat? ?? ??? ??? ???? ??? ??? ??? ??? ? ???? CRM(?? ?? ??) ???? ?? ??? ? ??? ??? ?? ???? ?? ? ??? ????. ?? ??, 48?? ??? ???? ???? ??? ?? ????? ??? ?? ??? ??? ??? WeChat API?? ?? ??? ?????. , ?? ?? ? ??????? ?????.
1. ??? ??? ?? ? ??? ?? ??
?? ?? ?????? ??? ?? ?? ??? ??? ???? ??? ?? ??? ??? ? ????.
?? ?? ???????? ??? ???? ?? ??? ? ? ??? WeChat API? ???? ?? ?? OpenID?? ?????. ?? ???? WeChat API? ?? ??? ??? ????.
??? ??? OpenID(???? WeChat ID)? ???? ?????. ? ?? ??? ?? ? ???? OpenID? ?????. ???? openid? ????). ?? ??? ? ?????? ???? OpenID? ???? ???, ???, ??, ??, ?? ? ??? ??? ??? ?? ??? ??? ?? ? ????.
? ??? ??? ?? ?????. ?, ???? ?? ?? ??? ????? ??? ?? ??????? ?? ?? ?? ??? ?? ?? ?????. ?? ?? ??? ?? OpenID? ????.
WeChat? ??? ?? ???? ???? ?? ? ?? ??? ??? ????, ???? ?? ??? ???? ??? ??? ??? ???? ??? ???? ?????.
????///?<summary> ????///?高級接口獲取的用戶信息。????///?在關(guān)注者與公眾號產(chǎn)生消息交互后,公眾號可獲得關(guān)注者的OpenID????///?(加密后的微信號,每個用戶對每個公眾號的OpenID是唯一的。對于不同公眾號,同一用戶的openid不同)。????///?公眾號可通過本接口來根據(jù)OpenID獲取用戶基本信息,包括昵稱、頭像、性別、所在城市、語言和關(guān)注時間。????///?</summary> ????public?class?UserJson?:?BaseJsonResult ????{????????///?<summary> ????????///?用戶是否訂閱該公眾號標(biāo)識,值為0時,代表此用戶沒有關(guān)注該公眾號,拉取不到其余信息。????????///?</summary> ????????public?int?subscribe?{?get;?set;?}????????///?<summary> ????????///?用戶的標(biāo)識,對當(dāng)前公眾號唯一????????///?</summary> ????????public?string?openid?{?get;?set;?}????????///?<summary> ????????///?用戶的昵稱????????///?</summary> ????????public?string?nickname?{?get;?set;?}????????///?<summary> ????????///?用戶的性別,值為1時是男性,值為2時是女性,值為0時是未知????????///?</summary> ????????public?int?sex?{?get;?set;?}????????///?<summary> ????????///?用戶的語言,簡體中文為zh_CN????????///?</summary> ????????public?string?language?{?get;?set;?}????????///?<summary> ????????///?用戶所在城市????????///?</summary> ????????public?string?city?{?get;?set;?}????????///?<summary> ????????///?用戶所在省份????????///?</summary> ????????public?string?province?{?get;?set;?}????????///?<summary> ????????///?用戶所在國家????????///?</summary> ????????public?string?country?{?get;?set;?}????????///?<summary> ????????///?用戶頭像,最后一個數(shù)值代表正方形頭像大小(有0、46、64、96、132數(shù)值可選,0代表640*640正方形頭像),用戶沒有頭像時該項為空????????///?</summary> ????????public?string?headimgurl?{?get;?set;?}????????///?<summary> ????????///?用戶關(guān)注時間,為時間戳。如果用戶曾多次關(guān)注,則取最后關(guān)注時間????????///?</summary> ????????public?long?subscribe_time?{?get;?set;?} ????}
??? ?? ??? ?? ???? ??? ??? ??? ?????.
????///?<summary> ????///?分組信息????///?</summary> ????public?class?GroupJson?:?BaseJsonResult ????{????????///?<summary> ????????///?分組id,由微信分配????????///?</summary> ????????public?int?id?{?get;?set;?}????????///?<summary> ????????///?分組名字,UTF8編碼????????///?</summary> ????????public?string?name?{?get;?set;?} ????}
2. AIP ???? ?? ??
WeChat API? ??? ? AccessToken? ???? ?? ??? ????. ???? ???? ?? ??? ???? ?????? ?? API ??? ??? ?? ? ?? ?? ?? ??? ? ???? ???.
WeChat? API ???? ? ??? ??? ?? ??? ? ????.
access_token? ?? ??? ????? ??? ?????. ?? ??? ? ?????? ??? ? access_token? ???? ???. ???? ????? access_token? 7200? ?? ?????. ????? ???? ??? access_token? ??????. access_token? ?? ?? API ?? ??? ?? ???? ???? ???? access_token? ????? ???? ?????? ?? ????. access_token? ?? ?? ??? API ??? ???? ????? ??? ????.
?? ??? ??? ID ? ?? ??? ??? ?? ???? ??? ? ?? ???? ??? ??? ? ? ???? ??? ???? ?? ? ????? ??? ????? ?? ??? ??? ?? ??? ?? ??? ??? ???.
?? Access Token? ???? ???? ???? ?????, ?? ??? ???, ?? ???? ???? ??? API ??? ?????. ??.
????????///?獲取憑證接口????????///?</summary> ????????///?<param name="appid">第三方用戶唯一憑證</param> ????????///?<param name="secret">第三方用戶唯一憑證密鑰,既appsecret</param> ????????string?GetAccessToken(string?appid,?string?secret);
??? ?? .NET4? ??? ??? ?????? MemoryCache? ???? ?? ?? ?? ?? ??????.
AccessToken? ?? ?? ?? ?? ?? ??? ??? ????.
????????///?<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è)置短于這個時間即可 ????????????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? ????? 7200? ?? ????? ?? ?? ???? ? ?? ?? ??? ? ??? ???? ?? ?????. ? ?? ??? ? ???? ???? ???? ? ?? ?? ???.
3. ??? ??? ?? ????
? ?? ? API ??? ?? 10,000?? ??? OpenID? ??? ? ????. ?? ?. WeChat? ????? ??? ??? ????.
http ?? ??: GET(https ????? ?????)
http://www.miracleart.cn/
這個接口返回的數(shù)據(jù)是
{"total":2,"count":2,"data":{"openid":["","OPENID1","OPENID2"]},"next_openid":"NEXT_OPENID"}
根據(jù)返回的Json數(shù)據(jù)定義,我們還需要定義兩個實體類,用來存放返回的結(jié)果。
????///?<summary> ????///?獲取關(guān)注用戶列表的Json結(jié)果????///?</summary> ????public?class?UserListJsonResult?:?BaseJsonResult ????{????????///?<summary> ????????///?關(guān)注該公眾賬號的總用戶數(shù)????????///?</summary> ????????public?int?total?{?get;?set;?}????????///?<summary> ????????///?拉取的OPENID個數(shù),最大值為10000????????///?</summary> ????????public?int?count?{?get;?set;?}????????///?<summary> ????????///?列表數(shù)據(jù),OPENID的列表????????///?</summary> ????????public?OpenIdListData?data?{?get;?set;?}????????///?<summary> ????????///?拉取列表的后一個用戶的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)的用戶信息,我定義了一個接口,用來獲取用戶的信息,接口定義如下所示。
????///?<summary> ????///?微信用戶管理的API接口????///?</summary> ????public?interface?IUserApi ????{????????///?<summary> ????????///?獲取關(guān)注用戶列表????????///?</summary> ????????///?<param name="accessToken">調(diào)用接口憑證</param> ????????///?<param name="nextOpenId">第一個拉取的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)識,對當(dāng)前公眾號唯一</param> ????????///?<param name="lang">返回國家地區(qū)語言版本,zh_CN?簡體,zh_TW?繁體,en?英語</param> ????????UserJson?GetUserDetail(string?accessToken,?string?openId,?Language?lang?=?Language.zh_CN);
然后在實現(xiàn)類里面,我們分別對上面兩個接口進行實現(xiàn),獲取用戶列表信息如下所示。
????????///?<summary> ????????///?獲取關(guān)注用戶列表????????///?</summary> ????????///?<param name="accessToken">調(diào)用接口憑證</param> ????????///?<param name="nextOpenId">第一個拉取的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里面去了,這個輔助類里面分別對數(shù)值進行了獲取內(nèi)容,驗證返回值,然后轉(zhuǎn)換正確實體類幾個部分的操作。
獲取內(nèi)容,通過輔助類HttpHelper進行,這個在我的公用類庫里面,里面的邏輯主要就是通過HttpRequest進行數(shù)據(jù)的獲取操作,不在贅述。
HttpHelper?helper?=?new?HttpHelper();string?content?=?helper.GetHtml(url);
由于返回的內(nèi)容,我們需要判斷它是否正確返回所需的結(jié)果,如果沒有,拋出自定義的相關(guān)異常,方便處理,具體如下所示。
????????///?<summary> ????????///?檢查返回的記錄,如果返回沒有錯誤,或者結(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);????????????????//非成功操作才記錄異常,因為有些操作是返回正常的結(jié)果({"errcode":?0,?"errmsg":?"ok"}) ????????????????if?(errorResult?!=?null?&&?errorResult.errcode?!=?ReturnCode.請求成功) ????????????????{????????????????????string?error?=?string.Format("微信請求發(fā)生錯誤!錯誤代碼:{0},說明:{1}",?(int)errorResult.errcode,?errorResult.errmsg); ????????????????????LogTextHelper.Error(errorResult);????????????????????throw?new?WeixinException(error);//拋出錯誤????????????????} ????????????}????????????return?true; ????????}
然后轉(zhuǎn)換為相應(yīng)的格式,就是通過Json.NET的類庫進行轉(zhuǎn)換。
????????????T?result?=?JsonConvert.DeserializeObject<T>(content);????????????return?result;
這樣我們就可以在ConvertJson函數(shù)實體里面,完整的進行處理和轉(zhuǎn)換了,轉(zhuǎn)換完整的函數(shù)代碼如下所示。
????///?????///?Json字符串操作輔助類????///? ????public?class?JsonHelper?where?T?:?class,?new() ????{????????///?<summary> ????????///?檢查返回的記錄,如果返回沒有錯誤,或者結(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);????????????????//非成功操作才記錄異常,因為有些操作是返回正常的結(jié)果({"errcode":?0,?"errmsg":?"ok"}) ????????????????if?(errorResult?!=?null?&&?errorResult.errcode?!=?ReturnCode.請求成功) ????????????????{????????????????????string?error?=?string.Format("微信請求發(fā)生錯誤!錯誤代碼:{0},說明:{1}",?(int)errorResult.errcode,?errorResult.errmsg); ????????????????????LogTextHelper.Error(errorResult);????????????????????throw?new?WeixinException(error);//拋出錯誤????????????????} ????????????}????????????return?true; ????????}????????///? ????????///?轉(zhuǎn)換Json字符串到具體的對象????????///? ????????///?返回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)用這個API的界面層代碼如下所示(測試代碼)
????????????IUserApi?userBLL?=?new?UserApi(); ????????????List<string>?userList?=?userBLL.GetUserList(token)
?
4、獲取用戶詳細信息
上面的獲取列表操作,相對比較簡單,而且不用POST任何數(shù)據(jù),因此通過Get協(xié)議就能獲取到所需的數(shù)據(jù)。
本小節(jié)繼續(xù)介紹獲取用戶詳細信息的操作,這個操作也是通過GET協(xié)議就可以完成的。
這個API的調(diào)用定義如下所示:
http請求方式:?GET https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
通過傳入一個OpenId,我們就能很好獲取到用戶的相關(guān)信息了。
前面小節(jié)我們已經(jīng)定義了它的接口,說明了傳入及返回值,根據(jù)定義,它的實現(xiàn)函數(shù)如下所示。
????????///?<summary> ????????///?獲取用戶基本信息????????///?</summary> ????????///?<param name="accessToken">調(diào)用接口憑證</param> ????????///?<param name="openId">普通用戶的標(biāo)識,對當(dāng)前公眾號唯一</param> ????????///?<param name="lang">返回國家地區(qū)語言版本,zh_CN?簡體,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é)合獲取用戶列表和獲取用戶詳細信息的兩個API,我們看看調(diào)用的代碼(測試代碼)。
????????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)注用戶列表及詳細信息管理?相關(guān)文章請關(guān)注PHP中文網(wǎng)!

? AI ??

Undress AI Tool
??? ???? ??

Undresser.AI Undress
???? ?? ??? ??? ?? AI ?? ?

AI Clothes Remover
???? ?? ???? ??? AI ?????.

Clothoff.io
AI ? ???

Video Face Swap
??? ??? AI ?? ?? ??? ???? ?? ???? ??? ?? ????!

?? ??

??? ??

???++7.3.1
???? ?? ?? ?? ???

SublimeText3 ??? ??
??? ??, ???? ?? ????.

???? 13.0.1 ???
??? PHP ?? ?? ??

???? CS6
??? ? ?? ??

SublimeText3 Mac ??
? ??? ?? ?? ?????(SublimeText3)