搜尋
首頁微信小程式微信開發C#開發微信入口網站及應用程式(4)--關注使用者清單及詳細資訊管理

在上個月的對C#開發微信門戶及應用做了介紹,寫過了幾篇的隨筆進行分享,由於時間關係,間隔了一段時間沒有繼續寫這個系列的博客了,並不是對這個方面停止了研究,而是繼續深入探索這方面的技術,為了更好的應用起來,專心做好底層的技術開發。

微信的很重要的一個特點就是能夠利用其平台龐大的用戶群體,因此很容易整合在CRM(客戶關係管理)系統裡面,服務號碼和訂閱好都能夠向關注者推送相關的產品消息,還能和48小時內回應訊息和事件的活躍用戶進行互動對話,因此用戶資訊是微信API裡面非常重要的一環,本隨筆主要介紹獲取關注用戶、查看用戶資訊、分組管理等方面的開發應用。

1、關注用戶列表及用戶分組信息

在微信的管理平台上,我們可以看到自己帳號的關注者用戶,以及用戶分組信息,如下所示。

C#开发微信门户及应用(4)--关注用户列表及详细信息管理  

上面的管理介面,能看到關注者用戶的基礎信息,但是使用微信API獲取到的是一個稱之為OpenID的列表,我們先了解這個東西是什麼?微信API的說明給出下面的解析:

追蹤者清單由一串OpenID(加密後的微訊號,每個用戶對每個公眾號的OpenID是唯一的。對於不同公眾號,同一用戶的openid不同)組成。公眾號可透過此介面來根據OpenID取得使用者基本資訊,包括暱稱、頭像、性別、所在城市、語言和關注時間。

上面的解析意思很清楚了,就是一個用戶關注我們的公眾號,那麼不管他是第幾次關注,對我們公眾號來說,都是一個確定的值;但是,一個用戶對其他公眾號,卻有著其他不同的OpenID。

