1.流程图:


2.启用

系统设置-服务器设置-是否开启数据推送 打开即可

2.2初版功能介绍

消息订阅功能介绍, 消息订阅支持 webservice服务 和 http 协议

基础匹配逻辑

  1. 岗位, 人员, 部门匹配 订阅规则 过滤
  2. 订阅规则是否启用, 消息类型, 消息事件 过滤
  3. 字段映射匹配规则 过滤, 直接抛异常, 会保存一条 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": {
        "callback_api": "private.test_api_i",
        "callback_param": [{
            "map": "action",
            "field": ["response", "result", "result", "action"],
            "default": "new"
        }, {
            "map": "message_id",
            "field": ["response", "result", "result", "id"],
            "default": "111"
        }, {
            "map": "message_id",
            "field": ["data", "id"],
            "default": "111"
        }],
        "success_response_key": ["result", "success"],
        "success_response_value": "True"
    }

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发送消息需要的字段,一般是获取系统绑定信息的
第三方用户id,用于发消息
rtype

"rtype": "content"

默认请求的返回值是json(), 可以指定 text, content 等,用于解析请求返回的返回值,在请求体的哪个属性。
resend_params

"resend_params": {
        "json": {...},
        "old_json": true,
        "search_url": "https://xxxx.hcmcloud.com/api/private.hcm_release_message_check",
        "old_url_params": true,
        "success_response_define": "=response_check([\"result\", \"existence\"], \"True\")"
    }

如果第一次发送失败再次发送需要换做校验,search_url:校验请求的地址;old_url_params:是否原来的url参数,false的话需要重新在此处配置url_params;success_response_define:请求完成之后判断是否成功;

old_json:如果是true,默认还是使用原来的json,否则就需要在这里重新配置json参数

(暂时只支持了json的处理,后续加上data的)

resend_rule

"resend_rule": [{
        "to": ["手机号"],
        "time": 5,
        "handler": "",
        "message": "失败消息数:{id}:{content}"
    }, {
        "to": ["手机号"],
        "time": 20,
        "handler": "",
        "message": "失败消息数:{id}:{content}"
    }]

第一次发送失败之后,默认会重新在推送一次,如果配置有这个重新推送规则,重推失败之后,会给这个手机号发送通知,手机号是固定值,配置了多少次就会重新推送多少次
sub_map_id

"sub_map_id": 19

新增的推送配置ID,在编辑时候使用
request_type

hcminnerapi

调用外部接口时无需配置,调用内部接口需要配置

send_check (测试中,预计发版时间12.16)

{
        "is_task_done": "=IF(is_task_done==2,True,False)",

         "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": "=CONCAT('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%3D',id,'&response_type=code&state=app_single_login&flag=veri&name=',get_value_from_dict(['receiver', 'number']),'&entry=',sub_decrypt())",
    "appurl": "=CONCAT('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%3D',id,'&response_type=code&state=app_single_login&flag=veri&name=',get_value_from_dict(['receiver', 'number']),'&entry=',sub_decrypt())",
    "flowid": "=get_value_from_dict(['params', 'wf_assignment_id'])",
    "creator": "=get_value_from_dict(['sender', 'number'])",
    "syscode": "HCM",
    "Filetype": "message_type",
    "isremark": "0",
    "nodename": "=get_value_from_dict(['assignment_info', 'wf_def_name'])",
    "receiver": "=get_value_from_dict(['receiver', 'number'])",
    "viewtype": "0",
    "important": 10,
    "receivets": "=S(get_current_timestamp())",
    "requestname": "=content",
    "workflowname": "=get_value_from_dict(['business_info', 'name'])",
    "createdatetime": "=timestamp_format(\"%Y-%m-%d %H:%M:%S\")",
    "receivedatetime": "=timestamp_format(\"%Y-%m-%d %H:%M:%S\")"
}


生成的数据(前往日志查看):

具体数据案例:

{
        "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_infourl请求token的url
method请求方法
headers请求头
params请求参数 如企业微信为{"corpid": "****", "corpsecret": "****"}
data一般不用填
json一般不用填
get_token_field解析请求响应体得到token, 类型为列表 , 如 ["token"]
expire_timetoken缓存时间, 例如token有效期为30分钟 此处可以写 1500
auth_keytoken在认证时的key 如 "token"
proxy_number指定请求代理
locationdata, json, params, headers, 需要将信息添加到这些字段里面去
rtype默认请求的返回值是json(), 可以指定 text, content 等

案例:

{
    "url": "https://qyapi.weixin.qq.com/cgi-bin/gettoken",
    "method": "GET",
    "params": {
        "corpid": "ww5dse3asebcab462a",
        "corpsecret": "rBZrTHww5debc5sd917bAvD2dP_Qa5k4JgsnM(脱敏处理)"
    },
    "headers": {},
    "auth_key": "access_token",
    "location": "params",
    "expire_time": 1500,
    "get_token_field": ["access_token"]
}


4.请求结果处理

案例:

请求返回数据:

 {"result":{"priority":"20","id":"3214521","message":"推送成功","action":"new"}}


配置案例:

表示:根据success_response_key,success_response_value判断是否请求成功,成功的话调用API:private.test_api_i,API可以拿到的参数为:{"action":"new","message_id":"3214521"}

{
    "callback_api": "private.test_api_i",
    "callback_param": [{
        "map": "action",
        "field": ["result", "action"],
        "default": "new"
    },  {
        "map": "message_id",
        "field": ["result", "id"],
        "default": "111"
    }],
    "success_response_key": ["result","priority"],
    "success_response_value": "20"
}


5.失败重试机制

handler: 消息类别,mobile_handler表示发短信提醒,mail_handler表示邮件提醒,可以为空,不配置

to:mobile_handler表示配置手机号,mail_handler表示配置邮箱,可以为空,不配置

time:表示失败后多久再推送一次,默认20秒,最小5秒最大3600秒

message:消息内容,可以替换数据ID

配置案例:

案例功能描述:以下配置表示如果数据推送失败了,20秒后执行再次推送,如果还是失败,20秒后再次重新推送,然后发短信给两个手机号,如果再次失败,40秒后再次推送,发邮件给邮箱。

[{
    "to": "",
    "time": 20,
    "handler": "",
    "message": "失败消息数:{msg_id}"
},{
    "to": ["18845191220", "18845191521"],
    "time": 20,
    "handler": "mobile_handler",
    "message": "失败消息数:{msg_id}"
}, {
    "to": ["223014282@qq.com", "223212282@qq.com"],
    "time": 40,
    "handler": "mail_handler",
    "message": "失败消息数"
}]


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
}

在公式编辑器页面,已经添加了对应的中文描述:

其他消息数据发送结构体可以在初始配置时, 如何明确流程消息结构体

  1. 不配置字段发送格式,
  2. 触发这条消息订阅规则
  3. 在SubscribeSendRecord, 找到触发的消息推送记录, 查看发送数据, 如下


由于人员相关字段太多, sender 和 receiver只会展示部分字段, 实际人员字段参照 hcm.model.get 接口返回的数据格式


7.查看推送记录

/common_model_list?model=SubscribeSendRecord


支持手动同步, 打开浏览器控制台, F12, 选中一条同步记录, 点击手动同步,  查看接口如下图

返回值为同步记录id: 失败信息的字典映射




  • 无标签