配置禅道

第三方应用集成禅道客户端进行消息通知 分享链接 /book/zentaopms/301.html?releaseID=17

作者:先知 最后编辑:刘振华 于 2024-11-08 16:12:18 浏览量:49847
摘要:本文将详细介绍第三方应用如何集成禅道客户端进行消息通知。

禅道开源版11.0版本集成了禅道客户端功能。

禅道里的消息通知可以发送到禅道客户端,同时增加了消息通知接口。

与禅道集成的第三方应用,也可以通过该消息通知接口,将第三方应用的消息发送到禅道客户端里。

本文将详细介绍第三方应用如何集成禅道客户端进行消息通知。

一、设置应用集成 

第三方应用要与禅道做集成,具体请参考:http://www.zentao.net/book/zentaopmshelp/integration-287.html

二、签名机制

第三方应用在请求喧喧数据时所调用的 API 的请求地址格式为:

/api.php?m=$moduleName&f=$methodName$params&code=$code&token=$token

以上请求地址格式中的变量定义如下:

  • $moduleName :要调用的 API 所属模块名称(通常为 “im”),必须提供;

  • $methodName :要调用的 API 所属模块内的方法名称,如果缺省则为 index ;

  • $params :要调用的 API 方法参数,如果没有参数可以留空,如果所调用的 API 方法有参数则将参数名和参数值通过通用网址查询字符串的形式插入到 $params 所在位置,例如 gid=XXX ;

  • $code :应用代号,必须提供;

  • $token :调用 API 时的数字签名。

例如获取讨论组 gid 为 64da14c3-c07a-45af-9c61-4e638de4af26 中的用户数据请求地址为:


/api.php?m=im&f=getChatUsers&code=myAppCode&token=f5633c34c0c551a16c1d63bceb38d6a8


签名算法

API 请求地址中的数字签名 $token 应该在每次调用时根据应用集成密匙生成,具体算法为:

$token = md5(md5($query) + $key)

以上公式包含的变量定义如下:

  • $query :请求地址中查询字符串(? 之后的部分)不包含 &token=$token 的部分;

  • $key :应用密匙(必须为小写形式)。

例如:

// 查询参数
var $query = 'm=chat&f=getChatUsers&code=myAppCode';
// 应用密匙
var $key   = '3cd0914d656e90ab181f1d52ff352cfe';
// 计算签名字符串
var $token = md5(md5('m=im&f=getChatUsers&code=myAppCode') + '3cd0914d656e90ab181f1d52ff352cfe');
// 这样 $token 的计算值为 'f5633c34c0c551a16c1d63bceb38d6a8'

下面将详细说明第三方应用在完成和禅道的集成后如何通过禅道客户端进行消息通知。

三、通过禅道客户端进行消息通知

下面列出目前第三方应用可以使用的 API。

1. im/getGroupChats

此接口用于获取系统中的讨论组会话列表。

  • 请求方式:GET;
  • 模块名称:im;
  • 方法名称:getGroupChats;
  • 参数:无;
  • 返回值:JSON 对象,该对象属性定义如下:
属性名称 类型 说明
result 字符串 如果为'success'则操作成功,如果为其他值则表示操作失败
message 字符串 如果操作失败,则使用此属性返回失败原因提示文本
data 对象 该对象定义了系统中的讨论组清单,对象属性名为讨论组的全局唯一 标识字符串(GID),属性对应的值为讨论组名称

下面为一个示例请求地址:

https://myxxb.com/api.php?m=im&f=getGroupChats&code=myAppCode&token=f5633c34c0c551a16c1d63bceb38d6a8

正常情况下返回值如下:

{
    "result": "success",
    "data": {
        "30683aea-7a1f-4ec8-a6d6-834e0310fd7d": "第四期项目讨论",
        "81c6ba89-00ab-4431-8e47-063556ae4886": "研发部",
        "64da14c3-c07a-45af-9c61-4e638de4af26": "公司总群"
    }
} 

2. im/getChatUsers

此接口用于获取指定讨论组中的成员信息或者获取系统中全部成员信息。

  • 请求方式:GET;

  • 模块名称:im;

  • 方法名称:getChatUsers;

  • 参数:

    • gid:设置为要获取用户成员信息的讨论组的全局唯一 标识字符串(GID),如果留空,则请求会返回系统所有成员信息。
  • 返回值:JSON 对象,该对象属性定义如下:

