ITPub博客

首页 > 应用开发 > IT综合 > 企业微信API:按钮交互型通知+数据回调

企业微信API:按钮交互型通知+数据回调

原创 IT综合 作者:我见青山多妩媚 时间:2021-11-16 19:14:36 0 删除 编辑

效果描述:

系统通过api与企业微信进行对接,可实现系统数据与企业微信上进行数据交互。

本次教程在白码低代码开发平台以订单的提交效果做示例。

效果演示:

审核通过:

审核拒绝:

效果实现:

  1. 首先需要系统集成企业微信,按照提示进行。

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小时内有效,且只能调用一次接口。



来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69998487/viewspace-2842530/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2021-04-16

  • 博文量
    14
  • 访问量
    5979