1.流程图:
2.启用
系统设置-服务器设置-是否开启数据推送 打开即可
2.2初版功能介绍
消息订阅功能介绍, 消息订阅支持 webservice服务 和 http 协议
基础匹配逻辑
- 岗位, 人员, 部门匹配 订阅规则 过滤
- 订阅规则是否启用, 消息类型, 消息事件 过滤
- 字段映射匹配规则 过滤, 直接抛异常, 会保存一条 SubscribeSendRecord记录
目前功能还在不断 完善中, 各位老板在使用过程中遇到问题和 有一些新的场景未满足, 可以在文档下添加评论
3.配置步骤
1.消息订阅 (现更名为 数据推送管理)在 集成管理→ 数据推送管理
2. 跳转到如下页面
3. 配置页面如下,需要着重配置:
(1)字段映射配置 → 决定发送的消息是否与第三方(如钉钉)需要的消息内容匹配。具体需要什么样的消息内容,请参照第三方消息文档要求的消息体,结合本文档进行配置。
(2)匹配规则/适用范围 → 决定哪些用户的消息能够被“数据推送”功能推送出去。
4.自定义需要发送的字段
如下:
字段 | 说明 | 字段 | 说明 |
---|---|---|---|
标题 | 可以用来标记同步的OA | 所属部门 | 分类管理, 支持适用左组织树筛选 |
消息类别 | 通知,待办,全部(message 的分类), 其他(非消息类) | 是否启动 | . |
请求方式 | http请求方式(webService可以忽略,默认值就好) | 消息事件 | 新增, 编辑, 删除, 全部, 适配不同消息的动作而发送消息到不同的url |
配置字段发送格式 | 配置字段发送格式 | 请求头 | {"Content-Type": "application/json"} |
url地址 | 对接链接 | 部门适用范围 | 消息接收人部门过滤 |
岗位适用范围 | 消息接收手岗位过滤 | 人员适用范围 | 消息接收人过滤 |
关联对象 | 相当于入口条件,消息类别是其他的时候使用 | 请求数据json | 请求的json属性数据 |
请求数据data | 请求的data属性数据 | 请求数据params | 请求的params参数(自动追加到url上) |
请求数据默认值 | 会自动追加数据到data中 | 认证配置 | 发送请求认证配置(相当于获取是否可以调用和调用的令牌,更安全) |
请求结果处理 | 请求发送完毕后,可以回调API,设置缓存,判断是否调用成功 | 重试机制 | 失败后重新发送,支持配置失败后提醒,重试几次(最大10次,默认两次),每次失败执行间隔 |
请求url_params | 会在请求时,自动替换链接上的参数,和params参数同一属性 |
配置字段发送格式说明,
最外层 关键字 (新版参数如json_v2在下文“实际配置案例”中给出。)
字段key | 示例 | 作用 |
---|---|---|
json(旧版参数,请减少使用,新版为json_v2) | {"json": "common": { "type": 1, "appName": "014", "modelId": "014001", "modelName": "组织人事" } } | 作为requests, json字段参数 |
data(旧版参数,请减少使用,新版为data_v2) | {"data": "common": { "type": 1, "appName": "014", "modelId": "014001", "modelName": "组织人事" } } | 作为requests, data字段参数 |
params(旧版参数,请减少使用,新版为params_v2) | {"params": "common": { "type": 1, "appName": "014", "modelId": "014001", "modelName": "组织人事" } } | 作为requests, params字段参数 |
url_params(旧版参数,请减少使用,新版为url_params_v2) | {"url_params": "common": { "type": 1, "appName": "014", "modelId": "014001", "modelName": "组织人事" } } | 作为url参数 |
auth_info | { "url": "https://qyapi.weixin.qq.com/cgi-bin/gettoken", "method": "GET", "params": { "corpid": "ww5de3ed5917bds62a", "corpsecret": "rBZrTHJsdTlhoPsDAOohj2k4JgXVKshJjdAZnM(已脱敏)" }, "headers": {}, "auth_key": "access_token", "location": "params", "expire_time": 1500, "get_token_field": ["access_token"] } | 请求认证信息 url:请求接口 method:请求类别 POST,GET等 params:接口参数 headers:请求头 auth_key:用于字段映射的key location:返回值是添加到请求的params参数上还是请求头上(params,header,两个值) expire_time:设置缓存 get_token_field:从请求返回数据的 ["access_token"] 中获取数据,赋值给auth_key,用于正式请求的准备数据 |
proxy_number | hcm_proxy_xxxxx | 请求 代理配置,一般可以不配置,钉钉建议配置 |
success_response_define | 1.返回结果校验:{"success_response_define": "=response_check([\"result\", \"success\"], \"true\")"} 2."response_cache_config": { | 1.请求之后,对返回结果判断是否成功,例子中,response_check是公式,[\"result\", \"success\"]是返回结果中的resilt下面的success 是true认为是成功,其他的都是失败; 2.请求成功之后,后续还需要调接口做其他事。callback_api:后续操作所需要调用的接口;callback_param:接口参数; success_response_key:接口返回结果 success_response_value:结果中的字段判断是成功的标识 |
third_type | "third_type": "ding" | 指明第三方类型,只有标准第三方集成才配置(钉钉,企业微信,云加,飞书) |
unique_third_key | "unique_third_key": ["user_info", "unionid"] | 获取第三方app发送消息需要的字段,一般是获取系统绑定信息的 |
rtype | "rtype": "content" | 默认请求的返回值是json(), 可以指定 text, content 等,用于解析请求返回的返回值,在请求体的哪个属性。 |
resend_params | "resend_params": { | 如果第一次发送失败再次发送需要换做校验,search_url:校验请求的地址;old_url_params:是否原来的url参数,false的话需要重新在此处配置url_params;success_response_define:请求完成之后判断是否成功; old_json:如果是true,默认还是使用原来的json,否则就需要在这里重新配置json参数 (暂时只支持了json的处理,后续加上data的) |
resend_rule | "resend_rule": [{ | 第一次发送失败之后,默认会重新在推送一次,如果配置有这个重新推送规则,重推失败之后,会给这个手机号发送通知,手机号是固定值,配置了多少次就会重新推送多少次 |
sub_map_id | "sub_map_id": 19 | 新增的推送配置ID,在编辑时候使用 |
request_type | hcminnerapi | 调用外部接口时无需配置,调用内部接口需要配置 |
send_check (测试中,预计发版时间12.16) | { "content": "=is_value_contains(content, \"导出|导入|计算|下载\", False)", ... ... "check_type": "and"// 上面列的多个条件是且判断(and)还是或判断(填写"or"), 默认且判断
| 根据里面的条件判断是否要发送。key随便写,关键是后面的判断公式。 左例中两个判断条件,一个是IF(is_task_done==2,True,False),表示消息的is_task_done属性(待办状态)为2(已办)时返回True;另一个是is_value_contains(\"导出|导入|计算|下载\", content, False),表示消息内容中包含“导出|导入|计算|下载”时,报错,即返回False。 check_type为and时,上述条件同时为True,才会发送,否则不进行数据推送。check_type为or时,上述条件只要有一个返回True,就可以推送消息。 |
5.实际配置案例(系统的数据都可以推送到第三方,不限于消息):
1.以推送一条待办消息到第三方为例,前置配置如图:
表示只有系统新增一条待办消息时才会使用这条推送规则,通知新增,编辑,待办编辑都不会使用这条规则。
2.配置转换规则:
json, data, params, url_params 内部配置详情,具体配置需要根据第三方文档来确定,下边以json参数来(兼容历史版本,使用公式编辑器的为json_v2属性,其他属性自动会加上‘_v2’,在对应参数配置即可)
公式配置案例(具体配置json,data,param,url_params,看具体情况,以下以json为案例,数据推送必须走单点认证模式才能从第三方点击消息回到人力系统。):
案例代码:json_v2:
生成的数据(前往日志查看):
具体数据案例:
{ "pcurl": "http://123.61.11.8:9010/api/auth/login_by_sso?sso=customer_sso&next=http%3A%2F%2F123.61.11.8%3A9010%2Fmessagerouter%3Fmessage_id%3D4103763&response_type=code&state=app_single_login&flag=veri&name=zhx&entry=553c80a1-13cf-5cc8-9b81-ce2be618fd64", "appurl": "http://123.61.11.8:9010/api/auth/login_by_sso?sso=customer_sso&next=http%3A%2F%2F123.61.11.8%3A9010%2Fmessagerouter%3Fmessage_id%3D4103763&response_type=code&state=app_single_login&flag=veri&name=zhx&entry=553c80a1-13cf-5cc8-9b81-ce2be618fd64", "flowid": "7078077", "creator": "zhx", "syscode": "HCM", "Filetype": "message_type", "isremark": "0", "nodename": "测试节点", "receiver": "zhx", "viewtype": "0", "important": 10, "receivets": "1688378522011", "requestname": "来自 zhx 的 外勤打卡测试 申请, 请审批", "workflowname": "外勤打卡(导入)", "createdatetime": "2023-07-03 18:02:02", "receivedatetime": "2023-07-03 18:02:02" }
特殊数据描述:字段pcurl,appurl 都是构造单点登录链接,其他应用叫法可能不一样,但是一般都会有一个用于跳转的字段,为了保证系统安全,这个字段对应的链接必须携带加密后的密钥。
链接详解:
http://123.61.11.8:9010/api/auth/login_by_sso?sso=customer_sso&next=http%3A%2F%2F123.61.11.8%3A9010%2Fmessagerouter%3Fmessage_id%3D4103763&response_type=code&state=app_single_login&flag=veri&name=zhx&entry=553c80a1-13cf-5cc8-9b81-ce2be618fd64
单点路径:域名+/api/auth/login_by_sso 也可以使用 域名+/login
sso类型:sso=customer_sso, customer_sso是一类sso,也可以是work_inner,mobile_sso,ding
next:单点登录成功后跳转的地址,比如原来是:http://123.61.11.8:9010/messagerouter?message_id=4103763,需要进行一次编码(前往编码工具)编码后:http%3A%2F%2F123.61.11.8%3A9010%2Fmessagerouter%3Fmessage_id%3D4103763,
这条链接的含义是 ,‘http://123.61.11.8:9010/messagerouter?message_id=’ 表示消息跳转地址,4103763表示消息ID,这个地址在已登录的浏览器打开,就会跳转到对应的消息
response_type=code&state=app_single_login&flag=veri:这些是一些额外的参数,依据情况可能有用处,在这里不是主要字段
name=zhx :系统的人员编号,用作单点标识(如果没有签名字段,意味着只要修改这个编号,就可以登录别人账号)
entry=553c80a1-13cf-5cc8-9b81-ce2be618fd64:安全密钥,使用加密方法,根据消息生成时间动态生成的,安全等级高。生成规则可以根据具体情况来判断
密钥生成过程,可以使用公式来构造,这里是用了aes 加密,用到的参数包括:
固定的密钥:hcmshenhuoabcbac,长度必须是16的倍数,自定义一个,请勿直接拷贝案例
加密数据:CONCAT(get_value_from_dict(['receiver', 'number']),S(send_date),'oa') 构造的加密数据包括:人员编码,消息生成时间和随意的字符串
偏移量:hcmshenhuocbacba 长度必须是16的倍数,自定义一个,请勿直接拷贝案例
因为加密后的数据中有-,+这种敏感字符(案例:'PHNjcmlwdD5hbGVydCgxKTs8L3Njcml+wdD4='),这里使用uuid_sec再加密一次,确保得到一个标准的字符串(案例:553c80a1-13cf-5cc8-9b81-ce2be618fd64),其他加密方法可以根据实际情况处理
加密认证会在单点登录云函数中处理,下边有对应的单点云函数处理过程。
加密字段配置如图:
信息安全很重要,要牢记,凡事涉及到数据推送和单点的,链接上最好能携带一个加密字段,不允许使用简单 编号,手机号直接查人员后完成登录,如果拥有完整的
oauth2过程,则不需要使用加密字段
单点云函数案例:个性化登录(查看 2.非标准单点模式)
3.认证信息配置详情(看情况配置)
auth_info | url | 请求token的url |
method | 请求方法 | |
headers | 请求头 | |
params | 请求参数 如企业微信为{"corpid": "****", "corpsecret": "****"} | |
data | 一般不用填 | |
json | 一般不用填 | |
get_token_field | 解析请求响应体得到token, 类型为列表 , 如 ["token"] | |
expire_time | token缓存时间, 例如token有效期为30分钟 此处可以写 1500 | |
auth_key | token在认证时的key 如 "token" | |
proxy_number | 指定请求代理 | |
location | data, json, params, headers, 需要将信息添加到这些字段里面去 | |
rtype | 默认请求的返回值是json(), 可以指定 text, content 等 |
案例:
4.请求结果处理
案例:
请求返回数据:
配置案例:
表示:根据success_response_key,success_response_value判断是否请求成功,成功的话调用API:private.test_api_i,API可以拿到的参数为:{"action":"new","message_id":"3214521"}
5.失败重试机制
handler: 消息类别,mobile_handler表示发短信提醒,mail_handler表示邮件提醒,可以为空,不配置
to:mobile_handler表示配置手机号,mail_handler表示配置邮箱,可以为空,不配置
time:表示失败后多久再推送一次,默认20秒,最小5秒最大3600秒
message:消息内容,可以替换数据ID
配置案例:
案例功能描述:以下配置表示如果数据推送失败了,20秒后执行再次推送,如果还是失败,20秒后再次重新推送,然后发短信给两个手机号,如果再次失败,40秒后再次推送,发邮件给邮箱。
6.内部接口调用配置
如图,包括接口参数定义:
6.消息体格式说明
原始发送消息体参考
普通通知
{ "id": 289289, 消息ID "date": 1630048695583,消息生成时间戳 "type": "message", "level": 0,消息级别 "title": { 消息标题信息 "id": 2, "name": "待办", "number": "task-001", "company_id": 169, "description": "待办消息" }, "to_id": 1507563, 消息接收人ID "action": "new", 推送类别 "go_url": "/messagerouter?message_id=2314532",跳转链接 "params": { 跳转参数 "type": "wf", "business_id": "15785", "wf_assignment_id": "7054794" }, "sender": { 发送人名称,编号,手机号等 "id": 1507563, "name": "张三", "mobile": "18682315095", "number": "SHHR001", "identity_card": "370403198005132215" }, "unread": true, 是否已读 "content": "来自 张三 的 测试(导入) 申请, 请审批", 消息内容 "from_id": 1507563,发送人ID "is_read": false, "go_param": "{\"wf_assignment_id\": \"7054794\", \"business_id\": \"15785\", \"type\": \"wf\"}", "go_state": "workflow_bill_v3",跳转state "receiver": { 接收人名称,编号,手机号等 "id": 1507563, "name": "张三", "mobile": "18682315095", "number": "SHHR001", "identity_card": "370403198005132215" }, "title_id": 2,消息标题 "send_date": 1630048695583, "article_id": null, "company_id": 169,公司ID "is_task_done": 1,消息类别,0:通知,1:待办,2已办 "message_type": "message",消息类别 "from_object_id": null, "from_object_class": null }
在公式编辑器页面,已经添加了对应的中文描述:
其他消息数据发送结构体可以在初始配置时, 如何明确流程消息结构体
- 不配置字段发送格式,
- 触发这条消息订阅规则
- 在SubscribeSendRecord, 找到触发的消息推送记录, 查看发送数据, 如下
由于人员相关字段太多, sender 和 receiver只会展示部分字段, 实际人员字段参照 hcm.model.get 接口返回的数据格式
7.查看推送记录
/common_model_list?model=SubscribeSendRecord
支持手动同步, 打开浏览器控制台, F12, 选中一条同步记录, 点击手动同步, 查看接口如下图
返回值为同步记录id: 失败信息的字典映射