属性名称 类型 说明
result 字符串 如果为'success'则操作成功,如果为其他值则表示操作失败
message 字符串 如果操作失败,则使用此属性返回失败原因提示文本
data 对象 该对象定义了成员清单,对象属性名为成员 ID,属性对应的值为成员显示名称

下面为获取 GID 为'30683aea-7a1f-4ec8-a6d6-834e0310fd7d'的讨论组成员信息的示例请求地址:

https://myxxb.com/api.php?m=im&f=getChatUsers&gid=30683aea-7a1f-4ec8-a6d6-834e0310fd7d&code=myAppCode&token=f5633c34c0c551a16c1d63bceb38d6a8

正常情况下返回值如下:

{
    "result": "success",
    "data": {
        "1": "管理员",
        "3": "张三",
        "4": "李四"
    }
} 

3. im/sendNotification

此接口用于向通知中心(小喧喧)推送通知消息。

  • 请求方式:POST;
  • 模块名称:im;
  • 方法名称:sendNotification;
  • 参数:无;
  • 返回值:JSON 对象,该对象属性定义如下:
属性名称 类型 说明
result 字符串 如果为'success'则操作成功,如果为其他值则表示操作失败
message 字符串 如果操作失败,则使用此属性返回失败原因提示文本

将要推送的通知消息对象转换为 JSON 字符串形式,然后通过 POST 请求发送到服务器。

一个通知消息对象拥有如下属性:

属性名称 类型 可选性 说明
users 数组 特定条件必须 使用一个用户 ID 数组指定通知发送给哪些用户,例如[1, 4],也可以指定一个用户账号组成的数组,例如['admin', 'zhangsan', 'lisi']
title 字符串 必须 通知消息的标题
subtitle 字符串 可选 通知消息的副标题
content 字符串 可选 通知消息的内容文本
contentType 字符串 必须 可选值包括:'plain'表示纯文本,'text'表示 Markdown 格式的文本
url 字符串 可选 该通知消息所指向的网页链接
actions 对象数组 可选 使用 操作对象数组表示该通知支持的操作
sender 对象 可选 通知的 发送方信息对象

通知的 操作对象包含如下属性:

属性名称 类型 可选性 说明
label 字符串 必须 操作按钮上显示的文本
icon 字符串 可选 操作按钮上显示的图标
url 字符串 必须 点击此操作按钮时要打开的页面链接
type 字符串 可选 操作按钮类型,影响操作按钮外观,可选值包括'primary'、'success'、'danger'、'warning'、'info'、'important'、'special'

发送方信息对象包容如下属性:

属性名称 类型 可选性 说明
id 字符串或数字 必须 标识发送方唯一身份的字符串或数字
name 字符串 可选 发送方在界面上显示的名称
avatar 字符串 必须 发送方头像图片链接地址

下面为一个发送通知消息的示例 POST 请求地址:

https://myxxb.com/api.php?m=im&f=sendNotification&code=myAppCode&token=f5633c34c0c551a16c1d63bceb38d6a8

下面为使用 JavaScript Fetch API 发起请求示例代码:

const notifycationData = {
    users: [1, 3],
    title: '测试通知消息',
    subtitle: '测试通知消息副标题',
    content: '**测试消息**内容',
    contentType: 'text',
    url: 'http://xuan.im',
    actions: [
        {
            type: 'danger',
            label: '更新日志',
            url: 'https://xuan.im/page/changelogs.html'
        }, {
            type: 'normal',
            label: '下载地址',
            url: 'http://xuan.im/page/download.html'
        }
    ],
    sender: {
        avatar: 'https://avatars2.githubusercontent.com/u/472425?s=460&v=4',
        name: 'Catouse',
        id: 'catouse'
    }
};
const postUrl = 'https://myxxb.com/api.php?m=im&f=sendNotification&code=myAppCode&token=f5633c34c0c551a16c1d63bceb38d6a8';
fetch(postUrl, {
    method: 'POST',
    headers: {'Content-Type': 'application/json'},
    body: JSON.stringify(data)
}).then(r => {
    return r.json();
}).then(response => {
    if (response && response.result === 'success') {
        console.log('操作成功');
    }
}); 

正常情况下返回值如下:

