From 2453b7bea73cf899139709747ceb6f7a234be6ea Mon Sep 17 00:00:00 2001 From: dzq Date: Mon, 14 Apr 2025 08:10:38 +0800 Subject: [PATCH] =?UTF-8?q?feat(qywx):=20=E6=96=B0=E5=A2=9E=E4=BC=81?= =?UTF-8?q?=E4=B8=9A=E5=BE=AE=E4=BF=A1API=E7=9B=B8=E5=85=B3=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=E5=8F=8A=E5=93=8D=E5=BA=94=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增NewsArticle、NewsMessageResponse、GetAuthInfoResult等响应类,用于处理企业微信API的返回数据 - 在QywxApiUtil中新增sendNewsMessage和getAuthInfo方法,支持发送图文消息和获取企业授权信息 - 在QywxController中新增getAuthInfo接口,用于获取企业授权信息 - 在ReturnApprovalApplicationService中更新商品库存逻辑,确保退货审批通过后更新商品库存 --- .../api/controller/QywxController.java | 12 + .../customize/async/QyAsyncTaskFactory.java | 9 +- .../domain/qywx/api/QywxApiUtil.java | 45 + .../qywx/api/response}/GetAuthInfoResult.java | 2 +- .../domain/qywx/api/response/NewsArticle.java | 35 + .../api/response/NewsMessageResponse.java | 47 + .../ReturnApprovalApplicationService.java | 9 + ...送应用消息 - 文档 - 企业微信开发者中心.md | 947 ++++++++++++++++++ 8 files changed, 1098 insertions(+), 8 deletions(-) rename {agileboot-api/src/main/java/com/agileboot/api/customize/async => agileboot-domain/src/main/java/com/agileboot/domain/qywx/api/response}/GetAuthInfoResult.java (97%) create mode 100644 agileboot-domain/src/main/java/com/agileboot/domain/qywx/api/response/NewsArticle.java create mode 100644 agileboot-domain/src/main/java/com/agileboot/domain/qywx/api/response/NewsMessageResponse.java create mode 100644 doc/simpread-发送应用消息 - 文档 - 企业微信开发者中心.md diff --git a/agileboot-api/src/main/java/com/agileboot/api/controller/QywxController.java b/agileboot-api/src/main/java/com/agileboot/api/controller/QywxController.java index 8dd8433..6ef9c6c 100644 --- a/agileboot-api/src/main/java/com/agileboot/api/controller/QywxController.java +++ b/agileboot-api/src/main/java/com/agileboot/api/controller/QywxController.java @@ -5,6 +5,8 @@ import com.agileboot.api.customize.async.QyAsyncTaskFactory; import com.agileboot.common.exception.ApiException; import com.agileboot.common.exception.error.ErrorCode; import com.agileboot.common.utils.weixin.aes.WXBizMsgCrypt; +import com.agileboot.domain.qywx.api.QywxApiUtil; +import com.agileboot.domain.qywx.api.response.GetAuthInfoResult; import com.agileboot.domain.qywx.auth.AuthApplicationService; import com.agileboot.domain.qywx.auth.command.AddAuthCommand; import com.agileboot.domain.qywx.authCorpInfo.AuthCorpInfoApplicationService; @@ -82,6 +84,16 @@ public class QywxController { } } + @GetMapping("/getAuthInfo") + public GetAuthInfoResult getAuthInfo(@RequestParam String suiteAccessToken, @RequestParam String corpid, @RequestParam String permanentCode) { + try { + return QywxApiUtil.getAuthInfo(suiteAccessToken, corpid, permanentCode); + } catch (Exception e) { + log.error("getAuthInfo error", e); + throw new ApiException(ErrorCode.FAILED, "获取企业授权信息失败", e); + } + } + @GetMapping("/callback/data") public String validateDataCallback(@RequestParam String msg_signature, @RequestParam String timestamp, diff --git a/agileboot-api/src/main/java/com/agileboot/api/customize/async/QyAsyncTaskFactory.java b/agileboot-api/src/main/java/com/agileboot/api/customize/async/QyAsyncTaskFactory.java index 70f6108..8d8571f 100644 --- a/agileboot-api/src/main/java/com/agileboot/api/customize/async/QyAsyncTaskFactory.java +++ b/agileboot-api/src/main/java/com/agileboot/api/customize/async/QyAsyncTaskFactory.java @@ -1,21 +1,16 @@ package com.agileboot.api.customize.async; -import cn.hutool.core.date.DateUtil; import cn.hutool.extra.spring.SpringUtil; import cn.hutool.http.HttpRequest; -import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; -import com.agileboot.domain.qywx.auth.db.QyAuthService; +import com.agileboot.domain.qywx.api.response.GetAuthInfoResult; import com.agileboot.domain.qywx.authCorpInfo.AuthCorpInfoApplicationService; import com.agileboot.domain.qywx.authCorpInfo.command.AddAuthCorpInfoCommand; import com.agileboot.domain.qywx.authCorpInfo.command.UpdateAuthCorpInfoCommand; -import com.agileboot.domain.qywx.authCorpInfo.db.QyAuthCorpInfoService; -import com.agileboot.domain.qywx.template.TemplateApplicationService; -import com.agileboot.domain.qywx.template.db.QyTemplateEntity; + import java.util.HashMap; import java.util.Map; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.BeanUtils; @Slf4j public class QyAsyncTaskFactory { diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/qywx/api/QywxApiUtil.java b/agileboot-domain/src/main/java/com/agileboot/domain/qywx/api/QywxApiUtil.java index b251ba4..de20b55 100644 --- a/agileboot-domain/src/main/java/com/agileboot/domain/qywx/api/QywxApiUtil.java +++ b/agileboot-domain/src/main/java/com/agileboot/domain/qywx/api/QywxApiUtil.java @@ -1,5 +1,6 @@ package com.agileboot.domain.qywx.api; +import cn.hutool.http.HttpRequest; import cn.hutool.http.HttpUtil; import cn.hutool.json.JSONUtil; import com.agileboot.common.exception.ApiException; @@ -11,12 +12,43 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.web.client.RestClientException; +import java.util.Collections; import java.util.HashMap; +import java.util.List; import java.util.Map; @Slf4j public class QywxApiUtil { + /** + * 发送图文消息 + * @param accessToken 接口调用凭证 + * @param agentId 应用ID + * @param toUser 成员ID列表(多个用|分隔) + * @param articles 图文条目列表 + * @return 消息发送结果 + */ + public static NewsMessageResponse sendNewsMessage(String accessToken, Integer agentId, String toUser, List articles) { + String url = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=" + accessToken; + + Map params = new HashMap<>(); + params.put("touser", toUser); + params.put("msgtype", "news"); + params.put("agentid", agentId); + params.put("news", Collections.singletonMap("articles", JSONUtil.parse(articles))); + + String paramJson = JSONUtil.toJsonStr(params); + String response = HttpUtil.post(url, paramJson); + log.info("sendNewsMessage response: {}", response); + + NewsMessageResponse result = JSONUtil.toBean(response, NewsMessageResponse.class); + if (result.getErrcode() != 0) { + throw new ApiException(ErrorCode.Internal.INTERNAL_ERROR, + String.format("发送图文消息失败: %s", result.getErrmsg())); + } + return result; + } + /** * 获取企业微信部门列表(简易信息) * @param access_token 企业微信接口调用凭证 @@ -125,5 +157,18 @@ public class QywxApiUtil { throw new ApiException(ErrorCode.Client.COMMON_REQUEST_PARAMETERS_INVALID, "微信服务调用失败"); } } + + public static GetAuthInfoResult getAuthInfo(String suiteAccessToken, String corpid, String permanentCode) { + String url = "https://qyapi.weixin.qq.com/cgi-bin/service/v2/get_auth_info?suite_access_token="+suiteAccessToken; + + Map requestBody = new HashMap(); + requestBody.put("auth_corpid", corpid); + requestBody.put("permanent_code", permanentCode); + + String response = HttpUtil.post(url, JSONUtil.toJsonStr(requestBody)); + log.info("getAuthInfo response: {}", response); + + return JSONUtil.toBean(response, GetAuthInfoResult.class); + } } diff --git a/agileboot-api/src/main/java/com/agileboot/api/customize/async/GetAuthInfoResult.java b/agileboot-domain/src/main/java/com/agileboot/domain/qywx/api/response/GetAuthInfoResult.java similarity index 97% rename from agileboot-api/src/main/java/com/agileboot/api/customize/async/GetAuthInfoResult.java rename to agileboot-domain/src/main/java/com/agileboot/domain/qywx/api/response/GetAuthInfoResult.java index 4808175..baf2cfa 100644 --- a/agileboot-api/src/main/java/com/agileboot/api/customize/async/GetAuthInfoResult.java +++ b/agileboot-domain/src/main/java/com/agileboot/domain/qywx/api/response/GetAuthInfoResult.java @@ -1,4 +1,4 @@ -package com.agileboot.api.customize.async; +package com.agileboot.domain.qywx.api.response; import cn.hutool.json.JSONObject; import lombok.Data; diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/qywx/api/response/NewsArticle.java b/agileboot-domain/src/main/java/com/agileboot/domain/qywx/api/response/NewsArticle.java new file mode 100644 index 0000000..f64787e --- /dev/null +++ b/agileboot-domain/src/main/java/com/agileboot/domain/qywx/api/response/NewsArticle.java @@ -0,0 +1,35 @@ +package com.agileboot.domain.qywx.api.response; + +import lombok.Data; + +@Data +public class NewsArticle { + /** + * 图文消息标题 + * 必填:是 + * 长度限制:不超过128个字符 + */ + private String title; + + /** + * 图文消息描述 + * 必填:是 + * 长度限制:不超过512个字符 + */ + private String description; + + /** + * 点击后跳转的链接 + * 必填:是 + * 格式要求:包含协议头(http/https) + * 长度限制:不超过2048字节 + */ + private String url; + + /** + * 图文消息配图的url + * 必填:否 + * 长度限制:不超过2048字节 + */ + private String picurl; +} \ No newline at end of file diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/qywx/api/response/NewsMessageResponse.java b/agileboot-domain/src/main/java/com/agileboot/domain/qywx/api/response/NewsMessageResponse.java new file mode 100644 index 0000000..e7f363d --- /dev/null +++ b/agileboot-domain/src/main/java/com/agileboot/domain/qywx/api/response/NewsMessageResponse.java @@ -0,0 +1,47 @@ +package com.agileboot.domain.qywx.api.response; + +import lombok.Data; + +@Data +public class NewsMessageResponse { + /** + * 返回码 + * 0表示成功,非0表示失败 + */ + private Integer errcode; + /** + * 错误信息 + * 成功返回"ok" + */ + private String errmsg; + /** + * 不合法的userid列表 + * 多个接收者用'|'分隔 + */ + private String invaliduser; + /** + * 不合法的部门id列表 + * 多个接收者用'|'分隔 + */ + private String invalidparty; + /** + * 不合法的标签id列表 + * 多个接收者用'|'分隔 + */ + private String invalidtag; + /** + * 没有基础接口许可的userid列表 + * 包含已过期的许可 + */ + private String unlicenseduser; + /** + * 消息id + * 用于撤回应用消息(72小时内有效) + */ + private String msgid; + /** + * 响应代码 + * 仅模板卡片消息返回,用于更新消息(72小时内有效) + */ + private String response_code; +} \ No newline at end of file diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/shop/approval/ReturnApprovalApplicationService.java b/agileboot-domain/src/main/java/com/agileboot/domain/shop/approval/ReturnApprovalApplicationService.java index d9f1cae..558b99c 100644 --- a/agileboot-domain/src/main/java/com/agileboot/domain/shop/approval/ReturnApprovalApplicationService.java +++ b/agileboot-domain/src/main/java/com/agileboot/domain/shop/approval/ReturnApprovalApplicationService.java @@ -12,6 +12,8 @@ import com.agileboot.domain.shop.approval.model.ReturnApprovalModel; import com.agileboot.domain.shop.approval.model.ReturnApprovalModelFactory; import com.agileboot.domain.shop.approval.query.SearchApiReturnApprovalQuery; import com.agileboot.domain.shop.approval.query.SearchReturnApprovalQuery; +import com.agileboot.domain.shop.goods.model.GoodsModel; +import com.agileboot.domain.shop.goods.model.GoodsModelFactory; import com.agileboot.domain.shop.order.db.ShopOrderGoodsEntity; import com.agileboot.domain.shop.order.model.OrderGoodsModel; import com.agileboot.domain.shop.order.model.OrderGoodsModelFactory; @@ -45,6 +47,7 @@ public class ReturnApprovalApplicationService { private final OrderGoodsModelFactory orderGoodsModelFactory; private final OrderModelFactory orderModelFactory; private final PaymentApplicationService paymentApplicationService; + private final GoodsModelFactory goodsModelFactory; /** * 获取退货审批列表 @@ -137,6 +140,7 @@ public class ReturnApprovalApplicationService { } } + // 更新审批状态为通过 model.validateApprovalStatus(); model.setAuditImages(command.getAuditImages()); model.setAuditRemark(command.getAuditRemark()); @@ -147,6 +151,11 @@ public class ReturnApprovalApplicationService { // 更新关联订单商品状态 orderGoodsModel.setStatus(2); // 6表示已完成退货 orderGoodsModel.updateById(); + + // 更新商品库存 + GoodsModel goodsModel = goodsModelFactory.loadById(orderGoodsModel.getGoodsId()); + goodsModel.setStock(goodsModel.getStock() + orderGoodsModel.getQuantity()); + goodsModel.updateById(); } /** diff --git a/doc/simpread-发送应用消息 - 文档 - 企业微信开发者中心.md b/doc/simpread-发送应用消息 - 文档 - 企业微信开发者中心.md new file mode 100644 index 0000000..5cff65b --- /dev/null +++ b/doc/simpread-发送应用消息 - 文档 - 企业微信开发者中心.md @@ -0,0 +1,947 @@ +> 本文由 [简悦 SimpRead](http://ksria.com/simpread/) 转码, 原文地址 [developer.work.weixin.qq.com](https://developer.work.weixin.qq.com/document/path/96458#%E5%9B%BE%E6%96%87%E6%B6%88%E6%81%AF) + +> 目录 + +目录 + +* [接口定义](#%E6%8E%A5%E5%8F%A3%E5%AE%9A%E4%B9%89) +* [消息类型](#%E6%B6%88%E6%81%AF%E7%B1%BB%E5%9E%8B) +*       [文本消息](#%E6%96%87%E6%9C%AC%E6%B6%88%E6%81%AF) +*       [图片消息](#%E5%9B%BE%E7%89%87%E6%B6%88%E6%81%AF) +*       [语音消息](#%E8%AF%AD%E9%9F%B3%E6%B6%88%E6%81%AF) +*       [视频消息](#%E8%A7%86%E9%A2%91%E6%B6%88%E6%81%AF) +*       [文件消息](#%E6%96%87%E4%BB%B6%E6%B6%88%E6%81%AF) +*       [文本卡片消息](#%E6%96%87%E6%9C%AC%E5%8D%A1%E7%89%87%E6%B6%88%E6%81%AF) +*       [图文消息](#%E5%9B%BE%E6%96%87%E6%B6%88%E6%81%AF) +*       [图文消息(mpnews)](#%E5%9B%BE%E6%96%87%E6%B6%88%E6%81%AF%EF%BC%88mpnews%EF%BC%89) +*       [markdown 消息](#markdown%E6%B6%88%E6%81%AF) +*       [小程序通知消息](#%E5%B0%8F%E7%A8%8B%E5%BA%8F%E9%80%9A%E7%9F%A5%E6%B6%88%E6%81%AF) +*       [模板卡片消息](#%E6%A8%A1%E6%9D%BF%E5%8D%A1%E7%89%87%E6%B6%88%E6%81%AF) +*             [文本通知型](#%E6%96%87%E6%9C%AC%E9%80%9A%E7%9F%A5%E5%9E%8B) +*             [图文展示型](#%E5%9B%BE%E6%96%87%E5%B1%95%E7%A4%BA%E5%9E%8B) +*             [按钮交互型](#%E6%8C%89%E9%92%AE%E4%BA%A4%E4%BA%92%E5%9E%8B) +*             [投票选择型](#%E6%8A%95%E7%A5%A8%E9%80%89%E6%8B%A9%E5%9E%8B) +*             [多项选择型](#%E5%A4%9A%E9%A1%B9%E9%80%89%E6%8B%A9%E5%9E%8B) +* [附录](#%E9%99%84%E5%BD%95) +*       [支持的 markdown 语法](#%E6%94%AF%E6%8C%81%E7%9A%84markdown%E8%AF%AD%E6%B3%95) +*       [id 转译说明](#id%E8%BD%AC%E8%AF%91%E8%AF%B4%E6%98%8E) + +[](#%E6%8E%A5%E5%8F%A3%E5%AE%9A%E4%B9%89)接口定义 +--------------------------------------------- + +应用支持推送文本、图片、视频、文件、图文等类型。 + +**请求方式:**POST(**HTTPS**) +**请求地址:** https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=ACCESS_TOKEN + +**参数说明:** + +
参数是否必须说明
access_token调用接口凭证
+ +> - 各个消息类型的具体 POST 格式请阅后续 “消息类型” 部分。 +> - 如果有在管理端对应用设置 “在微工作台中始终进入主页”,应用在微信端只能接收到文本消息,并且文本消息的长度限制为 20 字节,超过 20 字节会被截断。同时其他消息类型也会转换为文本消息,提示用户到企业微信查看。 +> - 支持 id 转译,将 userid / 部门 id 转成对应的用户名 / 部门名,在企业授权了会话内容存档接口权限时,也可以将消息 id 和群 id 转成对应的消息内容 / 群名称,目前仅**文本 / 文本卡片 / 图文 / 图文(mpnews)/ 任务卡片 / 小程序通知 / 模版消息 / 模板卡片消息**这八种消息类型的**部分字段**支持。具体支持的范围和语法,请查看附录 [id 转译说明](#10167/id%E8%BD%AC%E8%AF%91%E8%AF%B4%E6%98%8E)。 +> - 支持重复消息检查,当指定 `"enable_duplicate_check": 1`开启: 表示在一定时间间隔内,同样内容(请求 json)的消息,不会重复收到;时间间隔可通过`duplicate_check_interval`指定,默认`1800秒`。 +> - 从 2021 年 2 月 4 日开始,企业关联添加的「小程序」应用,也可以发送文本、图片、视频、文件、图文等各种类型的消息了。 +> **调用建议**:大部分企业应用在每小时的 0 分或 30 分触发推送消息,容易造成资源挤占,从而投递不够及时,建议尽量避开这两个时间点进行调用。 +> **频率限制**:每应用不可超过账号上限数 * 200 人次 / 天(注:若调用 api 一次发给 1000 人,算 1000 人次;若企业账号上限是 500 人,则每个应用每天可发送 100000 人次的消息)。每应用对同一个成员不可超过 30 次 / 分钟,1000 次 / 小时,超过部分会被丢弃不下发 + +**返回示例:** + +``` +{ + "errcode" : 0, + "errmsg" : "ok", + "invaliduser" : "userid1|userid2", + "invalidparty" : "partyid1|partyid2", + "invalidtag": "tagid1|tagid2", + "unlicenseduser" : "userid3|userid4", + "msgid": "xxxx", + "response_code": "xyzxyz" +} +``` + +> 如果部分接收人无权限或不存在,发送仍然执行,但会返回无效的部分(即 invaliduser 或 invalidparty 或 invalidtag 或 unlicenseduser),常见的原因是**接收人不在应用的可见范围内**。 +> 权限包含**应用可见范围**和**基础接口权限** (基础账号、互通账号均可),unlicenseduser 中的用户在应用可见范围内但没有基础接口权限。 +> 如果**全部**接收人无权限或不存在,则本次调用返回失败,errcode 为 81013。 +> 返回包中的 userid,不区分大小写,统一转为小写 + +**参数说明:** + +
参数说明
errcode返回码
errmsg对返回码的文本描述内容
invaliduser不合法的 userid,不区分大小写,统一转为小写
invalidparty不合法的 partyid
invalidtag不合法的标签 id
unlicenseduser没有基础接口许可 (包含已过期) 的 userid
msgid消息 id,用于撤回应用消息
response_code仅消息类型为 “按钮交互型”,“投票选择型” 和“多项选择型”的模板卡片消息返回,应用可使用 response_code 调用更新模版卡片消息接口,72 小时内有效,且只能使用一次
+ +[](#%E6%B6%88%E6%81%AF%E7%B1%BB%E5%9E%8B)消息类型 +--------------------------------------------- + +### [](#%E6%96%87%E6%9C%AC%E6%B6%88%E6%81%AF)文本消息 + +**请求示例:** + +``` +{ + "touser" : "UserID1|UserID2|UserID3", + "toparty" : "PartyID1|PartyID2", + "totag" : "TagID1 | TagID2", + "msgtype" : "text", + "agentid" : 1, + "text" : { + "content" : "你的快递已到,请携带工卡前往邮件中心领取。\n出发前可查看邮件中心视频实况,聪明避开排队。" + }, + "safe":0, + "enable_id_trans": 0, + "enable_duplicate_check": 0, + "duplicate_check_interval": 1800 +} +``` + +**参数说明:** + +
参数是否必须说明
touser指定接收消息的成员,成员 ID 列表(多个接收者用‘|’分隔,最多支持 1000 个)。
特殊情况:指定为 "@all",则向该企业应用的全部成员发送
toparty指定接收消息的部门,部门 ID 列表,多个接收者用‘|’分隔,最多支持 100 个。
当 touser 为 "@all" 时忽略本参数
totag指定接收消息的标签,标签 ID 列表,多个接收者用‘|’分隔,最多支持 100 个。
当 touser 为 "@all" 时忽略本参数
msgtype消息类型,此时固定为:text
agentid企业应用的 id,整型。企业内部开发,可在应用的设置页面查看;第三方服务商,可通过接口 获取企业授权信息 获取该参数值
content消息内容,最长不超过 2048 个字节,超过将截断(支持 id 转译)
safe表示是否是保密消息,0 表示可对外分享,1 表示不能分享且内容显示水印,默认为 0
enable_id_trans表示是否开启 id 转译,0 表示否,1 表示是,默认 0。
enable_duplicate_check表示是否开启重复消息检查,0 表示否,1 表示是,默认 0
duplicate_check_interval表示是否重复消息检查的时间间隔,默认 1800s,最大不超过 4 小时
+ +> touser、toparty、totag 不能同时为空,后面不再强调。 + +**文本消息展现:** +![](https://res.mail.qq.com/node/ww/wwopenmng/images/independent/doc/test_msg$5bc63c26.png) + +**特殊说明:** +其中 text 参数的 content 字段可以支持换行、以及 A 标签,即可打开自定义的网页(可参考以上示例代码)(注意:换行符请用转义过的 \ n) + +### [](#%E5%9B%BE%E7%89%87%E6%B6%88%E6%81%AF)图片消息 + +**请求示例:** + +``` +{ + "touser" : "UserID1|UserID2|UserID3", + "toparty" : "PartyID1|PartyID2", + "totag" : "TagID1 | TagID2", + "msgtype" : "image", + "agentid" : 1, + "image" : { + "media_id" : "MEDIA_ID" + }, + "safe":0, + "enable_duplicate_check": 0, + "duplicate_check_interval": 1800 +} +``` + +**请求参数:** + +
参数是否必须说明
touser成员 ID 列表(消息接收者,多个接收者用‘|’分隔,最多支持 1000 个)。特殊情况:指定为 @all,则向关注该企业应用的全部成员发送
toparty部门 ID 列表,多个接收者用‘|’分隔,最多支持 100 个。当 touser 为 @all 时忽略本参数
totag标签 ID 列表,多个接收者用‘|’分隔,最多支持 100 个。当 touser 为 @all 时忽略本参数
msgtype消息类型,此时固定为:image
agentid企业应用的 id,整型。企业内部开发,可在应用的设置页面查看;第三方服务商,可通过接口 获取企业授权信息 获取该参数值
media_id图片媒体文件 id,可以调用上传临时素材接口获取
safe表示是否是保密消息,0 表示可对外分享,1 表示不能分享且内容显示水印,默认为 0
enable_duplicate_check表示是否开启重复消息检查,0 表示否,1 表示是,默认 0
duplicate_check_interval表示是否重复消息检查的时间间隔,默认 1800s,最大不超过 4 小时
+ +### [](#%E8%AF%AD%E9%9F%B3%E6%B6%88%E6%81%AF)语音消息 + +**请求示例:** + +``` +{ + "touser" : "UserID1|UserID2|UserID3", + "toparty" : "PartyID1|PartyID2", + "totag" : "TagID1 | TagID2", + "msgtype" : "voice", + "agentid" : 1, + "voice" : { + "media_id" : "MEDIA_ID" + }, + "enable_duplicate_check": 0, + "duplicate_check_interval": 1800 +} +``` + +**参数说明:** + +
参数是否必须说明
touser成员 ID 列表(消息接收者,多个接收者用‘|’分隔,最多支持 1000 个)。特殊情况:指定为 @all,则向关注该企业应用的全部成员发送
toparty部门 ID 列表,多个接收者用‘|’分隔,最多支持 100 个。当 touser 为 @all 时忽略本参数
totag标签 ID 列表,多个接收者用‘|’分隔,最多支持 100 个。当 touser 为 @all 时忽略本参数
msgtype消息类型,此时固定为:voice
agentid企业应用的 id,整型。企业内部开发,可在应用的设置页面查看;第三方服务商,可通过接口 获取企业授权信息 获取该参数值
media_id语音文件 id,可以调用上传临时素材接口获取
enable_duplicate_check表示是否开启重复消息检查,0 表示否,1 表示是,默认 0
duplicate_check_interval表示是否重复消息检查的时间间隔,默认 1800s,最大不超过 4 小时
+ +### [](#%E8%A7%86%E9%A2%91%E6%B6%88%E6%81%AF)视频消息 + +**请求示例:** + +``` +{ + "touser" : "UserID1|UserID2|UserID3", + "toparty" : "PartyID1|PartyID2", + "totag" : "TagID1 | TagID2", + "msgtype" : "video", + "agentid" : 1, + "video" : { + "media_id" : "MEDIA_ID", + "title" : "Title", + "description" : "Description" + }, + "safe":0, + "enable_duplicate_check": 0, + "duplicate_check_interval": 1800 +} +``` + +**参数说明:** + +
参数是否必须说明
touser成员 ID 列表(消息接收者,多个接收者用‘|’分隔,最多支持 1000 个)。特殊情况:指定为 @all,则向关注该企业应用的全部成员发送
toparty部门 ID 列表,多个接收者用‘|’分隔,最多支持 100 个。当 touser 为 @all 时忽略本参数
totag标签 ID 列表,多个接收者用‘|’分隔,最多支持 100 个。当 touser 为 @all 时忽略本参数
msgtype消息类型,此时固定为:video
agentid企业应用的 id,整型。企业内部开发,可在应用的设置页面查看;第三方服务商,可通过接口 获取企业授权信息 获取该参数值
media_id视频媒体文件 id,可以调用上传临时素材接口获取
title视频消息的标题,不超过 128 个字节,超过会自动截断
description视频消息的描述,不超过 512 个字节,超过会自动截断
safe表示是否是保密消息,0 表示可对外分享,1 表示不能分享且内容显示水印,默认为 0
enable_duplicate_check表示是否开启重复消息检查,0 表示否,1 表示是,默认 0
duplicate_check_interval表示是否重复消息检查的时间间隔,默认 1800s,最大不超过 4 小时
+ + +**视频消息展现:** +![](https://p.qpic.cn/pic_wework/3478722865/9d9b75910515dfd9064947d1d95e8dd7892670895ddfc0f3/0) + +### [](#%E6%96%87%E4%BB%B6%E6%B6%88%E6%81%AF)文件消息 + +**请求示例:** + +``` +{ + "touser" : "UserID1|UserID2|UserID3", + "toparty" : "PartyID1|PartyID2", + "totag" : "TagID1 | TagID2", + "msgtype" : "file", + "agentid" : 1, + "file" : { + "media_id" : "1Yv-zXfHjSjU-7LH-GwtYqDGS-zz6w22KmWAT5COgP7o" + }, + "safe":0, + "enable_duplicate_check": 0, + "duplicate_check_interval": 1800 +} +``` + +**参数说明:** + +
参数是否必须说明
touser成员 ID 列表(消息接收者,多个接收者用‘|’分隔,最多支持 1000 个)。特殊情况:指定为 @all,则向关注该企业应用的全部成员发送
toparty部门 ID 列表,多个接收者用‘|’分隔,最多支持 100 个。当 touser 为 @all 时忽略本参数
totag标签 ID 列表,多个接收者用‘|’分隔,最多支持 100 个。当 touser 为 @all 时忽略本参数
msgtype消息类型,此时固定为:file
agentid企业应用的 id,整型。企业内部开发,可在应用的设置页面查看;第三方服务商,可通过接口 获取企业授权信息 获取该参数值
media_id文件 id,可以调用上传临时素材接口获取
safe表示是否是保密消息,0 表示可对外分享,1 表示不能分享且内容显示水印,默认为 0,保密消息支持以下格式文件: txt、pdf、doc、docx、ppt、pptx、xls、xlsx、xml、jpg、jpeg、png、bmp、gif
enable_duplicate_check表示是否开启重复消息检查,0 表示否,1 表示是,默认 0
duplicate_check_interval表示是否重复消息检查的时间间隔,默认 1800s,最大不超过 4 小时
+ + +**文件消息展现:** +![](https://res.mail.qq.com/node/ww/wwopenmng/images/independent/doc/filemsg.jpeg) + +### [](#%E6%96%87%E6%9C%AC%E5%8D%A1%E7%89%87%E6%B6%88%E6%81%AF)文本卡片消息 + +**请求示例:** + +``` +{ + "touser" : "UserID1|UserID2|UserID3", + "toparty" : "PartyID1 | PartyID2", + "totag" : "TagID1 | TagID2", + "msgtype" : "textcard", + "agentid" : 1, + "textcard" : { + "title" : "领奖通知", + "description" : "
2016年9月26日
恭喜你抽中iPhone 7一台,领奖码:xxxx
请于2016年10月10日前联系行政同事领取
", + "url" : "URL", + "btntxt":"更多" + }, + "enable_id_trans": 0, + "enable_duplicate_check": 0, + "duplicate_check_interval": 1800 +} +``` + +**参数说明:** + +
参数是否必须说明
touser成员 ID 列表(消息接收者,多个接收者用‘|’分隔,最多支持 1000 个)。特殊情况:指定为 @all,则向关注该企业应用的全部成员发送
toparty部门 ID 列表,多个接收者用‘|’分隔,最多支持 100 个。当 touser 为 @all 时忽略本参数
totag标签 ID 列表,多个接收者用‘|’分隔,最多支持 100 个。当 touser 为 @all 时忽略本参数
msgtype消息类型,此时固定为:textcard
agentid企业应用的 id,整型。企业内部开发,可在应用的设置页面查看;第三方服务商,可通过接口 获取企业授权信息 获取该参数值
title标题,不超过 128 个字符,超过会自动截断(支持 id 转译)
description描述,不超过 512 个字符,超过会自动截断(支持 id 转译)
url点击后跳转的链接。最长 2048 字节,请确保包含了协议头 (http/https)
btntxt按钮文字。 默认为 “详情”, 不超过 4 个文字,超过自动截断。
enable_id_trans表示是否开启 id 转译,0 表示否,1 表示是,默认 0
enable_duplicate_check表示是否开启重复消息检查,0 表示否,1 表示是,默认 0
duplicate_check_interval表示是否重复消息检查的时间间隔,默认 1800s,最大不超过 4 小时
+ +**文本卡片消息展现 :** +![](https://res.mail.qq.com/node/ww/wwopenmng/images/independent/doc/cardmsg.jpeg) + +**特殊说明**: +卡片消息的展现形式非常灵活,支持使用 br 标签或者空格来进行换行处理,也支持使用 div 标签来使用不同的字体颜色,目前内置了 3 种文字颜色:灰色 (gray)、高亮 (highlight)、默认黑色 (normal),将其作为 div 标签的 class 属性即可,具体用法请参考上面的示例。 + +### [](#%E5%9B%BE%E6%96%87%E6%B6%88%E6%81%AF)图文消息 + +**请求示例:** + +``` +{ + "touser" : "UserID1|UserID2|UserID3", + "toparty" : "PartyID1 | PartyID2", + "totag" : "TagID1 | TagID2", + "msgtype" : "news", + "agentid" : 1, + "news" : { + "articles" : [ + { + "title" : "中秋节礼品领取", + "description" : "今年中秋节公司有豪礼相送", + "url" : "URL", + "picurl" : "https://res.mail.qq.com/node/ww/wwopenmng/images/independent/doc/test_pic_msg1.png", + "appid": "wx123123123123123", + "pagepath": "pages/index?userid=zhangsan&orderid=123123123" + } + ] + }, + "enable_id_trans": 0, + "enable_duplicate_check": 0, + "duplicate_check_interval": 1800 +} +``` + +**参数说明:** + +
参数是否必须说明
touser成员 ID 列表(消息接收者,多个接收者用‘|’分隔,最多支持 1000 个)。特殊情况:指定为 @all,则向关注该企业应用的全部成员发送
toparty部门 ID 列表,多个接收者用‘|’分隔,最多支持 100 个。当 touser 为 @all 时忽略本参数
totag标签 ID 列表,多个接收者用‘|’分隔,最多支持 100 个。当 touser 为 @all 时忽略本参数
msgtype消息类型,此时固定为:news
agentid企业应用的 id,整型。企业内部开发,可在应用的设置页面查看;第三方服务商,可通过接口 获取企业授权信息 获取该参数值
articles图文消息,一个图文消息支持 1 到 8 条图文
title标题,不超过 128 个字节,超过会自动截断(支持 id 转译)
description描述,不超过 512 个字节,超过会自动截断(支持 id 转译)
url点击后跳转的链接。 最长 2048 字节,请确保包含了协议头 (http/https),小程序或者 url 必须填写一个
picurl图文消息的图片链接,最长 2048 字节,支持 JPG、PNG 格式,较好的效果为大图 1068*455,小图 150*150。
appid小程序 appid,必须是与当前应用关联的小程序,appid 和 pagepath 必须同时填写,填写后会忽略 url 字段
pagepath点击消息卡片后的小程序页面,最长 128 字节,仅限本小程序内的页面。appid 和 pagepath 必须同时填写,填写后会忽略 url 字段
enable_id_trans表示是否开启 id 转译,0 表示否,1 表示是,默认 0
enable_duplicate_check表示是否开启重复消息检查,0 表示否,1 表示是,默认 0
duplicate_check_interval表示是否重复消息检查的时间间隔,默认 1800s,最大不超过 4 小时
+ + +**图文消息展现:** +![](https://p.qpic.cn/pic_wework/3478722865/7a7c92760b2bd396e3b856a660f43c8b7db11271bddb3f34/0) + +### [](#%E5%9B%BE%E6%96%87%E6%B6%88%E6%81%AF%EF%BC%88mpnews%EF%BC%89)图文消息(mpnews) + +> mpnews 类型的图文消息,跟普通的图文消息一致,唯一的差异是图文内容存储在企业微信。 +> 多次发送 mpnews,会被认为是不同的图文,阅读、点赞的统计会被分开计算。 + +**请求示例:** + +``` +{ + "touser" : "UserID1|UserID2|UserID3", + "toparty" : "PartyID1 | PartyID2", + "totag": "TagID1 | TagID2", + "msgtype" : "mpnews", + "agentid" : 1, + "mpnews" : { + "articles":[ + { + "title": "Title", + "thumb_media_id": "MEDIA_ID", + "author": "Author", + "content_source_url": "URL", + "content": "Content", + "digest": "Digest description" + } + ] + }, + "safe":0, + "enable_id_trans": 0, + "enable_duplicate_check": 0, + "duplicate_check_interval": 1800 +} +``` + +**参数说明:** + +
参数是否必须说明
touser成员 ID 列表(消息接收者,多个接收者用‘|’分隔,最多支持 1000 个)。特殊情况:指定为 @all,则向关注该企业应用的全部成员发送
toparty部门 ID 列表,多个接收者用‘|’分隔,最多支持 100 个。当 touser 为 @all 时忽略本参数
totag标签 ID 列表,多个接收者用‘|’分隔,最多支持 100 个。当 touser 为 @all 时忽略本参数
msgtype消息类型,此时固定为:mpnews
agentid企业应用的 id,整型。企业内部开发,可在应用的设置页面查看;第三方服务商,可通过接口 获取企业授权信息 获取该参数值
articles图文消息,一个图文消息支持 1 到 8 条图文
title标题,不超过 128 个字节,超过会自动截断(支持 id 转译)
thumb_media_id图文消息缩略图的 media_id, 可以通过素材管理接口获得。此处 thumb_media_id 即上传接口返回的 media_id
author图文消息的作者,不超过 64 个字节
content_source_url图文消息点击 “阅读原文” 之后的页面链接
content图文消息的内容,支持 html 标签,不超过 666 K 个字节(支持 id 转译)
digest图文消息的描述,不超过 512 个字节,超过会自动截断(支持 id 转译)
safe表示是否是保密消息,0 表示可对外分享,1 表示不能分享且内容显示水印,2 表示仅限在企业内分享,默认为 0;注意仅 mpnews 类型的消息支持 safe 值为 2,其他消息类型不支持
enable_id_trans表示是否开启 id 转译,0 表示否,1 表示是,默认 0
enable_duplicate_check表示是否开启重复消息检查,0 表示否,1 表示是,默认 0
duplicate_check_interval表示是否重复消息检查的时间间隔,默认 1800s,最大不超过 4 小时
+ +### [](#markdown%E6%B6%88%E6%81%AF)markdown 消息 + +> 目前仅支持 [markdown 语法的子集](#10167/%E6%94%AF%E6%8C%81%E7%9A%84markdown%E8%AF%AD%E6%B3%95) +> 微工作台(原企业号)不支持展示 markdown 消息 + +**请求示例:** + +``` +{ + "touser" : "UserID1|UserID2|UserID3", + "toparty" : "PartyID1|PartyID2", + "totag" : "TagID1 | TagID2", + "msgtype": "markdown", + "agentid" : 1, + "markdown": { + "content": "您的会议室已经预定,稍后会同步到`邮箱` \n>**事项详情** \n>事 项:开会 \n>组织者:@miglioguan \n>参与者:@miglioguan、@kunliu、@jamdeezhou、@kanexiong、@kisonwang \n> \n>会议室:广州TIT 1楼 301 \n>日 期:2018年5月18日 \n>时 间:上午9:00-11:00 \n> \n>请准时参加会议。 \n> \n>如需修改会议信息,请点击:[修改会议信息](https://work.weixin.qq.com)" + }, + "enable_duplicate_check": 0, + "duplicate_check_interval": 1800 +} +``` + +**示例效果:** +![](https://p.qpic.cn/pic_wework/1114461239/dddbcdd097e5f308248cd7f99e0ebb336975267b9348c4ec/0) + +**参数说明:** + +
参数是否必须说明
touser成员 ID 列表(消息接收者,多个接收者用‘|’分隔,最多支持 1000 个)。特殊情况:指定为 @all,则向关注该企业应用的全部成员发送
toparty部门 ID 列表,多个接收者用‘|’分隔,最多支持 100 个。当 touser 为 @all 时忽略本参数
totag标签 ID 列表,多个接收者用‘|’分隔,最多支持 100 个。当 touser 为 @all 时忽略本参数
msgtype消息类型,此时固定为:markdown
agentid企业应用的 id,整型。企业内部开发,可在应用的设置页面查看;第三方服务商,可通过接口 获取企业授权信息 获取该参数值
contentmarkdown 内容,最长不超过 2048 个字节,必须是 utf8 编码
enable_duplicate_check表示是否开启重复消息检查,0 表示否,1 表示是,默认 0
duplicate_check_interval表示是否重复消息检查的时间间隔,默认 1800s,最大不超过 4 小时
+ +### [](#%E5%B0%8F%E7%A8%8B%E5%BA%8F%E9%80%9A%E7%9F%A5%E6%B6%88%E6%81%AF)小程序通知消息 + +> 小程序通知消息只允许绑定了小程序的应用发送,~之前,消息会通过统一的会话【小程序通知】发送给用户~。 +> 从 2019 年 6 月 28 日起,用户收到的小程序通知会出现在各个独立的应用中。 +> 不支持 @all 全员发送 +> 微工作台(原企业号)不支持展示小程序通知消息 + +**请求示例:** + +``` +{ + "touser" : "zhangsan|lisi", + "toparty": "1|2", + "totag": "1|2", + "msgtype" : "miniprogram_notice", + "miniprogram_notice" : { + "appid": "wx123123123123123", + "page": "pages/index?userid=zhangsan&orderid=123123123", + "title": "会议室预订成功通知", + "description": "4月27日 16:16", + "emphasis_first_item": true, + "content_item": [ + { + "key": "会议室", + "value": "402" + }, + { + "key": "会议地点", + "value": "广州TIT-402会议室" + }, + { + "key": "会议时间", + "value": "2018年8月1日 09:00-09:30" + }, + { + "key": "参与人员", + "value": "周剑轩" + } + ] + }, + "enable_id_trans": 0, + "enable_duplicate_check": 0, + "duplicate_check_interval": 1800 +} +``` + +**示例效果:** +![](https://p.qpic.cn/pic_wework/3478722865/c4c2b9c84342e6ef5f62bbace170e85d7a5c58779bc60fc4/0) + +**参数说明:** + +
参数是否必须说明
touser成员 ID 列表(消息接收者,多个接收者用‘|’分隔,最多支持 1000 个)
toparty部门 ID 列表,多个接收者用‘|’分隔,最多支持 100 个。
totag标签 ID 列表,多个接收者用‘|’分隔,最多支持 100 个。
msgtype消息类型,此时固定为:miniprogram_notice
appid小程序 appid,必须是与当前应用关联的小程序
page点击消息卡片后的小程序页面,最长 1024 个字节,仅限本小程序内的页面。该字段不填则消息点击后不跳转。
title消息标题,长度限制 4-12 个汉字(支持 id 转译)
description消息描述,长度限制 4-12 个汉字(支持 id 转译)
emphasis_first_item是否放大第一个 content_item
content_item消息内容键值对,最多允许 10 个 item
key长度 10 个汉字以内
value长度 30 个汉字以内(支持 id 转译)
key 和 value 两个字段同时为空时,该键值对将被忽略
enable_id_trans表示是否开启 id 转译,0 表示否,1 表示是,默认 0
enable_duplicate_check表示是否开启重复消息检查,0 表示否,1 表示是,默认 0
duplicate_check_interval表示是否重复消息检查的时间间隔,默认 1800s,最大不超过 4 小时
+ +### [](#%E6%A8%A1%E6%9D%BF%E5%8D%A1%E7%89%87%E6%B6%88%E6%81%AF)模板卡片消息 + +> 投票选择型和多项选择型卡片仅企业微信 3.1.12 及以上版本支持 +> 文本通知型、图文展示型和按钮交互型三种卡片仅企业微信 3.1.6 及以上版本支持(但附件下载功能仍需更新至 3.1.12) +> 微工作台(原企业号)不支持展示模板卡片消息 + +**3.1.18 版本新增** + +1. source 字段支持设置字体颜色 +2. horizontal_content_list 新增 type 3,代表点击跳转成员详情(仅企业微信 3.1.18 及以上版本支持) +3. 新增 action_menu(右上角菜单)(仅企业微信 3.1.18 及以上版本支持) +4. quote_area(引用样式)、image_text_area(左图右文样式)、button_selection(按钮型卡片的下拉框样式) 等字段 + +**特殊说明** + +1. 仅有 按钮交互型、投票选择型、多项选择型 以及填写了 action_menu 字段的文本通知型、图文展示型的卡片支持回调更新或通过接口更新卡片。 +2. 支持回调更新的卡片可支持用户点击触发交互事件,需要开发者设置的回调接口来处理回调事件,回调协议可见文档 [模板卡片事件推送](#12974/%E6%A8%A1%E6%9D%BF%E5%8D%A1%E7%89%87%E4%BA%8B%E4%BB%B6%E6%8E%A8%E9%80%81),注意 **没有配置回调接口的应用不可发送支持回调的卡片**。 +3. 开发者的服务收到回调事件后,需要根据协议返回相应的数据以更新卡片,对应的协议见文档 [更新模版卡片消息](#12975/%E6%A8%A1%E6%9D%BF%E5%8D%A1%E7%89%87%E6%9B%B4%E6%96%B0%E6%B6%88%E6%81%AF)。 +4. 此接口发送支持回调更新的卡片消息之后,返回的参数里会带上 response_code,可使用 response_code 调用[更新模版卡片消息](#32086)接口,**response_code 72 小时内有效,且只能调用一次接口**。 + +#### [](#%E6%96%87%E6%9C%AC%E9%80%9A%E7%9F%A5%E5%9E%8B)文本通知型 + +![](https://wework.qpic.cn/wwpic/235797_QOJtTyeUTBuAk_G_1632907465/0) + +``` +{ + "touser" : "UserID1|UserID2|UserID3", + "toparty" : "PartyID1 | PartyID2", + "totag" : "TagID1 | TagID2", + "msgtype" : "template_card", + "agentid" : 1, + "template_card" : { + "card_type" : "text_notice", + "source" : { + "icon_url": "图片的url", + "desc": "企业微信", + "desc_color": 1 + }, + "action_menu": { + "desc": "卡片副交互辅助文本说明", + "action_list": [ + {"text": "接受推送", "key": "A"}, + {"text": "不再推送", "key": "B"} + ] + }, + "task_id": "task_id", + "main_title" : { + "title" : "欢迎使用企业微信", + "desc" : "您的好友正在邀请您加入企业微信" + }, + "quote_area": { + "type": 1, + "url": "https://work.weixin.qq.com", + "title": "企业微信的引用样式", + "quote_text": "企业微信真好用呀真好用" + }, + "emphasis_content": { + "title": "100", + "desc": "核心数据" + }, + "sub_title_text" : "下载企业微信还能抢红包!", + "horizontal_content_list" : [ + { + "keyname": "邀请人", + "value": "张三" + }, + { + "type": 1, + "keyname": "企业微信官网", + "value": "点击访问", + "url": "https://work.weixin.qq.com" + }, + { + "type": 2, + "keyname": "企业微信下载", + "value": "企业微信.apk", + "media_id": "文件的media_id" + }, + { + "type": 3, + "keyname": "员工信息", + "value": "点击查看", + "userid": "zhangsan" + } + ], + "jump_list" : [ + { + "type": 1, + "title": "企业微信官网", + "url": "https://work.weixin.qq.com" + }, + { + "type": 2, + "title": "跳转小程序", + "appid": "小程序的appid", + "pagepath": "/index.html" + } + ], + "card_action": { + "type": 2, + "url": "https://work.weixin.qq.com", + "appid": "小程序的appid", + "pagepath": "/index.html" + } + }, + "enable_id_trans": 0, + "enable_duplicate_check": 0, + "duplicate_check_interval": 1800 +} +``` + +**参数说明:** + +
参数是否必须说明
touser成员 ID 列表(消息接收者,多个接收者用‘|’分隔,最多支持 1000 个)。特殊情况:指定为 @all,则向关注该企业应用的全部成员发送
toparty部门 ID 列表,多个接收者用‘|’分隔,最多支持 100 个。当 touser 为 @all 时忽略本参数
totag标签 ID 列表,多个接收者用‘|’分隔,最多支持 100 个。当 touser 为 @all 时忽略本参数
msgtype消息类型,此时固定为:template_card
agentid企业应用的 id,整型。企业内部开发,可在应用的设置页面查看;第三方服务商,可通过接口 获取企业授权信息 获取该参数值
card_type模板卡片类型,文本通知型卡片填写 "text_notice"
source卡片来源样式信息,不需要来源样式可不填写
source.icon_url来源图片的 url,来源图片的尺寸建议为 72*72
source.desc来源图片的描述,建议不超过 20 个字,(支持 id 转译)
source.desc_color来源文字的颜色,目前支持:0(默认) 灰色,1 黑色,2 红色,3 绿色
action_menu卡片右上角更多操作按钮
action_menu.desc更多操作界面的描述
action_menu.action_list操作列表,列表长度取值范围为 [1, 3]
action_menu.action_list.text操作的描述文案
action_menu.action_list.key操作 key 值,用户点击后,会产生回调事件将本参数作为 EventKey 返回,回调事件会带上该 key 值,最长支持 1024 字节,不可重复
main_title.title一级标题,建议不超过 36 个字,文本通知型卡片本字段非必填,但不可本字段和 sub_title_text 都不填,(支持 id 转译)
main_title.desc标题辅助信息,建议不超过 44 个字,(支持 id 转译)
quote_area引用文献样式
quote_area.type引用文献样式区域点击事件,0 或不填代表没有点击事件,1 代表跳转 url,2 代表跳转小程序
quote_area.url点击跳转的 url,quote_area.type 是 1 时必填
quote_area.appid点击跳转的小程序的 appid,必须是与当前应用关联的小程序,quote_area.type 是 2 时必填
quote_area.pagepath点击跳转的小程序的 pagepath,quote_area.type 是 2 时选填
quote_area.title引用文献样式的标题
quote_area.quote_text引用文献样式的引用文案
emphasis_content关键数据样式
emphasis_content.title关键数据样式的数据内容,建议不超过 14 个字
emphasis_content.desc关键数据样式的数据描述内容,建议不超过 22 个字
sub_title_text二级普通文本,建议不超过 160 个字,(支持 id 转译)
horizontal_content_list二级标题 + 文本列表,该字段可为空数组,但有数据的话需确认对应字段是否必填,列表长度不超过 6
horizontal_content_list.type链接类型,0 或不填代表不是链接,1 代表跳转 url,2 代表下载附件,3 代表点击跳转成员详情
horizontal_content_list.keyname二级标题,建议不超过 5 个字
horizontal_content_list.value二级文本,如果 horizontal_content_list.type 是 2,该字段代表文件名称(要包含文件类型),建议不超过 30 个字,(支持 id 转译)
horizontal_content_list.url链接跳转的 url,horizontal_content_list.type 是 1 时必填
horizontal_content_list.media_id附件的 media_id,horizontal_content_list.type 是 2 时必填
horizontal_content_list.userid成员详情的 userid,horizontal_content_list.type 是 3 时必填
jump_list跳转指引样式的列表,该字段可为空数组,但有数据的话需确认对应字段是否必填,列表长度不超过 3
jump_list.type跳转链接类型,0 或不填代表不是链接,1 代表跳转 url,2 代表跳转小程序
jump_list.title跳转链接样式的文案内容,建议不超过 18 个字
jump_list.url跳转链接的 url,jump_list.type 是 1 时必填
jump_list.appid跳转链接的小程序的 appid,必须是与当前应用关联的小程序,jump_list.type 是 2 时必填
jump_list.pagepath跳转链接的小程序的 pagepath,jump_list.type 是 2 时选填
card_action整体卡片的点击跳转事件,text_notice 必填本字段
card_action.type跳转事件类型,1 代表跳转 url,2 代表打开小程序。text_notice 卡片模版中该字段取值范围为 [1,2]
card_action.url跳转事件的 url,card_action.type 是 1 时必填
card_action.appid跳转事件的小程序的 appid,必须是与当前应用关联的小程序,card_action.type 是 2 时必填
card_action.pagepath跳转事件的小程序的 pagepath,card_action.type 是 2 时选填
task_id任务 id,同一个应用任务 id 不能重复,只能由数字、字母和 “_-@” 组成,最长 128 字节,填了 action_menu 字段的话本字段必填
enable_id_trans表示是否开启 id 转译,0 表示否,1 表示是,默认 0
enable_duplicate_check表示是否开启重复消息检查,0 表示否,1 表示是,默认 0
duplicate_check_interval表示是否重复消息检查的时间间隔,默认 1800s,最大不超过 4 小时
+ +#### [](#%E5%9B%BE%E6%96%87%E5%B1%95%E7%A4%BA%E5%9E%8B)图文展示型 + +![](https://wework.qpic.cn/wwpic/93182_HHrOrbdjTNW9ieM_1632907497/0) + +``` +{ + "touser" : "UserID1|UserID2|UserID3", + "toparty" : "PartyID1 | PartyID2", + "totag" : "TagID1 | TagID2", + "msgtype" : "template_card", + "agentid" : 1, + "template_card" : { + "card_type" : "news_notice", + "source" : { + "icon_url": "图片的url", + "desc": "企业微信", + "desc_color": 1 + }, + "action_menu": { + "desc": "卡片副交互辅助文本说明", + "action_list": [ + {"text": "接受推送", "key": "A"}, + {"text": "不再推送", "key": "B"} + ] + }, + "task_id": "task_id", + "main_title" : { + "title" : "欢迎使用企业微信", + "desc" : "您的好友正在邀请您加入企业微信" + }, + "quote_area": { + "type": 1, + "url": "https://work.weixin.qq.com", + "title": "企业微信的引用样式", + "quote_text": "企业微信真好用呀真好用" + }, + "image_text_area": { + "type": 1, + "url": "https://work.weixin.qq.com", + "title": "企业微信的左图右文样式", + "desc": "企业微信真好用呀真好用", + "image_url": "https://img.iplaysoft.com/wp-content/uploads/2019/free-images/free_stock_photo_2x.jpg" + }, + "card_image": { + "url": "图片的url", + "aspect_ratio": 1.3 + }, + "vertical_content_list": [ + { + "title": "惊喜红包等你来拿", + "desc": "下载企业微信还能抢红包!" + } + ], + "horizontal_content_list" : [ + { + "keyname": "邀请人", + "value": "张三" + }, + { + "type": 1, + "keyname": "企业微信官网", + "value": "点击访问", + "url": "https://work.weixin.qq.com" + }, + { + "type": 2, + "keyname": "企业微信下载", + "value": "企业微信.apk", + "media_id": "文件的media_id" + }, + { + "type": 3, + "keyname": "员工信息", + "value": "点击查看", + "userid": "zhangsan" + } + ], + "jump_list" : [ + { + "type": 1, + "title": "企业微信官网", + "url": "https://work.weixin.qq.com" + }, + { + "type": 2, + "title": "跳转小程序", + "appid": "小程序的appid", + "pagepath": "/index.html" + } + ], + "card_action": { + "type": 2, + "url": "https://work.weixin.qq.com", + "appid": "小程序的appid", + "pagepath": "/index.html" + } + }, + "enable_id_trans": 0, + "enable_duplicate_check": 0, + "duplicate_check_interval": 1800 +} +``` + +
参数是否必须说明
touser成员 ID 列表(消息接收者,多个接收者用‘|’分隔,最多支持 1000 个)。特殊情况:指定为 @all,则向关注该企业应用的全部成员发送
toparty部门 ID 列表,多个接收者用‘|’分隔,最多支持 100 个。当 touser 为 @all 时忽略本参数
totag标签 ID 列表,多个接收者用‘|’分隔,最多支持 100 个。当 touser 为 @all 时忽略本参数
msgtype消息类型,此时固定为:template_card
agentid企业应用的 id,整型。企业内部开发,可在应用的设置页面查看;第三方服务商,可通过接口 获取企业授权信息 获取该参数值
card_type模板卡片类型,图文展示型卡片此处填写 "news_notice"
source卡片来源样式信息,不需要来源样式可不填写
source.icon_url来源图片的 url,来源图片的尺寸建议为 72*72
source.desc来源图片的描述,建议不超过 20 个字,(支持 id 转译)
source.desc_color来源文字的颜色,目前支持:0(默认) 灰色,1 黑色,2 红色,3 绿色
action_menu卡片右上角更多操作按钮
action_menu.desc更多操作界面的描述
action_menu.action_list操作列表,列表长度取值范围为 [1, 3]
action_menu.action_list.text操作的描述文案
action_menu.action_list.key操作 key 值,用户点击后,会产生回调事件将本参数作为 EventKey 返回,回调事件会带上该 key 值,最长支持 1024 字节,不可重复
main_title.title一级标题,建议不超过 36 个字,(支持 id 转译)
main_title.desc标题辅助信息,建议不超过 44 个字,(支持 id 转译)
quote_area引用文献样式
quote_area.type引用文献样式区域点击事件,0 或不填代表没有点击事件,1 代表跳转 url,2 代表跳转小程序
quote_area.url点击跳转的 url,quote_area.type 是 1 时必填
quote_area.appid点击跳转的小程序的 appid,必须是与当前应用关联的小程序,quote_area.type 是 2 时必填
quote_area.pagepath点击跳转的小程序的 pagepath,quote_area.type 是 2 时选填
quote_area.title引用文献样式的标题
quote_area.quote_text引用文献样式的引用文案
image_text_area左图右文样式,news_notice 类型的卡片,card_image 和 image_text_area 两者必填一个字段,不可都不填
image_text_area.type左图右文样式区域点击事件,0 或不填代表没有点击事件,1 代表跳转 url,2 代表跳转小程序
image_text_area.url点击跳转的 url,image_text_area.type 是 1 时必填
image_text_area.appid点击跳转的小程序的 appid,必须是与当前应用关联的小程序,image_text_area.type 是 2 时必填
image_text_area.pagepath点击跳转的小程序的 pagepath,image_text_area.type 是 2 时选填
image_text_area.title左图右文样式的标题
image_text_area.desc左图右文样式的描述
image_text_area.image_url左图右文样式的图片 url
card_image图片样式,news_notice 类型的卡片,card_image 和 image_text_area 两者必填一个字段,不可都不填
card_image.url图片的 url
card_image.aspect_ratio图片的宽高比,宽高比要小于 2.25,大于 1.3,不填该参数默认 1.3
vertical_content_list卡片二级垂直内容,该字段可为空数组,但有数据的话需确认对应字段是否必填,列表长度不超过 4
vertical_content_list.title卡片二级标题,建议不超过 38 个字
vertical_content_list.desc二级普通文本,建议不超过 160 个字
horizontal_content_list二级标题 + 文本列表,该字段可为空数组,但有数据的话需确认对应字段是否必填,列表长度不超过 6
horizontal_content_list.type链接类型,0 或不填代表不是链接,1 代表跳转 url,2 代表下载附件,3 代表点击跳转成员详情
horizontal_content_list.keyname二级标题,建议不超过 5 个字
horizontal_content_list.value二级文本,如果 horizontal_content_list.type 是 2,该字段代表文件名称(要包含文件类型),建议不超过 30 个字,(支持 id 转译)
horizontal_content_list.url链接跳转的 url,horizontal_content_list.type 是 1 时必填
horizontal_content_list.media_id附件的 media_id,horizontal_content_list.type 是 2 时必填
horizontal_content_list.userid成员详情的 userid,horizontal_content_list.type 是 3 时必填
jump_list跳转指引样式的列表,该字段可为空数组,但有数据的话需确认对应字段是否必填,列表长度不超过 3
jump_list.type跳转链接类型,0 或不填代表不是链接,1 代表跳转 url,2 代表跳转小程序
jump_list.title跳转链接样式的文案内容,建议不超过 18 个字
jump_list.url跳转链接的 url,jump_list.type 是 1 时必填
jump_list.appid跳转链接的小程序的 appid,必须是与当前应用关联的小程序,jump_list.type 是 2 时必填
jump_list.pagepath跳转链接的小程序的 pagepath,jump_list.type 是 2 时选填
card_action整体卡片的点击跳转事件,news_notice 必填本字段
card_action.type跳转事件类型,1 代表跳转 url,2 代表打开小程序。news_notice 卡片模版中该字段取值范围为 [1,2]
card_action.url跳转事件的 url,card_action.type 是 1 时必填
card_action.appid跳转事件的小程序的 appid,必须是与当前应用关联的小程序,card_action.type 是 2 时必填
card_action.pagepath跳转事件的小程序的 pagepath,card_action.type 是 2 时选填
task_id任务 id,同一个应用任务 id 不能重复,只能由数字、字母和 “_-@” 组成,最长 128 字节,填了 action_menu 字段的话本字段必填
enable_id_trans表示是否开启 id 转译,0 表示否,1 表示是,默认 0
enable_duplicate_check表示是否开启重复消息检查,0 表示否,1 表示是,默认 0
duplicate_check_interval表示是否重复消息检查的时间间隔,默认 1800s,最大不超过 4 小时
+ +#### [](#%E6%8C%89%E9%92%AE%E4%BA%A4%E4%BA%92%E5%9E%8B)按钮交互型 + +![](https://wework.qpic.cn/wwpic/102736_wYaFgfHsRIOPzL1_1632907528/0) + +``` +{ + "touser" : "UserID1|UserID2|UserID3", + "toparty" : "PartyID1 | PartyID2", + "totag" : "TagID1 | TagID2", + "msgtype" : "template_card", + "agentid" : 1, + "template_card" : { + "card_type" : "button_interaction", + "source" : { + "icon_url": "图片的url", + "desc": "企业微信", + "desc_color": 1 + }, + "action_menu": { + "desc": "卡片副交互辅助文本说明", + "action_list": [ + {"text": "接受推送", "key": "A"}, + {"text": "不再推送", "key": "B"} + ] + }, + "main_title" : { + "title" : "欢迎使用企业微信", + "desc" : "您的好友正在邀请您加入企业微信" + }, + "quote_area": { + "type": 1, + "url": "https://work.weixin.qq.com", + "title": "企业微信的引用样式", + "quote_text": "企业微信真好用呀真好用" + }, + "sub_title_text" : "下载企业微信还能抢红包!", + "horizontal_content_list" : [ + { + "keyname": "邀请人", + "value": "张三" + }, + { + "type": 1, + "keyname": "企业微信官网", + "value": "点击访问", + "url": "https://work.weixin.qq.com" + }, + { + "type": 2, + "keyname": "企业微信下载", + "value": "企业微信.apk", + "media_id": "文件的media_id" + }, + { + "type": 3, + "keyname": "员工信息", + "value": "点击查看", + "userid": "zhangsan" + } + ], + "card_action": { + "type": 2, + "url": "https://work.weixin.qq.com", + "appid": "小程序的appid", + "pagepath": "/index.html" + }, + "task_id": "task_id", + "button_selection": { + "question_key": "btn_question_key1", + "title": "企业微信评分", + "option_list": [ + { + "id": "btn_selection_id1", + "text": "100分" + }, + { + "id": "btn_selection_id2", + "text": "101分" + } + ], + "selected_id": "btn_selection_id1" + }, + "button_list": [ + { + "text": "按钮1", + "style": 1, + "key": "button_key_1" + }, + { + "text": "按钮2", + "style": 2, + "key": "button_key_2" + } + ] + }, + "enable_id_trans": 0, + "enable_duplicate_check": 0, + "duplicate_check_interval": 1800 +} +``` + +
参数是否必须说明
touser成员 ID 列表(消息接收者,多个接收者用‘|’分隔,最多支持 1000 个)。特殊情况:指定为 @all,则向关注该企业应用的全部成员发送
toparty部门 ID 列表,多个接收者用‘|’分隔,最多支持 100 个。当 touser 为 @all 时忽略本参数
totag标签 ID 列表,多个接收者用‘|’分隔,最多支持 100 个。当 touser 为 @all 时忽略本参数
msgtype消息类型,此时固定为:template_card
agentid企业应用的 id,整型。企业内部开发,可在应用的设置页面查看;第三方服务商,可通过接口 获取企业授权信息 获取该参数值
card_type模板卡片类型,按钮交互型卡片填写 "button_interaction"
source卡片来源样式信息,不需要来源样式可不填写
source.icon_url来源图片的 url,来源图片的尺寸建议为 72*72
source.desc来源图片的描述,建议不超过 20 个字,(支持 id 转译)
source.desc_color来源文字的颜色,目前支持:0(默认) 灰色,1 黑色,2 红色,3 绿色
action_menu卡片右上角更多操作按钮
action_menu.desc更多操作界面的描述
action_menu.action_list操作列表,列表长度取值范围为 [1, 3]
action_menu.action_list.text操作的描述文案
action_menu.action_list.key操作 key 值,用户点击后,会产生回调事件将本参数作为 EventKey 返回,回调事件会带上该 key 值,最长支持 1024 字节,不可重复
main_title.title一级标题,建议不超过 36 个字,(支持 id 转译)
main_title.desc标题辅助信息,建议不超过 44 个字,(支持 id 转译)
quote_area引用文献样式
quote_area.type引用文献样式区域点击事件,0 或不填代表没有点击事件,1 代表跳转 url,2 代表跳转小程序
quote_area.url点击跳转的 url,quote_area.type 是 1 时必填
quote_area.appid点击跳转的小程序的 appid,必须是与当前应用关联的小程序,quote_area.type 是 2 时必填
quote_area.pagepath点击跳转的小程序的 pagepath,quote_area.type 是 2 时选填
quote_area.title引用文献样式的标题
quote_area.quote_text引用文献样式的引用文案
sub_title_text二级普通文本,建议不超过 160 个字,(支持 id 转译)
horizontal_content_list二级标题 + 文本列表,该字段可为空数组,但有数据的话需确认对应字段是否必填,列表长度不超过 6
horizontal_content_list.type链接类型,0 或不填代表不是链接,1 代表跳转 url,2 代表下载附件,3 代表点击跳转成员详情
horizontal_content_list.keyname二级标题,建议不超过 5 个字
horizontal_content_list.value二级文本,如果 horizontal_content_list.type 是 2,该字段代表文件名称(要包含文件类型),建议不超过 30 个字,(支持 id 转译)
horizontal_content_list.url链接跳转的 url,horizontal_content_list.type 是 1 时必填
horizontal_content_list.media_id附件的 media_id,horizontal_content_list.type 是 2 时必填
horizontal_content_list.userid成员详情的 userid,horizontal_content_list.type 是 3 时必填
card_action整体卡片的点击跳转事件
card_action.type跳转事件类型,0 或不填代表不是链接,1 代表跳转 url,2 代表打开小程序
card_action.url跳转事件的 url,card_action.type 是 1 时必填
card_action.appid跳转事件的小程序的 appid,必须是与当前应用关联的小程序,card_action.type 是 2 时必填
card_action.pagepath跳转事件的小程序的 pagepath,card_action.type 是 2 时选填
task_id任务 id,同一个应用任务 id 不能重复,只能由数字、字母和 “_-@” 组成,最长 128 字节
button_selection.question_key下拉式的选择器的 key,用户提交选项后,会产生回调事件,回调事件会带上该 key 值表示该题,最长支持 1024 字节
button_selection.title下拉式的选择器左边的标题
button_selection.option_list选项列表,下拉选项不超过 10 个,最少 1 个
button_selection.selected_id默认选定的 id,不填或错填默认第一个
button_selection.option_list.id下拉式的选择器选项的 id,用户提交后,会产生回调事件,回调事件会带上该 id 值表示该选项,最长支持 128 字节,不可重复
button_selection.option_list.text下拉式的选择器选项的文案,建议不超过 16 个字
button_list按钮列表,列表长度不超过 6
button_list.type按钮点击事件类型,0 或不填代表回调点击事件,1 代表跳转 url
button_list.text按钮文案,建议不超过 10 个字
button_list.style按钮样式,目前可填 1~4,不填或错填默认 1
button_list.key按钮 key 值,用户点击后,会产生回调事件将本参数作为 EventKey 返回,回调事件会带上该 key 值,最长支持 1024 字节,不可重复,button_list.type 是 0 时必填
button_list.url跳转事件的 url,button_list.type 是 1 时必填
+ +备注: +按钮样式 + +![](https://wework.qpic.cn/wwpic/805842_iKxTyYPiRBamTcX_1628665323/0) + +#### [](#%E6%8A%95%E7%A5%A8%E9%80%89%E6%8B%A9%E5%9E%8B)投票选择型 + +![](https://wework.qpic.cn/wwpic/822424_UiGowMtcSD-EyEq_1628758117/0) + +``` +{ + "touser" : "UserID1|UserID2|UserID3", + "toparty" : "PartyID1 | PartyID2", + "totag" : "TagID1 | TagID2", + "msgtype" : "template_card", + "agentid" : 1, + "template_card" : { + "card_type" : "vote_interaction", + "source" : { + "icon_url": "图片的url", + "desc": "企业微信" + }, + "main_title" : { + "title" : "欢迎使用企业微信", + "desc" : "您的好友正在邀请您加入企业微信" + }, + "task_id": "task_id", + "checkbox": { + "question_key": "question_key1", + "option_list": [ + { + "id": "option_id1", + "text": "选择题选项1", + "is_checked": true + }, + { + "id": "option_id2", + "text": "选择题选项2", + "is_checked": false + } + ], + "mode": 1 + }, + "submit_button": { + "text": "提交", + "key": "key" + } + }, + "enable_id_trans": 0, + "enable_duplicate_check": 0, + "duplicate_check_interval": 1800 +} +``` + +**参数说明:** + +
参数是否必须说明
touser成员 ID 列表(消息接收者,多个接收者用‘|’分隔,最多支持 1000 个)。特殊情况:指定为 @all,则向关注该企业应用的全部成员发送
toparty部门 ID 列表,多个接收者用‘|’分隔,最多支持 100 个。当 touser 为 @all 时忽略本参数
totag标签 ID 列表,多个接收者用‘|’分隔,最多支持 100 个。当 touser 为 @all 时忽略本参数
msgtype消息类型,此时固定为:template_card
agentid企业应用的 id,整型。企业内部开发,可在应用的设置页面查看;第三方服务商,可通过接口 获取企业授权信息 获取该参数值
card_type模板卡片类型,投票选择型卡片填写 "vote_interaction"
source卡片来源样式信息,不需要来源样式可不填写
source.icon_url来源图片的 url,来源图片的尺寸建议为 72*72
source.desc来源图片的描述,建议不超过 20 个字,(支持 id 转译)
main_title.title一级标题,建议不超过 16 个字,(支持 id 转译)
main_title.desc二级普通文本,建议不超过 160 个字,(支持 id 转译)
task_id任务 id,同一个应用任务 id 不能重复,只能由数字、字母和 “_-@” 组成,最长 128 字节
checkbox选择题样式
checkbox.question_key选择题 key 值,用户提交选项后,会产生回调事件,回调事件会带上该 key 值表示该题,最长支持 1024 字节
checkbox.mode选择题模式,单选:0,多选:1,不填默认 0
checkbox.option_list选项 list,选项个数不超过 20 个,最少 1 个
checkbox.option_list.id选项 id,用户提交选项后,会产生回调事件,回调事件会带上该 id 值表示该选项,最长支持 128 字节,不可重复
checkbox.option_list.text选项文案描述,建议不超过 17 个字
checkbox.option_list.is_checked该选项是否要默认选中
submit_button提交按钮样式
submit_button.text按钮文案,建议不超过 10 个字,不填默认为提交
submit_button.key提交按钮的 key,会产生回调事件将本参数作为 EventKey 返回,最长支持 1024 字节
enable_id_trans表示是否开启 id 转译,0 表示否,1 表示是,默认 0
enable_duplicate_check表示是否开启重复消息检查,0 表示否,1 表示是,默认 0
duplicate_check_interval表示是否重复消息检查的时间间隔,默认 1800s,最大不超过 4 小时
+ +#### [](#%E5%A4%9A%E9%A1%B9%E9%80%89%E6%8B%A9%E5%9E%8B)多项选择型 + +![](https://wework.qpic.cn/wwpic/977007_JDisThiPRXam-GG_1628758163/0) + +``` +{ + "touser" : "UserID1|UserID2|UserID3", + "toparty" : "PartyID1 | PartyID2", + "totag" : "TagID1 | TagID2", + "msgtype" : "template_card", + "agentid" : 1, + "template_card" : { + "card_type" : "multiple_interaction", + "source" : { + "icon_url": "图片的url", + "desc": "企业微信" + }, + "main_title" : { + "title" : "欢迎使用企业微信", + "desc" : "您的好友正在邀请您加入企业微信" + }, + "task_id": "task_id", + "select_list": [ + { + "question_key": "question_key1", + "title": "选择器标签1", + "selected_id": "selection_id1", + "option_list": [ + { + "id": "selection_id1", + "text": "选择器选项1" + }, + { + "id": "selection_id2", + "text": "选择器选项2" + } + ] + }, + { + "question_key": "question_key2", + "title": "选择器标签2", + "selected_id": "selection_id3", + "option_list": [ + { + "id": "selection_id3", + "text": "选择器选项3" + }, + { + "id": "selection_id4", + "text": "选择器选项4" + } + ] + } + ], + "submit_button": { + "text": "提交", + "key": "key" + } + }, + "enable_id_trans": 0, + "enable_duplicate_check": 0, + "duplicate_check_interval": 1800 +} +``` + +**参数说明:** + +
参数是否必须说明
touser成员 ID 列表(消息接收者,多个接收者用‘|’分隔,最多支持 1000 个)。特殊情况:指定为 @all,则向关注该企业应用的全部成员发送
toparty部门 ID 列表,多个接收者用‘|’分隔,最多支持 100 个。当 touser 为 @all 时忽略本参数
totag标签 ID 列表,多个接收者用‘|’分隔,最多支持 100 个。当 touser 为 @all 时忽略本参数
msgtype消息类型,此时固定为:template_card
agentid企业应用的 id,整型。企业内部开发,可在应用的设置页面查看;第三方服务商,可通过接口 获取企业授权信息 获取该参数值
card_type模板卡片类型,多项选择型卡片填写 "multiple_interaction"
source卡片来源样式信息,不需要来源样式可不填写
source.icon_url来源图片的 url,来源图片的尺寸建议为 72*72
source.desc来源图片的描述,建议不超过 20 个字,(支持 id 转译)
main_title.title一级标题,建议不超过 36 个字,(支持 id 转译)
main_title.desc标题辅助信息,建议不超过 160 个字,(支持 id 转译)
task_id任务 id,同一个应用任务 id 不能重复,只能由数字、字母和 “_-@” 组成,最长 128 字节
select_list下拉式的选择器列表,multiple_interaction 类型的卡片该字段不可为空,一个消息最多支持 3 个选择器
select_list.question_key下拉式的选择器题目的 key,用户提交选项后,会产生回调事件,回调事件会带上该 key 值表示该题,最长支持 1024 字节,不可重复
select_list.title下拉式的选择器上面的 title
select_list.option_list选项列表,下拉选项不超过 10 个,最少 1 个
select_list.selected_id默认选定的 id,不填或错填默认第一个
select_list.option_list.id下拉式的选择器选项的 id,用户提交选项后,会产生回调事件,回调事件会带上该 id 值表示该选项,最长支持 128 字节,不可重复
select_list.option_list.text下拉式的选择器选项的文案,建议不超过 16 个字
submit_button提交按钮样式
submit_button.text按钮文案,建议不超过 10 个字,不填默认为提交
submit_button.key提交按钮的 key,会产生回调事件将本参数作为 EventKey 返回,最长支持 1024 字节
enable_id_trans表示是否开启 id 转译,0 表示否,1 表示是,默认 0
enable_duplicate_check表示是否开启重复消息检查,0 表示否,1 表示是,默认 0
duplicate_check_interval表示是否重复消息检查的时间间隔,默认 1800s,最大不超过 4 小时
+ +[](#%E9%99%84%E5%BD%95)附录 +------------------------- + +### [](#%E6%94%AF%E6%8C%81%E7%9A%84markdown%E8%AF%AD%E6%B3%95)支持的 markdown 语法 + +目前应用消息中支持的 markdown 语法是如下的子集: + +1. 标题 (支持 1 至 6 级标题,注意 #与文字中间要有空格) + + ``` + # 标题一 + ## 标题二 + ### 标题三 + #### 标题四 + ##### 标题五 + ###### 标题六 + ``` + +2. 加粗 + +3. 链接 + + ``` + **bold** + ``` + +4. 行内代码段(暂不支持跨行) + +5. 引用 + +6. 字体颜色 (只支持 3 种内置颜色) + + ``` + [这是一个链接](http://work.weixin.qq.com/api/doc) + ``` + + +### [](#id%E8%BD%AC%E8%AF%91%E8%AF%B4%E6%98%8E)id 转译说明 + +1. 支持的消息类型和对应的字段 + +
消息类型支持字段
文本(text)content
文本卡片(textcard)title、description
图文(news)title、description
图文(mpnews)title、digest、content
小程序通知(miniprogram_notice)title、description、content_item.value
模版消息(template_msg)value
模板卡片消息(template_card)source.desc、main_title.title、main_title.desc、sub_title_text、horizontal_content_list.value
+ +2.id 转译模版语法 + +``` +`code` +``` + +其中 DEPARTMENT_ID 是数字类型的部门 id,USERID 是[成员账号](#14953/userid)。 +譬如, +将`$departmentName=1$`替换成部门 id 为`1`对应的部门名,如 “企业微信部”; +将`$userName=lisi007$`替换成 userid 为`lisi007`对应的用户姓名,如 “李四”; +将`$userAlias=lisi007$`替换成 userid 为`lisi007`对应的用户别名,如 “lisi”; +将`$userAliasOrName=lisi007$`替换成 userid 为`lisi007`对应的用户别名或姓名,别名优先级高于姓名,如 "lisi"。 + +> 若输入的模板不符合语法、不在权限范围内或无效的 userid 或者部门 ID,则不替换该项内容,保留原样 +> 转译 userAlias 时,如果用户没有别名,则不替换该项内容,保留原样 +> 转译 userAliasOrName 时,如果用户有别名,则替换为别名;否则,将替换为姓名 + +在**企业授权了会话内容存档接口权限**时,也支持转译消息内容和群聊名称,语法如下: + +``` +> 引用文字 +``` + +* CHATID 是群聊 ID,MSGID 是消息 ID,SECRET-KEY 是[获取会话记录](#42660/%E8%8E%B7%E5%8F%96%E4%BC%9A%E8%AF%9D%E8%AE%B0%E5%BD%95)接口返回的这条消息对应的 encrypted_secretkey 字段进行解密得到,参考 [encrypt_secretkey 解密方式](#51799)。 + +* EXTERNAL_USERID 是客户的 ID。若是企业客户填:externalUserId + 若是客户群的外部成员填:chatid/externalUserId,例如:wraaaabbbb/wmccccdddd。若当前企业为 K12 教育行业,externalUserId 在家校通讯录中,则会转译为家长或者学生的名称。 + +譬如, +将`$chatName=xxxxx$`替换成群聊 ID 为`xxxxx`对应的群聊名称; +将`$msgContent=xxxxx/yyyyyy$`替换成消息 ID 为`xxxxx`对应的消息内容,其中[获取会话记录](#42660/%E8%8E%B7%E5%8F%96%E4%BC%9A%E8%AF%9D%E8%AE%B0%E5%BD%95)接口返回的这条消息对应的 encrypted_secretkey 字段进行解密得到的密钥为`yyyyyy`; +将 `$externalUserName=xxxxx$` 替换成客户 ID 为 `xxxxx` 对应的客户名称;如果当前企业是 K12 教育行业,客户 ID 为家长或者学生的 externalUserId,则展示家长或者学生的名称,若非家长或者学生,则展示 “非学校家长”。若员工对客户有设置备注名,则展示 “备注名 (名称)”;若名称和备注名一致时仅展示 “备注名”;多个员工给客户有备注的,展示最早添加的员工给客户的备注。 + +> 若输入的模板不符合语法、群聊 ID 无效、消息 ID 无效或对应的密钥不正确,则不替换该项内容,保留原样 +> 当企业没有授权会话内容存档接口权限是,也不替换该项内容,保留原样 +> 为防止意外泄漏,消息 ID 转译失败的情况下,将只会展示 MSGID 部分的内容,SECRET-KEY 部分的内容不会展示 + +群聊 ID +支持转译内部群和外部群的名称; +不包括单聊; +对于无名称的企业内部群聊,展示为`未命名内部群`; +对于无名称的企业客户群聊,展示为`未命名客户群`; +对于非企业客户群,展示为`非企业客户群`。 + +消息 ID + +
消息类型对应转译结果
文本消息文本消息的内容
图片消息[图片]
Markdown 消息Markdown 消息的文本内容
图文混排消息文本的内容,涉及到其他类型的部分用消息类型名称代替,如[图片]
其他展示对应的消息类型名称,如[小程序][红包消息]
+ +> 其他特殊情况转译结果说明: +> 企微后台系统失败 -> 消息获取失败 +> msgid 不存在或者过期 -> 消息已过期,消息内容无法展示 +> SECRET-KEY 错误 -> 消息密钥错误 \ No newline at end of file