# 开发者对接
关于第三方系统,如何接入消息API,获取消息能力的操作指导
# 名词解释
# 消息任务
调用一次消息中心的消息发送接口为一个消息任务,成功调用的消息任务返回一个唯一sendId。
# 消息记录
一个消息任务可发送给多个人,对应到个人的记录为一个消息记录。
# 发送方式
消息发送,支持多种发送方式:系统消息、手机短信、电子邮件、钉钉、微信、app消息推送。
# 消息网关
消息网关为消息发送方式对应的对接方式,例如:手机短信方式已对接阿里云短信、天瑞和、飞鸽传书、一信通、即信等网关。
发送方式 | 消息网关 |
---|---|
系统消息 | 站内信、智慧校园系统消息通用网关 |
手机短信 | 阿里云短信、天瑞和、飞鸽传书、一信通、即信 |
电子邮件 | 网易、腾讯、通用 |
钉钉 | 钉钉工作消息网关 |
微信 | 微信企业网关、瑞雷森企业微信网关 |
app消息推送 | 个推推送网关 |
# 消息应用
应用发送消息需要在消息平台注册应用,根据应用分配的 appId 进行接口调用。
# 消息类型
消息应用下可以创建多个消息类型,方便消息的分类管理;例如流程应用, 创建了流程代办提醒、流程办结提醒、流程转办提醒等消息类型。 同时,消息类型需要配置对应的发送方式,每个发送方式可以选择一个对应消息发送网关。
# 消息模板
消息类型都需要设置模板,模板便于管理消息发送,消息模板有单模板和多模板;单模板表示所有的发送方式使用同种模板,而多模板表示每个发送方式可以设置不同的模板。
# 消息对接
# 应用注册
第三方业务系统,如果需要对接消息接口,需要先在消息平台注册应用
# 消息类型
参数 | 描述 | 举例 |
---|---|---|
所属消息类别 | 目前有通知、提醒、其他(单选) | 通知 |
消息类型名称 | 名称需贴合该类型的使用场景 | 流程代办提醒 |
消息类型编号 | 编号,不可重复(messageTypeCode) | flow_asdasada_asdasd |
消息的发送方式 | 目前有 SMS(手机短信)、MAIL(邮件)、WECHAT(微信)、DINGTALK(钉钉)、SUPERAPP(APP消息推送)、WEBSITE(系统消息) (可多选,具体参考项目实际情况) | SMS(手机短信)、WEBSITE(系统消息网关)、SUPERAPP(个推网关) |
是否通用模板 | 是:多个发送方式共用一个模板; 否:每个发送方式可自定义不同模板 | 是 |
# 消息模板
模板 | 变量 |
---|---|
您好,转阅了流程事项给您。 | name-用户名称; ffname-应用名称 |
于申请下载主题数据目录:的数据,请及时处理 | username-学工号;time-时间;dataListName-数据目录名称 |
您正在激活帐号,须验证身份,验证码,有效期5分钟,请尽快完成验证。 | code-验证码 |
# 消息类型
# 描述
接入应用后,需要新建消息类型,消息类型是消息发送的场景。
# 操作
通过应用管理-消息类型管理,进入【消息类型管理】功能;
点击【添加消息类型】,创建1个消息类型;
消息类型编号,用于区分不同的消息类型,对接消息接口时使用;
消息类别,选择一个消息类别,简单理解为给消息类型分类即可,在消息类别管理中可以添加新的消息类别;
发送方式,如果1个消息类型,需要同时通过多个渠道给接收者发送消息,可以选择多个发送方式;
勾选发送方式后,需要选择当前发送方式发消息的网关,默认选中1个,就是我们在消息网关管理中设置的默认网关;
模板类型:添加消息类型后,需要编辑消息模板,消息模板的编辑方式分2种,叫做模板类型。一种是单模板,只要编辑1套模板,多个发送方式都使用这1套模板;另一种是多模板,每一个发送方式都分别定义一套模板;
# 消息模板
# 描述
添加了消息类型后,需要编辑消息模板,发送消息时,从消息模板中获取内容作为消息正文发送。
# 操作
在应用管理-消息类型管理中,点击【模板管理】,可以进入模板管理功能;
消息模板类型:
消息模板类型包括:单模板和多模板;
单模板:编辑1套模板,多个发送方式共用;
多模板:每个发送方式分别定义1套模板;
模板消息支持插入变量:
变量类型包括内置变量和自定义变量;
美元符号+双中括号的是内置变量,双花括号的是自定义变量;
内置变量由消息服务系统提供,自定义变量由开发者自行传值;
添加自定义变量需要按照格式添加,不然系统无法识别;
自定义变量添加后,鼠标光标移出编辑框后,自动识别自定义变量,并在下方出现变量设置,需要填写变量标题;
短信模板,短信发送方式有2种,一种是选择模板,一种是自定义:
在设置-短信编辑方式中可以切换;
具体选择哪种发送方式,需要根据短信网关运营商的政策定,如阿里云短信要求必须要提前申请短信模板,通过短信模板发送短信,飞鸽传书短信支持自定义短信;
选择短信模板发送的短信编辑方式,消息类型中,短信发送方式的消息模板,必须从网关支持的短信模板中选择,带入到消息模板中,不可以自定义编辑;
示例:
如果希望消息内容保持一致,可以选择单模板类型;
如果希望每个发送方式各自定义1套模板,可以选择多模板类型;
如果希望消息内容自定义,可以选择单模板类型,在模板中插入自定义变量,即可实现消息内容自定义;
# access token
请参照项目实际域名操作
# poa能力申请
注册应用 已注册过的应用,不用重复注册,直接申请发送信息scope即可。
curl -i -s -X POST -H 'Content-Type: application/json' -d '{"clientName": "应用名称"}' 'http://poa-sa.xxx.edu.cn/v1/clients'
响应结果如下:{"code":0,"message":null,"data":{"clientId":"*************","clientSecret":"*************"}}
应用申请发送消息 scope
curl -i -s -X POST -H 'Content-Type: application/json' -d '{"scopes": ["messagecenter:v1:sendMessage"]}' 'http://poa-sa.xxx.edu.cn/v1/clients/应用clientId/scopes'
查询已注册应用
curl -i -s -X GET 'http://poa-sa.xxx.edu.cn/v1/clients?pageNo=1&pageSize=20'
# 获取access token
请求:
POST /oauth2/token HTTP/1.1
Host: poa.xxx.edu.cn
Content-Type: application/x-www-form-urlencoded
grant_type=client_credentials&client_id=<your_client_id>&client_secret=
<your_client_secret>&scope=<your_scopes>
参数说明:
参数 | 说明 |
---|---|
grant_type | 值必须是client_credentials。 |
client_id | 申请的 Client ID。 |
client_secret | 申请的 Client Secret。 |
scope | 所请求的权限,多个用逗号分割。 |
响应:
200 OK
Content-Type: application/json
{
"access_token": "AYjcyMzY3ZDhiNmJkNTY",
"token_type": "bearer",
"expires_in": 3600
}
# 接口能力
发送消息接口文档
发送接口文档地址: https://poa-docs.xxx.edu.cn/messagecenter/v1/latest/#operation/messageSend (域名地址参考实际项目地址)
access token
access token获取方式参考上方poa获取access token
入参说明
参数 | 描述 | 类型 | 必填 | 默认值 |
---|---|---|---|---|
appId | 应用ID | string | 是 | |
sendId | 消息任务序列识别号,不重复【为空,消息服务生成唯一sendId,并返回】 | string | 否 | |
sendType | 根据消息类型配置发送方式选填【SMS(手机短信)、MAIL(邮件)、WECHAT(微信)、DINGTALK(钉钉)、SUPERAPP(APP)、WEBSITE(系统消息) 】;不填默认按照配置 | string[] | 否 | |
messageTypeCode | 消息类型的编码 | string | 是 | |
promise | 消息送达承诺【如果true,校验比较严格】 | boolean | 否 | false |
importantIdentity | 是否重要消息的标识 | boolean | 否 | false |
toPersons | 接收人账号,多个英文逗号分隔【5种接收对象,至少有一不为空】 | string | 否 | |
toDepts | 接收部门id,多个英文逗号分隔【5种接收对象,至少有一不为空】 | string | 否 | |
toGroups | 接收用户组id,多个英文逗号分隔【5种接收对象,至少有一不为空】 | string | 否 | |
toPhones | 接收手机号,多个英文逗号分隔【只能发送短信】 | string | 否 | |
toEmails | 接收邮箱,多个英文逗号分隔【只能发送邮件】 | string | 否 | |
signOff | 落款 | string | 否 | |
data.title | 消息标题 | string | 是 | |
data.coverImageUrl | 封面图url | string | 否 | |
data.filesUrl | 消息附件url,多个英文逗号分隔【此处调用消息平台服务文件上传功能】 | string | 否 | |
data.mobileUrl | 移动端跳转链接 | string | 否 | |
data.url | pc端跳转链接 | string | 否 | |
data.handleKey | 处理字段;APP跳转预设的KEY或者是接收方要处理的URL地址等【如果为空,默认设置该消息任务的账号唯一key】 | string | 否 | |
data.paramValueJson | 消息类型模板设置的变量【模板设置了变量就必填】 | JSONObject | 否 |
其中 appId是由消息平台应用申请完成后分配;
发送demo
以上方流程表单消息模板为例
您好,${name}转阅了${ffname}流程事项给您。| name-用户名称; ffname-应用名称
Postman截图如下:
发送成功
code 为 0 表示发送成功
data.sendId 返回消息任务发送的序列号;根据sendId 可以查询发送任务的情况;
发送失败
code != 0
若是入参 promise 设置为false
message 给出错误信息;
若是入参 promise 设置为true
message 给出错误信息;
data.errorList 返回有异常的发送情况数组:
receiverKey 接收对象【可以是账号、手机号、邮箱地址】
exceptionMessage 该接收对象具体的异常问题
# 获取消息类别分页列表
# 获取消息类别分页列表
文档地址: https://poa-docs.xxx.edu.cn/messagecenter/v1/latest/#operation/getMessageTypePageList (域名地址参考实际项目地址)
# access token
获取方式参考上方poa获取access token
# 入参说明
参数 | 描述 | 类型 | 必填 | 默认值 |
---|---|---|---|---|
name | 消息类别名称 | string | 否 | |
pageIndex | 分页-页码 | integer | 否 | 0 |
pageSize | 分页-每页记录数 | integer | 否 | 10 |
# 响应结果
查询成功
{
"timestamp": 时间戳,
"code": 0, //code 为 0表示查询成功
"message": "查询成功",
"data": {
"totalCount": 记录总数,
"pageSize": 每页记录数,
"totalPages": 分页总数,
"pageIndex": 当前页码,
"items": [
{
"name": "消息类别名称",
"description": "消息类别描述",
"editTime": "消息类别编辑时间",
"id": "消息类别主键",
"code": "消息类别编码"
},...
]
}
}
查询失败
{
"code": , //code 不为 0表示查询失败
"message": "错误信息",
"timestamp": 时间戳
}
# 获取应用列表
# 获取应用列表
文档地址: https://poa-docs.xxx.edu.cn/messagecenter/v1/latest/#operation/listApp (域名地址参考实际项目地址)
# access token
获取方式参考上方poa获取access token
# 入参说明
无
# 响应结果
查询成功
{
"timestamp": 时间戳,
"code": 0, //code 为 0表示查询成功
"message": "查询成功",
"data": [
{
"name": "应用名称",
"description": 描述,
"systemName": 所属系统,
"enabled": 是否启用【1表示启用,0表示未启用】,
"appId": "应用appId"
},...
]
}
查询失败
{
"code": , //code 不为 0表示查询失败
"message": "错误信息",
"timestamp": 时间戳
}
# 根据消息类别查询消息类型分页列表
# 根据消息类别查询消息类型分页列表
文档地址: https://poa-docs.xxx.edu.cn/messagecenter/v1/latest/#operation/getMessageTypeByCategory (域名地址参考实际项目地址)
# access token
获取方式参考上方poa获取access token
# 入参说明
参数 | 描述 | 类型 | 必填 | 默认值 |
---|---|---|---|---|
messageCategoryName | 消息类别名称 | string | 否 | |
messageCategoryCode | 消息类别编码 | string | 否 | |
pageIndex | 分页-页码 | integer | 否 | 0 |
pageSize | 分页-每页记录数 | integer | 否 | 10 |
# 响应结果
查询成功
{
"timestamp": 时间戳,
"code": 0, //code 为 0表示查询成功
"message": "查询成功",
"data": {
"totalCount": 记录总数,
"pageSize": 每页记录数,
"totalPages": 分页总数,
"pageIndex": 当前页码,
"items": [
{
"messageCategoryName": "消息类别名称",
"messageTypeCode": "消息类型编码",
"whetherUniversal": 是否通用模板【1表示是,0表示不是】,
"messageTypeId": "消息类型ID",
"appId": "应用appId",
"messageCategoryCode": "消息类别编码",
"description": "描述",
"messageTypeName": "消息类型名称",
"enabled": 是否启用【1表示启用,0表示未启用】
},...
]
}
}
查询失败
{
"code": , //code 不为 0表示查询失败
"message": "错误信息",
"timestamp": 时间戳
}
# 个人消息记录分页查询
# 个人消息记录分页查询
文档地址: https://poa-docs.xxx.edu.cn/messagecenter/v1/latest/#operation/listMessageRecord (域名地址参考实际项目地址)
# access token
获取方式参考上方poa获取access token
# 入参说明
参数 | 描述 | 类型 | 必填 | 默认值 |
---|---|---|---|---|
accountName | 用户名(学工号) | string | 是 | |
appKey | 应用appId | string | 否 | |
messageCategoryCode | 分页-页码 | integer | 否 | 0 |
messageTypeId | 消息类型Id | string | 否 | 0 |
messageTypeCode | 消息类型CODE | string | 否 | 0 |
notReceiveCategorys | 不接收消息类别(类别代码),多个用英文逗号隔开 | string | 否 | 0 |
notReceiveTypes | 不接收消息类型(ID),多个用英文逗号隔开 | string | 否 | 0 |
title | 消息标题 | string | 否 | 0 |
important | 是否重要消息 | boolean | 否 | 0 |
star | 是否标星信息【0 表示 正常状态 1 表示标星】 | integer | 否 | 0 |
readed | 是否已读 | boolean | 否 | 0 |
readerStatus | 接收人标记消息状态【0 表示 正常状态 1 表示回收站】 | integer | 否 | 0 |
pageIndex | 分页-页码 | integer | 否 | 0 |
pageSize | 分页-每页记录数 | integer | 否 | 10 |
# 响应结果
查询成功
{
"timestamp": 时间戳,
"code": 0, //code 为 0表示查询成功
"message": "查询成功",
"data": {
"totalCount": 记录总数,
"pageSize": 每页记录数,
"totalPages": 分页总数,
"pageIndex": 当前页码,
"items": [
{
"recordId": "消息记录ID",
"title": "消息记录标题",
"coverImageUrl": "封面图地址",
"content": "消息记录内容",
"mobileUrl": "移动端跳转链接",
"signOff": "落款",
"url": "pc端跳转链接",
"sendType": "发送方式",
"accountName": "消息接收人账号",
"sendTime": "发送时间",
"appId": "应用appId",
"appName": "应用名称",
"messageCategoryCode": "消息类别编码",
"messageTypeName": "消息类型名称",
"readed": "是否已读【1表示已读,0表示未读】",
"star": "是否标星【1表示标星,0表示未标星】",
"readerStatus": "接收人标记消息状态【0表示正常,1表示回收站,2表示删除】",
"deptId": "落款部门",
"sendTaskPersonKey": "消息任务唯一键",
"receiverKey": "接收号码",
"messageCategoryName": "消息类别名称",
"messageTypeCode": "消息类别编码",
"important": "是否重要消息【1表示重要,0表示不重要】",
"deleteTime": "删除时间",
"files": "附件"
},...
]
}
}
查询失败
{
"code": , //code 不为 0表示查询失败
"message": "错误信息",
"timestamp": 时间戳
}
# 根据消息类型编码查询对应发送方式
# 根据消息类型编码查询对应发送方式
文档地址: https://poa-docs.xxx.edu.cn/messagecenter/v1/latest/#operation/getSendTypeByMessageTypeCode (域名地址参考实际项目地址)
# access token
获取方式参考上方poa获取access token
# 入参说明
参数 | 描述 | 类型 | 必填 | 默认值 |
---|---|---|---|---|
code | 消息类型编码 | string | 是 |
# 响应结果
查询成功
{
"timestamp": 时间戳,
"code": 0, //code 为 0表示查询成功
"message": "查询成功",
"data": [
{
"发送方式": "发送方式名称",
...
},...
]
}
查询失败
{
"code": , //code 不为 0表示查询失败
"message": "错误信息",
"timestamp": 时间戳
}
# 根据学工号获取安全手机号(手机号脱敏)
# 根据学工号获取安全手机号(手机号脱敏)
文档地址: https://poa-docs.xxx.edu.cn/messagecenter/v1/latest/#operation/getVerificationPhoneNum (域名地址参考实际项目地址)
# access token
获取方式参考上方poa获取access token
# 入参说明
参数 | 描述 | 类型 | 必填 | 默认值 |
---|---|---|---|---|
accountNames | 学工号,多个学工号英文逗号分隔 | string | 是 |
# 响应结果
查询成功
{
"timestamp": 时间戳,
"code": 0, //code 为 0表示查询成功
"message": "查询成功",
"data": [
{
"accountName": "账号",
"securePhone":"手机号(脱敏)"
},...
]
}
查询失败
{
"code": , //code 不为 0表示查询失败
"message": "错误信息",
"timestamp": 时间戳
}
# app消息推送接口
# app消息批量推送接口;全体推送以及批量推送;【该接口,无消息记录】
文档地址: https://poa-docs.xxx.edu.cn/messagecenter/v1/latest/#operation/appBatchMessageSend (域名地址参考实际项目地址)
# access token
获取方式参考上方poa获取access token
# 入参说明
参数 | 描述 | 类型 | 必填 | 默认值 |
---|---|---|---|---|
appId | 应用appId | string | 是 | |
sendId | 消息任务序列识别号,不重复【为空,消息服务生成唯一sendId,并返回】 | string | 否 | |
messageTypeCode | 消息类型的编码 | string | 是 | |
all | 是否全体推送【设置全量推送,clientIds,tags设置无效】 | boolean | 否 | false |
clientIds | 设备clientId,多个英文逗号分隔【clientIds,tags 二选一】 | string | 否 | false |
tags | 标签,多个英文逗号分隔【app登录用户打上标签,通过标签可以分组批量推送】【clientIds,tags 二选一】 | string | 否 | |
promise | 消息送达承诺【如果true,校验比较严格】 | boolean | 否 | false |
importantIdentity | 是否重要消息的标识 | boolean | 否 | false |
data.title | 消息标题 | string | 是 | |
data.extraParams | 额外参数 | string | 否 | |
data.coverImageUrl | 封面图url | string | 否 | |
data.filesUrl | 消息附件url,多个英文逗号分隔【此处调用消息平台服务文件上传功能】 | string | 否 | |
data.mobileUrl | 移动端跳转链接 | string | 否 | |
data.url | pc端跳转链接 | string | 否 | |
data.handleKey | 处理字段;APP跳转预设的KEY或者是接收方要处理的URL地址等【如果为空,默认设置该消息任务的账号唯一key】 | string | 否 | |
data.paramValueJson | 消息类型模板设置的变量【模板设置了变量就必填】 | JSONObject | 否 |
其中 appId是由消息平台应用申请完成后获得;
# 响应结果
发送成功
code 为 0 表示发送成功
发送失败
"code": , //code 不为 0表示查询失败
"message": "错误信息",
"timestamp": 时间戳
}
# 消息任务结果统计
# 消息任务结果统计
文档地址: https://poa-docs.xxx.edu.cn/messagecenter/v1/latest/#operation/getSendTaskCount (域名地址参考实际项目地址)
# access token
获取方式参考上方poa获取access token
# 入参说明
参数 | 描述 | 类型 | 必填 | 默认值 |
---|---|---|---|---|
sendId | 消息任务发送序列号 | string | 是 |
# 响应结果
查询成功
{
"timestamp": 时间戳,
"code": 0, //code 为 0表示查询成功
"message": "查询成功",
"data": [
{
"count": "消息任务下消息记录总数",
"sendId":"发送序列号",
"type": "发送方式",
"error":"消息记录失败数",
"success": "消息记录成功数"
},...
]
}
查询失败
{
"code": , //code 不为 0表示查询失败
"message": "错误信息",
"timestamp": 时间戳
}
# 根根据应用appId查询消息类型列表
# 根根据应用appId查询消息类型列表
文档地址: https://poa-docs.xxx.edu.cn/messagecenter/v1/latest/#operation/listMessageType (域名地址参考实际项目地址)
# access token
获取方式参考上方poa获取access token
# 入参说明
参数 | 描述 | 类型 | 必填 | 默认值 |
---|---|---|---|---|
appKey | 应用appId | string | 否 | |
messageTypeId | 消息类型ID | string | 否 |
# 响应结果
查询成功
{
"timestamp": 时间戳,
"code": 0, //code 为 0表示查询成功
"message": "查询成功",
"data": [
{
"code": "消息类型编码",
"addTime":"消息类型创建时间",
"appName": "应用名称",
"appId":"应用appId",
"id": "消息类型ID",
"type": "发送方式",
"messageTypeName":"消息类型名称",
"enabled": "是否启用【1表示启用,0表示未启用】",
},...
]
}
查询失败
{
"code": , //code 不为 0表示查询失败
"message": "错误信息",
"timestamp": 时间戳
}
# 对接demo
# java
maven依赖
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>3.13.1</version>
</dependency>
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import okhttp3.*;
OkHttpClient client = new OkHttpClient().newBuilder().build();
MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded");
//注意修改body里边的client_id,client_secret,scope等值
RequestBody body = RequestBody.create(mediaType, "grant_type=client_credentials&client_id=CPZrUASAj_6XdMZ_wuWB2e8GXmM=&scope=user:v1:readUser,user:v1:readOrganization,user:v1:readGroup,user:v1:readLabel,user:v1:readUserSecret,user:v1:readPost,authz:v1:readRole,messagecenter:v1:sendMessage,messagecenter:v1:writeMessage,messagecenter:v1:readMessage&client_secret=Sgl4DbaFP93Yyh28uEvTqICb_WyyV-iiWAUVJds4HlE=");
//获取token(xxx是泛指,url需根据项目实际地址修改)
Request request = new Request.Builder()
.url("https://poa.xxx.cn/oauth2/token")
.method("POST", body)
.addHeader("Content-Type", "application/x-www-form-urlencoded")
.build();
Response response = client.newCall(request).execute();
Object token= null;
if(response.isSuccessful()){
ResponseBody responseBody = response.body();
String responseStr = responseBody.string();
JSONObject jsonObject = JSON.parseObject(responseStr);
if(null != jsonObject){
token = jsonObject.get("access_token");
}
}
if(null != token){
MediaType sendMediaType = MediaType.parse("application/json");
RequestBody sendBody = RequestBody.create(sendMediaType, "{\"accountName\":\"发送人学工号\",\"appId\":\"应用appId\",\"data\":{\"coverImageUrl\":\"封面图链接\",\"filesUrl\":\"附件链接\",\"paramValueJson\":{\"模板参数名\":\"参数填充值\"},\"title\":\"消息标题\"},\"messageTypeCode\":\"消息类型CODE\",\"sendType\":[\"WEBSITE\",\"发送方式\"],\"toDepts\":\"部门\",\"toEmails\":\"邮件\",\"toGroups\":\"用户组\",\"toPersons\":\"用户学工号\",\"toPhones\":\"手机号\"}\r\n");
//消息发送(xxx是泛指,url需根据项目实际地址修改)
Request sendRequest = new Request.Builder()
.url("http://poa.xxx.edu.cn/apis/messagecenter/v1/poaMessage/messageSend")
.method("POST", sendBody)
.addHeader("Authorization", "Bearer " + token.toString())
.addHeader("Content-Type", "application/json")
.build();
Response sendResponse = client.newCall(sendRequest).execute();
}
# PHP
//获取token(xxx是泛指,url需根据项目实际地址修改)
<?php
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://poa.xxx.edu.cn/oauth2/token',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => 'grant_type=client_credentials&client_id=CPZrUASAj_6XdMZ_wuWB2e8GXmM%3D&scope=user%3Av1%3AreadUser%2Cuser%3Av1%3AreadOrganization%2Cuser%3Av1%3AreadGroup%2Cuser%3Av1%3AreadLabel%2Cuser%3Av1%3AreadUserSecret%2Cuser%3Av1%3AreadPost%2Cauthz%3Av1%3AreadRole%2Cmessagecenter%3Av1%3AsendMessage%2Cmessagecenter%3Av1%3AwriteMessage%2Cmessagecenter%3Av1%3AreadMessage&client_secret=Sgl4DbaFP93Yyh28uEvTqICb_WyyV-iiWAUVJds4HlE%3D',
CURLOPT_HTTPHEADER => array(
'Content-Type: application/x-www-form-urlencoded'
),
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
//消息发送(xxx是泛指,url需根据项目实际地址修改)
<?php
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'http://poa.xxx.edu.cn/apis/messagecenter/v1/poaMessage/messageSend',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS =>'{"accountName":"发送人学工号","appId":"应用appId","data":{"coverImageUrl":"封面图链接","filesUrl":"附件链接","paramValueJson":{"模板参数名":"参数填充值"},"title":"消息标题"},"messageTypeCode":"消息类型CODE","sendType":["WEBSITE","发送方式"],"toDepts":"部门","toEmails":"邮件","toGroups":"用户组","toPersons":"用户学工号","toPhones":"手机号"}
',
CURLOPT_HTTPHEADER => array(
//把上一步得到的token替换到 token
'Authorization: Bearer token',
'Content-Type: application/json'
),
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
# Python
import http.client
import json
//获取token(xxx是泛指,url需根据项目实际地址修改)
conn = http.client.HTTPSConnection("poa.xxx.edu.cn")
payload = 'grant_type=client_credentials&client_id=CPZrUASAj_6XdMZ_wuWB2e8GXmM%3D&scope=user%3Av1%3AreadUser%2Cuser%3Av1%3AreadOrganization%2Cuser%3Av1%3AreadGroup%2Cuser%3Av1%3AreadLabel%2Cuser%3Av1%3AreadUserSecret%2Cuser%3Av1%3AreadPost%2Cauthz%3Av1%3AreadRole%2Cmessagecenter%3Av1%3AsendMessage%2Cmessagecenter%3Av1%3AwriteMessage%2Cmessagecenter%3Av1%3AreadMessage&client_secret=Sgl4DbaFP93Yyh28uEvTqICb_WyyV-iiWAUVJds4HlE%3D'
headers = {
'Content-Type': 'application/x-www-form-urlencoded'
}
conn.request("POST", "/oauth2/token", payload, headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))
//消息发送(xxx是泛指,url需根据项目实际地址修改)
conn = http.client.HTTPSConnection("poa.xxx.edu.cn")
payload = json.dumps({
"accountName": "发送人学工号",
"appId": "应用appId",
"data": {
"coverImageUrl": "封面图链接",
"filesUrl": "附件链接",
"paramValueJson": {
"模板参数名": "参数填充值"
},
"title": "消息标题"
},
"messageTypeCode": "消息类型CODE",
"sendType": [
"WEBSITE",
"发送方式"
],
"toDepts": "部门",
"toEmails": "邮件",
"toGroups": "用户组",
"toPersons": "用户学工号",
"toPhones": "手机号"
})
headers = {
//把上一步得到的token替换到 token
'Authorization': 'Bearer token',
'Content-Type': 'application/json'
}
conn.request("POST", "/apis/messagecenter/v1/poaMessage/messageSend", payload, headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))