微信提供了為數不多的幾個關鍵字信息,用來記錄用戶的相關內容,根據用戶的相關定義,我們定義一個實體類,用來放置獲取回來的用戶信息。

    /// <summary>
    /// 高级接口获取的用户信息。    /// 在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID    /// (加密后的微信号,每个用户对每个公众号的OpenID是唯一的。对于不同公众号,同一用户的openid不同)。    /// 公众号可通过本接口来根据OpenID获取用户基本信息,包括昵称、头像、性别、所在城市、语言和关注时间。    /// </summary>
    public class UserJson : BaseJsonResult
    {        /// <summary>
        /// 用户是否订阅该公众号标识,值为0时,代表此用户没有关注该公众号,拉取不到其余信息。        /// </summary>
        public int subscribe { get; set; }        /// <summary>
        /// 用户的标识,对当前公众号唯一        /// </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>
        /// 用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空        /// </summary>
        public string headimgurl { get; set; }        /// <summary>
        /// 用户关注时间,为时间戳。如果用户曾多次关注,则取最后关注时间        /// </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調用者的的Token 

在做微信API的開發,很多時候,我們需要傳入一個AccessToken,這個就是區分調用者和記錄會話資訊的字串,因此很多時候,我們需要傳入一個AccessToken,這個就是區分調用者和記錄會話資訊的字串,因此,在學習所有API開發之前,我們需要很好地理解這個存取控制參數。

C#开发微信门户及应用(4)--关注用户列表及详细信息管理

這個物件的定義,我們可以從微信的API說明中了解。

access_token是公眾號的全域唯一票據,公眾號呼叫各介面時都需使用access_token。正常情況下access_token有效期限為7200秒,重複取得將導致上次取得的access_token失效。 由於取得access_token的api呼叫次數非常有限,建議開發者全域儲存與更新access_token,頻繁刷新access_token會導致api呼叫受限,影響自身業務。

根據上面的說明定義,我們可以看到,它是一個和身份,以及會話時間有關的一個參數,而且它的產生次數有限制,因此要求我們需要對它進行緩存並重複利用,在在會話到期之前,我們應該盡可能重複使用這個參數,避免反覆請求,增加伺服器壓力,以及呼叫的時間。

我定義了一個方法,用來建構生成相關的Access Token,而且它具有緩存的功能,但具體如何緩存及使用,對我API的調用是透明的,我們只要用的時候,就對它調用就是了。

        /// 获取凭证接口        /// 
        /// <param>第三方用户唯一凭证
        /// <param>第三方用户唯一凭证密钥,既appsecret
        string GetAccessToken(string appid, string secret);

快取主要是基於.NET4增加的類別庫MemoryCache,這個是一個非常不錯的快取類別。

我的取得AccessToken的操作實作程式碼如下所示。

        /// <summary>
        /// 获取每次操作微信API的Token访问令牌        /// </summary>
        /// <param>应用ID
        /// <param>开发者凭据
        /// <returns></returns>
        public string GetAccessToken(string appid, string secret)
        {            //正常情况下access_token有效期为7200秒,这里使用缓存设置短于这个时间即可
            string access_token = MemoryCacheHelper.GetCacheItem<string>("access_token", delegate()
                {                    string grant_type = "client_credential";                    var url = string.Format("http://www.php.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;            
        }</token></string>

由於我們知道,AccessToken預設是7200秒過期,因此在這個時間段裡面,我們盡可能使用快取來記錄它的值,如果超過了這個時間,我們呼叫這個方法的時候,它會自動重新獲取一個新的值給我們了。

 

3、獲取關注用戶列表

獲取關注用戶列表,一次拉取API調用,最多拉取10000個關注者的OpenID,可以通過多次拉取的方式來滿足需求。微信的介面定義如下所示。

http請求方式: GET(請使用https協議)
http://www.php.cn/

这个接口返回的数据是

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

根据返回的Json数据定义,我们还需要定义两个实体类,用来存放返回的结果。

    /// <summary>
    /// 获取关注用户列表的Json结果    /// </summary>
    public class UserListJsonResult : BaseJsonResult
    {        /// <summary>
        /// 关注该公众账号的总用户数        /// </summary>
        public int total { get; set; }        /// <summary>
        /// 拉取的OPENID个数,最大值为10000        /// </summary>
        public int count { get; set; }        /// <summary>
        /// 列表数据,OPENID的列表        /// </summary>
        public OpenIdListData data { get; set; }        /// <summary>
        /// 拉取列表的后一个用户的OPENID        /// </summary>
        public string next_openid { get; set; }
    }    /// <summary>
    /// 列表数据,OPENID的列表    /// </summary>
    public class OpenIdListData
    {        /// <summary>
        /// OPENID的列表        /// </summary>
        public List<string> openid { get; set; }
    }</string>

为了获取相关的用户信息,我定义了一个接口,用来获取用户的信息,接口定义如下所示。

    /// <summary>
    /// 微信用户管理的API接口    /// </summary>
    public interface IUserApi
    {        /// <summary>
        /// 获取关注用户列表        /// </summary>
        /// <param>调用接口凭证
        /// <param>第一个拉取的OPENID,不填默认从头开始拉取
        /// <returns></returns>
        List<string> GetUserList(string accessToken, string nextOpenId = null);        /// <summary>
        /// 获取用户基本信息        /// </summary>
        /// <param>调用接口凭证
        /// <param>普通用户的标识,对当前公众号唯一
        /// <param>返回国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语
        UserJson GetUserDetail(string accessToken, string openId, Language lang = Language.zh_CN);</string>

然后在实现类里面,我们分别对上面两个接口进行实现,获取用户列表信息如下所示。

        /// <summary>
        /// 获取关注用户列表        /// </summary>
        /// <param>调用接口凭证
        /// <param>第一个拉取的OPENID,不填默认从头开始拉取
        /// <returns></returns>
        public List<string> GetUserList(string accessToken, string nextOpenId = null)
        {
            List<string> list = new List<string>();            string url = string.Format("http://www.php.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;
        }</userlistjsonresult></string></string></string>

我们看到,转换的逻辑已经放到了JsonHelper里面去了,这个辅助类里面分别对数值进行了获取内容,验证返回值,然后转换正确实体类几个部分的操作。

获取内容,通过辅助类HttpHelper进行,这个在我的公用类库里面,里面的逻辑主要就是通过HttpRequest进行数据的获取操作,不在赘述

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

由于返回的内容,我们需要判断它是否正确返回所需的结果,如果没有,抛出自定义的相关异常,方便处理,具体如下所示。

        /// <summary>
        /// 检查返回的记录,如果返回没有错误,或者结果提示成功,则不抛出异常        /// </summary>
        /// <param>返回的结果
        /// <returns></returns>
        private static bool VerifyErrorCode(string content)
        {            if (content.Contains("errcode"))
            {
                ErrorJsonResult errorResult = JsonConvert.DeserializeObject<errorjsonresult>(content);                //非成功操作才记录异常,因为有些操作是返回正常的结果({"errcode": 0, "errmsg": "ok"})
                if (errorResult != null && errorResult.errcode != ReturnCode.请求成功)
                {                    string error = string.Format("微信请求发生错误!错误代码:{0},说明:{1}", (int)errorResult.errcode, errorResult.errmsg);
                    LogTextHelper.Error(errorResult);                    throw new WeixinException(error);//抛出错误                }
            }            return true;
        }</errorjsonresult>

然后转换为相应的格式,就是通过Json.NET的类库进行转换。

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

这样我们就可以在ConvertJson函数实体里面,完整的进行处理和转换了,转换完整的函数代码如下所示。

    /// <summary>
    /// Json字符串操作辅助类    /// </summary>
    public class JsonHelper<t> where T : class, new()
    {        /// <summary>
        /// 检查返回的记录,如果返回没有错误,或者结果提示成功,则不抛出异常        /// </summary>
        /// <param>返回的结果
        /// <returns></returns>
        private static bool VerifyErrorCode(string content)
        {            if (content.Contains("errcode"))
            {
                ErrorJsonResult errorResult = JsonConvert.DeserializeObject<errorjsonresult>(content);                //非成功操作才记录异常,因为有些操作是返回正常的结果({"errcode": 0, "errmsg": "ok"})
                if (errorResult != null && errorResult.errcode != ReturnCode.请求成功)
                {                    string error = string.Format("微信请求发生错误!错误代码:{0},说明:{1}", (int)errorResult.errcode, errorResult.errmsg);
                    LogTextHelper.Error(errorResult);                    throw new WeixinException(error);//抛出错误                }
            }            return true;
        }        /// <summary>
        /// 转换Json字符串到具体的对象        /// </summary>
        /// <param>返回Json数据的链接地址
        /// <returns></returns>
        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;
        }
}</t></errorjsonresult></t>

调用这个API的界面层代码如下所示(测试代码)

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

 

4、获取用户详细信息

上面的获取列表操作,相对比较简单,而且不用POST任何数据,因此通过Get协议就能获取到所需的数据。

本小节继续介绍获取用户详细信息的操作,这个操作也是通过GET协议就可以完成的。

这个API的调用定义如下所示:

http请求方式: GET
https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN

通过传入一个OpenId,我们就能很好获取到用户的相关信息了。

前面小节我们已经定义了它的接口,说明了传入及返回值,根据定义,它的实现函数如下所示。

        /// <summary>
        /// 获取用户基本信息        /// </summary>
        /// <param>调用接口凭证
        /// <param>普通用户的标识,对当前公众号唯一
        /// <param>返回国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语
        public UserJson GetUserDetail(string accessToken, string openId, Language lang = Language.zh_CN)
        {            string url = string.Format("http://www.php.cn/{0}&openid={1}&lang={2}",
                   accessToken, openId, lang.ToString());

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

最后,我们结合获取用户列表和获取用户详细信息的两个API,我们看看调用的代码(测试代码)。

        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);
                }
            }
        }</string>

 

更多C#开发微信门户及应用(4)--关注用户列表及详细信息管理 相关文章请关注PHP中文网!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。