C#开发微信门户及应用(17)-微信企业号的通讯录管理开发之部门管理

前面一篇随笔企业号的一些基础信息,以及介绍如何配置企业号的回调方式实现和企业号服务器进行沟通的桥梁。本篇主要还是继续介绍企业号的开发工作的开展,介绍微信企业号通讯录管理开发功能,介绍其中组织机构里面如何获取和管理部门的信息等内容。

1、企业组织的创建和配置

首先我们可以在企业号的管理后台里面创建一个组织机构,里面创建一些部门和人员列表,方便我们开发和使用。
例如创建一个广州爱奇迪的根结构,然后在其中在创建一些组织机构,如下图所示。



然后给组织结构根节点“广州爱奇迪”增加一个管理员权限,以后再开发接口里面也就可以使用这个管理员所属的权限Secret值进行调用了。



CorpID是企业号的标识,每个企业号拥有一个唯一的CorpID;Secret是管理组凭证密钥。系统管理员可通过管理端的权限管理功能创建管理组,分配管理组对应用、通讯录、接口的访问权限。完成后,管理组即可获得唯一的secret。系统管理员可通过权限管理查看所有管理组的secret,其他管理员可通过设置中的开发者凭据查看。
我的企业号的创建者和“广州爱奇迪”组织结构的管理员是不同的,由于Secret是管理组凭证密钥,因此管理者负责不同的组织机构管理的话,自己的管理Secret值可能就不同了。如果我们需要调用接口,就需要用到这个属于自己权限级别的Secret值,如下图所示。

如果不是企业号的创建者,那么可能不能修改里面的一些权限分配,只能查看。


2、API访问的全局唯一票据AccessToken的获取

和公众号一样,我们调用企业号API的第一步也是需要先获取访问的票据AccessToken。这个票据是全局性的,有一定的时效和频率控制,因此需要适当的进行缓存,不能每次调用都去刷新获取。
企业号获取访问票据的主要的逻辑代码如下所示,其主要的就是需要使用管理者的Secret值去获取对应的口令,这样它就能够知道管理的是那个组织结构的了。

/// <summary>
/// 获取每次操作微信API的Token访问令牌
/// </summary>
/// <param name="corpid">企业Id</param>
/// <param name="corpsecret">管理组的凭证密钥</param>
/// <returns></returns>
public string GetAccessTokenNoCache(string corpid, string corpsecret)
{
    var url = string.Format("https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={0}&corpsecret={1}",
                            corpid, corpsecret);

    HttpHelper helper = new HttpHelper();
    string result = helper.GetHtml(url);
    string regex = "\"access_token\":\"(?<token>.*?)\"";

    string token = CRegex.GetText(result, regex, "token");
    return token;
}

微信企业号的说明如下所示:
当企业应用调用企业号接口时,企业号后台为根据此次访问的AccessToken,校验访问的合法性以及所对应的管理组的管理权限以返回相应的结果。
注:你应该审慎配置管理组的权限,够用即好,权限过大会增加误操作可能性及信息安全隐患。
AccessToken是企业号的全局唯一票据,调用接口时需携带AccessToken。AccessToken需要用CorpIDSecret来换取,不同的Secret会返回不同的AccessToken。正常情况下AccessToken有效期为7200秒,有效期内重复获取返回相同结果,并自动续期。由于获取access_token的api调用次数非常有限,建议企业全局存储与更新access_token,频繁刷新access_token会导致api调用受限,影响自身业务

2、通讯录管理之部门信息的维护

有了第一节里面的访问票据,我们就可以利用API来做很多事情了,包括组织结构的获取、创建、删除等等功能。
创建部门的官方接口定义如下所示。
请求说明

Https请求方式: POST
https://qyapi.weixin.qq.com/cgi-bin/department/create?access_token=ACCESS_TOKEN
请求包结构体为:
{ "name": "邮箱产品组", "parentid": "1"}

参数说明

Paste_Image.png

返回结果

{ "errcode": 0, "errmsg": "created", "id": 2}

根据上面的一些类似的接口定义说明,我们先来定义下组织机构部门数据的维护接口,然后在逐步实现和调用。