{ "result": "success" }

4. im/sendChatMessage

此接口用于向指定的讨论组推送通知消息。

  • 请求方式:POST;
  • 模块名称:im;
  • 方法名称:sendChatMessage;
  • 参数:无;
  • 返回值:JSON 对象,该对象属性定义如下:
属性名称 类型 说明
result 字符串 如果为'success'则操作成功,如果为其他值则表示操作失败
message 字符串 如果操作失败,则使用此属性返回失败原因提示文本

将要推送的通知消息对象转换为 JSON 字符串形式,然后通过 POST 请求发送到服务器。

一个通知消息对象拥有如下属性:

属性名称 类型 可选性 说明
gid 字符串 特定条件必须 为讨论组的全局唯一字符串,指定通知发送到的讨论组,当向讨论组发送通知时必须(即receiver为'group')
title 字符串 必须 通知消息的标题
subtitle 字符串 可选 通知消息的副标题
content 字符串 可选 通知消息的内容文本
contentType 字符串 必须 可选值包括:'plain'表示纯文本,'text'表示 Markdown 格式的文本
url 字符串 可选 该通知消息所指向的网页链接
actions 对象数组 可选 使用 操作对象数组表示该通知支持的操作
sender 对象 可选 通知的 发送方信息对象

通知的 操作对象包含如下属性:

属性名称 类型 可选性 说明
label 字符串 必须 操作按钮上显示的文本
icon 字符串 可选 操作按钮上显示的图标
url 字符串 必须 点击此操作按钮时要打开的页面链接
type 字符串 可选 操作按钮类型,影响操作按钮外观,可选值包括'primary'、'success'、'danger'、'warning'、'info'、'important'、'special'

发送方信息对象包容如下属性:

属性名称 类型 可选性 说明
id 字符串或数字 必须 标识发送方唯一身份的字符串或数字
name 字符串 可选 发送方在界面上显示的名称
avatar 字符串 必须 发送方头像图片链接地址

下面为一个发送通知消息的示例 POST 请求地址:

https://myxxb.com/api.php?m=im&f=sendChatMessage&code=myAppCode&token=f5633c34c0c551a16c1d63bceb38d6a8

下面为使用 JavaScript Fetch API 发起请求示例代码:

const notifycationData = {
    gid: 'f3de9ff9-dcb4-49de-915b-377ee9143418',
    title: '测试通知消息',
    subtitle: '测试通知消息副标题',
    content: '**测试消息**内容',
    contentType: 'text',
    url: 'http://xuan.im',
    actions: [
        {
            type: 'danger',
            label: '更新日志',
            url: 'https://xuan.im/page/changelogs.html'
        }, {
            type: 'normal',
            label: '下载地址',
            url: 'http://xuan.im/page/download.html'
        }
    ],
    sender: {
        avatar: 'https://avatars2.githubusercontent.com/u/472425?s=460&v=4',
        name: 'Catouse',
        id: 'catouse'
    }
};
const postUrl = 'https://myxxb.com/api.php?m=im&f=sendChatMessage&code=myAppCode&token=f5633c34c0c551a16c1d63bceb38d6a8';
fetch(postUrl, {
    method: 'POST',
    headers: {'Content-Type': 'application/json'},
    body: JSON.stringify(data)
}).then(r => {
    return r.json();
}).then(response => {
    if (response && response.result === 'success') {
        console.log('操作成功');
    }
}); 

正常情况下返回值如下:

