需求:在業務系統中產生的通知消息,通過調用釘釘服務端API,發送到對應員工的釘釘客戶端。
步驟:
目錄
1.創建並配置消息發送應用
1.1登錄開發者後臺
打開釘釘開放平臺https://ding-doc.dingtalk.com/,點右上角的“登錄開發者後臺”,然後使用企業管理者帳戶登陸。
1.2創建H5微應用
選擇"應用開發"->"企業內部開發"->"H5微應用",點擊"創建應用",開始創建企業自建微應用。
填寫應用基本信息。包括應用名稱、應用Logo和應用簡介,選擇"企業內部自主開發",點擊"下一步"。
開發模式選擇“開發應用”,開發應用類型選擇“微應用”,應用首頁鏈接填寫H5微應用首頁url,服務器出口IP填寫本企業服務器的公網IP。點擊創建。
1.3配置H5微應用
查看創建好的應用信息,取得AgentId、AppKey和AppSecret,在API調用時要使用。
在人員設置頁設置使用該應用的人員,其他人員接收不到通知消息。
在接口權限頁面,高級權限-企業通訊錄權限部分,申請打開[通訊錄只讀權限]和[手機號獲取userid],並且可以設定該權限的範圍是對全體員工還是部分員工
2.調用服務端API發送消息
2.1獲取access_token
【注意】正常情況下access_token有效期爲7200秒,有效期內重複獲取返回相同結果,並自動續期。
調試工具:在線調試
請求方式:GET(HTTPS)
請求地址:https://oapi.dingtalk.com/gettoken?appkey=key&appsecret=secret
參數說明:
參數 |
參數類型 |
必須 |
說明 |
appkey |
String |
是 |
應用的唯一標識key |
appsecret |
String |
是 |
應用的密鑰 |
SDK請求示例(JAVA):
DefaultDingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/gettoken");
OapiGettokenRequest request = new OapiGettokenRequest();
request.setAppkey("appkey");
request.setAppsecret("appsecret");
request.setHttpMethod("GET");
OapiGettokenResponse response = client.execute(request);
返回說明:
{
"errcode": 0,
"errmsg": "ok",
"access_token": "fw8ef8we8f76e6f7s8df8s"
}
2.2根據手機號獲取userid
企業使用此接口可通過手機號獲取其所對應員工的userid。
調試工具:在線調試
請求方式:GET(HTTPS)
請求地址:https://oapi.dingtalk.com/user/get_by_mobile?access_token=ACCESS_TOKEN&mobile=1xxxxxxxxxx
參數說明:
名稱 |
類型 |
是否必須 |
說明 |
access_token |
String |
必須 |
調用接口憑證,通過獲取企業access_token獲取 |
mobile |
String |
必須 |
手機號碼 |
SDK請求示例(JAVA):
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/user/get_by_mobile");
OapiUserGetByMobileRequest request = new OapiUserGetByMobileRequest();
request.setMobile("1xxxxxxxxxx");
OapiUserGetByMobileResponse execute = client.execute(request, access_token);
返回結果:
{
"errcode": 0,
"errmsg": "ok",
"userid": "zhangsan"
}
參數 |
說明 |
errcode |
返回碼 |
errmsg |
對返回碼的文本描述內容 |
userid |
員工在當前企業內的唯一標識。 |
2.3發送工作通知消息
發送工作通知消息需要注意以下事項:
- 同一個微應用相同消息的內容同一個用戶一天只能接收一次。
- 同一個微應用給同一個用戶發送消息,企業內部開發方式一天不得超過500次。
- 通過設置to_all_user參數全員推送消息,一天最多3次。
- 詳細的限制說明,請參考“工作通知消息的限制”。
- 該接口是異步發送消息,接口返回成功並不表示用戶一定會收到消息,需要通過“查詢工作通知消息的發送結果”接口查詢是否給用戶發送成功。
- 消息類型和樣例可參考消息類型文檔。
調試工具:在線調試
請求方式:POST(HTTPS)
請求地址:https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2?access_token=ACCESS_TOKEN
參數說明:
名稱 |
類型 |
是否必須 |
示例值 |
說明 |
agent_id |
Number |
必須 |
1234 |
應用agentId |
userid_list |
String |
可選(userid_list,dept_id_list, to_all_user必須有一個不能爲空) |
zhangsan,lisi |
接收者的用戶userid列表,最大列表長度:100 |
dept_id_list |
String |
可選(可不傳,若傳不能爲空) |
123,456 |
接收者的部門id列表,最大列表長度:20, 接收者是部門id下(包括子部門下)的所有用戶 |
to_all_user |
Boolean |
可選 |
false |
是否發送給企業全部用戶 |
msg |
json對象 |
必須 |
{"msgtype":"text","text":{"content":"消息內容"}} |
消息內容,消息類型和樣例參考“消息類型與數據格式”。最長不超過2048個字節 |
SDK請求示例(JAVA):
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2");
OapiMessageCorpconversationAsyncsendV2Request request = new OapiMessageCorpconversationAsyncsendV2Request();
request.setUseridList("01376814877479");
request.setAgentId(153858650L);
request.setToAllUser(false);
OapiMessageCorpconversationAsyncsendV2Request.Msg msg = new OapiMessageCorpconversationAsyncsendV2Request.Msg();
msg.setMsgtype("text");
msg.setText(new OapiMessageCorpconversationAsyncsendV2Request.Text());
msg.getText().setContent("test123");
request.setMsg(msg);
msg.setMsgtype("image");
msg.setImage(new OapiMessageCorpconversationAsyncsendV2Request.Image());
msg.getImage().setMediaId("@lADOdvRYes0CbM0CbA");
request.setMsg(msg);
msg.setMsgtype("file");
msg.setFile(new OapiMessageCorpconversationAsyncsendV2Request.File());
msg.getFile().setMediaId("@lADOdvRYes0CbM0CbA");
request.setMsg(msg);
msg.setMsgtype("link");
msg.setLink(new OapiMessageCorpconversationAsyncsendV2Request.Link());
msg.getLink().setTitle("test");
msg.getLink().setText("test");
msg.getLink().setMessageUrl("test");
msg.getLink().setPicUrl("test");
request.setMsg(msg);
msg.setMsgtype("markdown");
msg.setMarkdown(new OapiMessageCorpconversationAsyncsendV2Request.Markdown());
msg.getMarkdown().setText("##### text");
msg.getMarkdown().setTitle("### Title");
request.setMsg(msg);
msg.setOa(new OapiMessageCorpconversationAsyncsendV2Request.OA());
msg.getOa().setHead(new OapiMessageCorpconversationAsyncsendV2Request.Head());
msg.getOa().getHead().setText("head");
msg.getOa().setBody(new OapiMessageCorpconversationAsyncsendV2Request.Body());
msg.getOa().getBody().setContent("xxx");
msg.setMsgtype("oa");
request.setMsg(msg);
msg.setActionCard(new OapiMessageCorpconversationAsyncsendV2Request.ActionCard());
msg.getActionCard().setTitle("xxx123411111");
msg.getActionCard().setMarkdown("### 測試123111");
msg.getActionCard().setSingleTitle("測試測試");
msg.getActionCard().setSingleUrl("https://www.baidu.com");
msg.setMsgtype("action_card");
request.setMsg(msg);
OapiMessageCorpconversationAsyncsendV2Response response = client.execute(request,accessToken);
返回結果:
{
"errcode":0,
"errmsg":"ok",
"task_id":123
}
參數 |
說明 |
errcode |
返回碼 |
errmsg |
對返回碼的文本描述內容 |
task_id |
創建的發送任務id |
2.4查詢工作通知消息的發送進度
調試工具:在線調試
請求方式:POST(HTTPS)
請求地址:https://oapi.dingtalk.com/topapi/message/corpconversation/getsendprogress?access_token=ACCESS_TOKEN
參數說明:
名稱 |
類型 |
是否必須 |
示例值 |
說明 |
agent_id |
Number |
必須 |
123 |
發送消息時使用的微應用的id |
task_id |
Number |
必須 |
456 |
發送消息時釘釘返回的任務id |
SDK請求示例(JAVA):
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/message/corpconversation/getsendprogress");
OapiMessageCorpconversationGetsendprogressRequest request = new OapiMessageCorpconversationGetsendprogressRequest();
request.setAgentId(135717601L);
request.setTaskId(9326688016L);
OapiMessageCorpconversationGetsendprogressResponse response = client.execute(request, accessToken);
返回結果:
{
"errcode":0,
"errmsg":"ok",
"progress":{
"progress_in_percent":100,
"status":2
}
}
參數 |
說明 |
errcode |
返回碼 |
errmsg |
對返回碼的文本描述內容 |
progress |
|
└ progress_in_percent |
取值 0-100,表示處理的百分比 |
└ status |
任務執行狀態,0=未開始,1=處理中,2=處理完畢 |
2.5查詢工作通知消息的發送結果
調試工具:在線調試
請求方式:POST(HTTPS)
請求地址:https://oapi.dingtalk.com/topapi/message/corpconversation/getsendresult?access_token=ACCESS_TOKEN
參數說明:
名稱 |
類型 |
是否必須 |
示例值 |
說明 |
agent_id |
Number |
可選 |
123 |
微應用的agentid |
task_id |
Number |
可選 |
456 |
異步任務的id |
SDK請求示例(JAVA):
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/message/corpconversation/getsendresult");
OapiMessageCorpconversationGetsendresultRequest request = new OapiMessageCorpconversationGetsendresultRequest();
request.setAgentId(135717601L);
request.setTaskId(9326688016L);
OapiMessageCorpconversationGetsendresultResponse response = client.execute(request, accessToken);
返回結果:
{
"send_result":{
"invalid_user_id_list":"zhangsan,lisi",
"forbidden_user_id_list":"zhangsan,lisi",
"failed_user_id_list":"zhangsan,lisi",
"read_user_id_list":"zhangsan,lisi",
"unread_user_id_list":"zhangsan,lisi",
"invalid_dept_id_list":"1,2,3"
},
"errcode":0,
"errmsg":"ok"
}
參數 |
說明 |
errcode |
返回碼 |
errmsg |
對返回碼的文本描述內容 |
send_result |
|
└ invalid_user_id_list |
無效的用戶id |
└ forbidden_user_id_list |
因發送消息超過上限而被流控過濾後實際未發送的userid。未被限流的接收者仍會被收到消息。 限流規則包括: 1、同一個微應用相同消息的內容同一個用戶一天只能接收一次。 |
└ failed_user_id_list |
發送失敗的用戶id |
└ read_user_id_list |
已讀消息的用戶id |
└ unread_user_id_list |
未讀消息的用戶id |
└ invalid_dept_id_list |
無效的部門id |
2.6工作通知消息撤回
調試工具:在線調試
請求方式:POST(HTTPS)
請求地址:https://oapi.dingtalk.com/topapi/message/corpconversation/recall?access_token=ACCESS_TOKEN
參數說明:
名稱 |
類型 |
是否必須 |
示例值 |
說明 |
agent_id |
Number |
可選 |
123 |
微應用的agentid |
msg_task_id |
Number |
可選 |
456 |
異步任務的id |
SDK請求示例(JAVA):
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/message/corpconversation/recall");
OapiMessageCorpconversationRecallRequest request = new OapiMessageCorpconversationRecallRequest();
request.setAgentId(237990693L);
request.setMsgTaskId(3568141183L);
OapiMessageCorpconversationRecallResponse response = client.execute(request, accessToken);
返回結果:
{
"errcode":0,
"errmsg":"ok"
}
參數 |
說明 |
errcode |
返回碼 |
errmsg |
對返回碼的文本描述內容 |
3.消息類型
3.1消息類型與數據格式
釘釘消息類型與數據格式說明
3.2上傳消息中使用的媒體文件
釘釘上傳媒體文件