

系统通过api与企业微信进行对接,可实现系统数据与企业微信上进行数据交互。
本次教程以订单的提交效果做示例。
审核通过:
审核拒绝:
首先需要系统集成企业微信,按照提示进行。
2.集成之后,需要在系统上做出系统用户与企业微信号进行绑定的效果,本次示例不再进行说明,绑定企业微信id教程:https://www.bnocode.com/scene/API_15.html
3.在API对接模块中,选择企业微信API(第三方)进行添加企业微信请求API,添加完后进行参数的配置。
新建API:
参数配置:
API请求代码示例:
async function run($input, $output, $modules = modules) {
/**发送应用文本消息
* 官方API:https://work.weixin.qq.com/api/doc/90000/90135/90236
* 错误码查询工具:https://open.work.weixin.qq.com/devtool/query?e=
*
* touser、toparty、totag不能同时为空
*/
const wxworkThirdApi = $modules.wxworkThirdApi;
let agentid = await wxworkThirdApi.getAgentId();
let touser = $input.touser;
let title = $input.title;//任务标题
let sub_title_text = $input.sub_title_text;
let task_id = $input.task_id;
let data = {
touser: touser,
// "toparty":
// "totag":
msgtype: "template_card",
agentid:agentid,
template_card: {
card_type: "button_interaction",
main_title: {
title: title,
},
sub_title_text: sub_title_text,
task_id: task_id,
button_list: [
{
text: "拒绝",
style: 3,
key: "reject"
},
{
text: "通过",
style: 1,
key: "approve"
}
]
},
};
//发送
let task_card_message = await wxworkThirdApi.request({
method: "post",
url: "message/send",
data
});
/**
* 如果部分接收人无权限或不存在,发送仍然执行,但会返回无效的部分(即invaliduser或invalidparty或invalidtag),常见的原因是接收人不在应用的可见范围内。
* 如果全部接收人无权限或不存在,则本次调用返回失败,errcode为81013。
* 返回包中的userid,不区分大小写,统一转为小写
*/
$output.request= data;
$output.res = task_card_message.response_code;
}
4.在上面的基础上,再新建一个API,并确保该api为开启状态。用于接收到回调数据后,更新推送的交互消息按钮状态。
API请求代码示例:
async function run($input, $output, $modules = modules) {
const wxworkThirdApi = $modules.wxworkThirdApi;
let agentid = await wxworkThirdApi.getAgentId();
let data = {
//userids: [$input.userids],
atall:1,//更新整个任务接收人员,0为不更新,1为更新全部
agentid,
task_id: $input.task_id,
response_code: $input.responseCode,
button: {
replace_name: $input.replace_name,
}
};
let res = await wxworkThirdApi.request({
method: "post",
url: "message/update_template_card",
data
});
$output.request = data;
$output.res = res;
}
5.订单的数据表中,需要加上两个字段,用于存放该订单请求的对应请求task_id和response_code。其中task_id为发送API请求的必须参数,这边建议可直接用系统的订单数据id来做task_id。新建一个“发送交互消息”功能,传递必要的参数。后面在订单新增的时候调用该功能。
数据处理步骤:
代码参照:
async function runProcess($model = model, $plugin = plugin, $params = params) {
let list = $params.list;
let order = $params.order;
let user = $params.user;
let cust = order["_612f0388a7b86f0d632c6ccc"];
let course = order["_612f0388a7b86f0d632c6ccd"];
let total = order["612f0388a7b86f0d632c6cce"];//商品价格
let preferential_amount = order["612f0388a7b86f0d632c6ccf"];//优惠金额
let final_amount = order["612f0388a7b86f0d632c6cd0"];//最终金额
let date = $plugin.moment().format("YYYY-MM-DD")
let time = new Date().getTime();//当前时间戳
let wxworkid = list.map(id => id["612f49359025b63cac3102c4"]) //获取到要接收到消息的用户企业微信idList
let idList = wxworkid.filter(function (id) {//企业微信id去空值
return id != null
})
let newidList = idList.join("|");
let sub_title_text =
`客户:${cust} \n课程包:${course}\n商品价格:${total}\n优惠金额:${preferential_amount}\n最终金额:${final_amount}\n创建日期:${date}`
$model.output["sub_title_text"] = sub_title_text;
$model.output["wxworkid"] = newidList
$model.output["task_id"] = `DD_${order._id}_${time}`
$model.output["title"] = `${user}的订单申请`
}
该功能做好后,在新增订单功能中,调用本功能。
调用步骤示例:
示例代码:
async function runProcess($model = model,$plugin = plugin,$params = params){
await $plugin.program.exec("6141623a841ce71ef89fa745",{//调用发送交互型消息通知功能,功能id
"61416240e87b7e1ee12f4a6e":$params.order //调用发送交互型消息通知功能的选择订单步骤id
})
}
6.新建一个“订单审核”功能,用于企业微信交互消息审核结果回调,更新该消息的按钮状态、订单的审核状态。
7.添加一个webhook并确保该api为开启状态,用于接收任务推送后审批结果回调,并进行处理。
数据回调示例代码:
async function hook($input = {}, $output = {}, $modules = modules) {
//通讯录回调:https://work.weixin.qq.com/api/doc/90000/90135/90967
//外部联系回调:https://work.weixin.qq.com/api/doc/90000/90135/92129
//OA审批回调:https://work.weixin.qq.com/api/doc/90000/90135/91815
//get 请求用于验证有效性
//将数据解密并转换成json
let data = $input;
if (data.Event == "change_contact" && data.ChangeType == "create_party") {
//TODO 处理添加部门事件
} else if (
data.Event == "change_contact" &&
data.ChangeType == "update_party"
) {
//TODO 处理修改部门事件
} else if (
data.Event == "change_contact" &&
data.ChangeType == "delete_party"
) {
//TODO 处理删除部门事件
} else if (
data.Event == "change_contact" &&
data.ChangeType == "create_user"
) {
//TODO 处理添加成员事件
} else if (
data.Event == "change_contact" &&
data.ChangeType == "update_user"
) {
//TODO 处理修改成员事件
} else if (
data.Event == "change_contact" &&
data.ChangeType == "delete_user"
) {
//TODO 处理删除成员事件
} else if (
data.Event == "change_external_contact" &&
data.ChangeType == "add_external_contact"
) {
//TODO 处理添加外部联系人事件
} else if (
data.Event == "change_external_contact" &&
data.ChangeType == "edit_external_contact"
) {
//TODO 处理编辑外部联系人备注标签信息事件
} else if (
data.Event == "change_external_contact" &&
data.ChangeType == "del_external_contact"
) {
//TODO 处理删除外部联系人事件
}
else if (data.Event == "template_card_event") {
let task_id = data.TaskId;//任务id
let btn_key = data.EventKey;//点击的按钮key,approve是通过,reject是拒绝
let responseCode = data.ResponseCode;//用于调用更新卡片接口的ResponseCode,24小时内有效,且只能使用一次
let resultMap = {
"approve": "审核通过",
"reject": "已拒绝"
};
let result = resultMap[btn_key];//审核结果
let order = await $modules.data.queryData("612f00448a88c8689a368ff3", {//查找订单表,订单数据表id
"61416c3935e1c21ee7a84ef0": task_id//按订单的task_id查找对应的订单数据,task_id的字段属性id
})
if (order.length > 0 && order[0]["612f0388a7b86f0d632c6ccb"] == "审核中") {//订单状态为“审核中”的订单才进行处理
await $modules.program.exec("61416e3f841ce71ef89fce6c", {//调用订单审核功能,对应的功能id
"61416e3f841ce71ef89fce6f": order[0], //选择订单步骤id
"61416ea36f69881edf91a9d8": { //交互responseCode步骤的步骤id,
"field_1631678152117": responseCode ,//该步骤下的responseCode属性id
},
"61416e3f841ce71ef89fce70": { //交互审核意见步骤id,
"field_1630903285232": result //该步骤下的意见属性id
}
})
}
}
}
至此完成这个流程的效果。
注: 企业微信交互型通知API返回的 response_code 24小时内有效,且只能调用一次接口。