{ "result": "success" }
评论列表
🦆
风流的海豚 2024-12-25 17:42:22 回复
问题:Webhook 不推送”创建“类型消息
禅道版本: 开源版18.5
具体描述:
添加了一条Webhook配置 ;
勾选了全部Webhook;
”新建“研发需求,Wekhook没有推送消息,”编辑/备注...“研发需求,Webhook有消息推送。
回复
您好,添加的webhook是群通知还是个人应用通知。个人应用通知的话是给指派人通知,并且如果指派人和操作人是同一用户的话也不会通知。
石榴 2022-08-23 18:29:33 回复
请问webhook类型为"其他“,发送的请求内容及格式,这些是怎么定义的。
回复
可以参考下这篇手册:https://www.zentao.net/book/zentaopmshelp/webhook-288.html, 参数是代码中写的。
回复
老师好!问下禅道的客户端消息是否支持类似企业微信那种显示未读已读的状态?
回复
这儿目前不支持,我们也反馈下。
Daniel 2022-05-12 19:22:22 回复
http://192.168.1.2333/zentaopms/www/x.php?m=im&f=getChatUsers&code=lybJenkins&token=255d470d9613a2ee77227338bc0d028d
为什么我请求成功后返回的内容和文档不一致o(╯□╰)o:
{
"status": "success",
"data": "{\"locate\":\"http:\\/\\/192.168.1.99\\/zentaopms\\/www\\/x.php?m=user&f=deny&t=json&module=im&method=getchatusers\"}",
"md5": "5be76c4e54be0f7053bfd4b7571c1eff"
}
回复
您可以联系下官网商务丁芝(QQ:1481227768)邀请加入二次开发群沟通下。
wancheng 2021-01-25 11:23:13 回复
请问我访问时报这个错是什么原因:
<html><head><meta http-equiv='Content-Type' content='text/html; charset=utf-8' /></head><body><br />
11:04:23 Uncaught LengthException: The ciphertext length (72) needs to be a multiple of the block size (16) in C:\xampp\zentao\lib\phpaes\phpseclib\Crypt\Common\SymmetricKey.php:1123<br />
Stack trace:<br />
#0 C:\xampp\zentao\lib\phpaes\phpaes.class.php(33): SymmetricKey->decrypt('users=admin&tit...')<br />
#1 C:\xampp\zentao\framework\xuanxuan.class.php(355): phpAES->decrypt('users=admin&tit...')<br />
#2 C:\xampp\zentao\framework\xuanxuan.class.php(102): xuanxuan->decrypt('users=admin&tit...')<br />
#3 C:\xampp\zentao\framework\xuanxuan.class.php(44): xuanxuan->setInput()<br />
#4 C:\xampp\zentao\framework\base\router.class.php(401): xuanxuan->__construct('', 'C:\\xampp\\zentao')<br />
#5 C:\xampp\zentao\www\x.php(22): baseRouter::createApp('', 'C:\\xampp\\zentao', 'xuanxuan')<br />
#6 {main}<br />
thrown in <strong>C:\xampp\zentao\lib\phpaes\phpseclib\Crypt\Common\SymmetricKey.php</strong> on line <strong>1123</strong> when visiting <strong></strong><br />
</body></html>
回复
您好,有进行过什么特殊操作吗?可以添加一下我们页面上方的商务QQ,邀请您进我们的技术交流群发下截图我们确认下问题。
🐱
九月信 2020-10-21 10:38:29 回复
禅道:12.4.2开源版,XXD:3.2.1

禅道和xxd在同一服务器中,启动xxd服务后,在服务器机器上可以登录客户端,但在其它机器上登录时,用户名密码输入错误时会提示密码不对,用户名密码输入正确时登录失败,网络诊断#5错误: SOCKET_CLOSE_ABNORMAL
请问是什么原因?怎么解决?谢谢!
回复
在服务器上可以正常登陆,表示客户端功能应该是启动成功可以正常使用的。其他机器无法登陆可以使用telnet命令检查一下到服务器的网络和端口是否通。端口包含禅道使用的apache端口(默认80)和客户端使用的2个端口(默认11444和11443),端口不通的话可以在服务器添加开发端口试一下。还是无法正常登陆可以添加网页上方QQ,邀请进群,方便截图进一步排查问题。
回复
可以添加下页面上方QQ,邀请进群后,截图看下其他机器登录客户端时填写的地址,以及xxd的启动页面。
程先生 2020-05-18 17:36:47 回复
请求的数据为:{users:[75],content:'124679',contentType:'text',gid:'',receiver:'users',subtitle:'待办任务',title:'服务治理平台消息通知',url:'www.baidu.com',userList:[75]} ,响应的数据为:{"result":false,"message":"没有设置接收者类型,只能是用户或者是某个讨论组。"},请问是什么问题,是按照API文档进行的上送
回复
这个文档中的接口新版客户端已经更新了,可以先参考:https://www.xuanim.com/book/dev/141.html
魏中显
高级客户经理
18561939726
1746749398
统一服务热线 4006-8899-23
我要提问提问有任何问题,您都可以在这里提问。 问题反馈反馈点击这里,让我们聆听您的建议与反馈。