#region 部门管理
/// <summary>
/// 创建部门。
/// 管理员须拥有“操作通讯录”的接口权限,以及父部门的管理权限。
/// </summary>
CorpDeptCreateJson CreateDept(string accessToken, string name, string parentId);

/// <summary>
/// 更新部门。
/// 管理员须拥有“操作通讯录”的接口权限,以及该部门的管理权限。
/// </summary>
CommonResult DeleteDept(string accessToken, int id);

/// <summary>
/// 删除部门.
/// 管理员须拥有“操作通讯录”的接口权限,以及该部门的管理权限。
/// </summary>
CorpDeptListJson ListDept(string accessToken);

/// <summary>
/// 获取部门列表.
/// 管理员须拥有’获取部门列表’的接口权限,以及对部门的查看权限。
/// </summary>
CommonResult UpdateDept(string accessToken, int id, string name); 
#endregion

如创建部门的接口实现如下所示,主要就是构建URL和POST的数据包,然后统一调用并获取返回数据,转换为具体的Json对象实体即可。其他接口的实现方式类似,不在赘述。

/// <summary>
/// 创建部门。
/// 管理员须拥有“操作通讯录”的接口权限,以及父部门的管理权限。
/// </summary>
public CorpDeptCreateJson CreateDept(string accessToken, string name, string parentId)
{
    string urlFormat = "https://qyapi.weixin.qq.com/cgi-bin/department/create?access_token={0}";
    var data = new
    {
        name = name,
        parentId = parentId
    };
    var url = string.Format(urlFormat, accessToken);
    var postData = data.ToJson();

    CorpDeptCreateJson result = CorpJsonHelper<CorpDeptCreateJson>.ConvertJson(url, postData);
    return result;
}

CorpDeptCreateJson 对象实体类的定义如下所示,我们主要是根据返回结果进行定义的。

/// <summary>
/// 创建部门的返回结果
/// </summary>
public class CorpDeptCreateJson : BaseJsonResult
{
    /// <summary>
    /// 返回的错误消息
    /// </summary>
    public CorpReturnCode errcode { get; set; }

    /// <summary>
    /// 对返回码的文本描述内容
    /// </summary>
    public string errmsg { get; set; }

    /// <summary>
    /// 创建的部门id。
    /// </summary>
    public int id { get; set; }
}

3、部门管理的API调用

上面小节介绍了如何封装部门管理的API,那么我们封装好了对应的接口和接口实现,怎么样在实际环境里面进行调用处理的呢,为了方便我创建一个小的Winform程序来测试对应API的功能,如下所示。



下面我们来介绍一下调用的代码和效果展示。

private void btnCreateDeleteDept_Click(object sender, EventArgs e)
{
    ICorpAddressBookApi bll = new CorpAddressBookApi();
    string name = "测试部门";
    CorpDeptCreateJson json = bll.CreateDept(token, name, "2");
    if (json != null)
    {
        Console.WriteLine("创建了部门:{0}, ID:{1}", name, json.id);

        //更新部门信息
        name = "测试部门修改名称";
        CommonResult result = bll.UpdateDept(token, json.id, name);
        if(result != null)
        {
            Console.WriteLine("修改部门名称:{0} {1}", (result.Success ? "成功" : "失败"), result.ErrorMessage);
        }

        //删除部门
        result = bll.DeleteDept(token, json.id);
        if (result != null)
        {
            Console.WriteLine("删除部门名称:{0} {1}", (result.Success ? "成功" : "失败"), result.ErrorMessage);
        }
    }
    
}
/// <summary>
/// 获取部门列表
/// </summary>
private void btnListDept_Click(object sender, EventArgs e)
{
    ICorpAddressBookApi bll = new CorpAddressBookApi();
    CorpDeptListJson list = bll.ListDept(token);
    foreach (CorpDeptJson info in list.department)
    {
        string tips = string.Format("{0}:{1}", info.name, info.id);
        Console.WriteLine(tips);
    }
}

如果对这个《C#开发微信门户及应用》系列感兴趣,可以关注我的其他文章.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容