企业微信API:按钮交互型通知+数据回调
Up
• 发表于:2021-11-16 18:35:03 • 更新于:2021-12-03 14:08:18
516

效果描述:

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

本次教程以订单的提交效果做示例。

效果演示:

审核通过:

http://pan.bnocode.com/project/5ebb991f975bfe569224be3e/attachment/20211129/1638156551422_%E5%AE%A1%E6%A0%B8%E9%80%9A%E8%BF%87.gif

审核拒绝:

http://pan.bnocode.com/project/5ebb991f975bfe569224be3e/attachment/20211129/1638156560791_%E5%AE%A1%E6%A0%B8%E6%8B%92%E7%BB%9D.gif


效果实现:

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

http://pan.bnocode.com/project/5ebb991f975bfe569224be3e/attachment/20211129/1638156577916_%E5%9B%BE%E7%89%871.png


2.集成之后,需要在系统上做出系统用户与企业微信号进行绑定的效果,本次示例不再进行说明,绑定企业微信id教程:https://www.bnocode.com/scene/API_15.html

3.在API对接模块中,选择企业微信API(第三方)进行添加企业微信请求API,添加完后进行参数的配置。

新建API:

http://pan.bnocode.com/project/5ebb991f975bfe569224be3e/attachment/20211129/1638156586676_%E5%9B%BE%E7%89%872.png


参数配置:

http://pan.bnocode.com/project/5ebb991f975bfe569224be3e/attachment/20211129/1638156592874_%E5%9B%BE%E7%89%873.png


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为开启状态。用于接收到回调数据后,更新推送的交互消息按钮状态。

http://pan.bnocode.com/project/5ebb991f975bfe569224be3e/attachment/20211129/1638156600519_%E5%9B%BE%E7%89%874.png


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。新建一个“发送交互消息”功能,传递必要的参数。后面在订单新增的时候调用该功能。

http://pan.bnocode.com/project/5ebb991f975bfe569224be3e/attachment/20211129/1638156608305_%E5%9B%BE%E7%89%875.png


数据处理步骤:

http://pan.bnocode.com/project/5ebb991f975bfe569224be3e/attachment/20211129/1638156613102_%E5%9B%BE%E7%89%876.png


代码参照:

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}的订单申请`

}

该功能做好后,在新增订单功能中,调用本功能。

http://pan.bnocode.com/project/5ebb991f975bfe569224be3e/attachment/20211129/1638156619478_%E5%9B%BE%E7%89%877.png


调用步骤示例:

http://pan.bnocode.com/project/5ebb991f975bfe569224be3e/attachment/20211129/1638156624374_%E5%9B%BE%E7%89%878.png


示例代码:

async function runProcess($model = model,$plugin = plugin,$params = params){

await $plugin.program.exec("6141623a841ce71ef89fa745",{//调用发送交互型消息通知功能,功能id

    "61416240e87b7e1ee12f4a6e":$params.order //调用发送交互型消息通知功能的选择订单步骤id

})

}

6.新建一个“订单审核”功能,用于企业微信交互消息审核结果回调,更新该消息的按钮状态、订单的审核状态。

http://pan.bnocode.com/project/5ebb991f975bfe569224be3e/attachment/20211129/1638156631863_%E5%9B%BE%E7%89%879.png


7.添加一个webhook并确保该api为开启状态,用于接收任务推送后审批结果回调,并进行处理。

http://pan.bnocode.com/project/5ebb991f975bfe569224be3e/attachment/20211129/1638156636783_%E5%9B%BE%E7%89%8710.png


数据回调示例代码:

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



本文是否对您有帮助?
有帮助
没帮助
您是否遇到了以下问题?
内容过期或不准确
缺少场景、事例
链接有误
太简单,步骤待完善
其他
提交反馈
如需获取即时帮助,请联系
小助理
微信扫码添加小助理
让你的想法快速变成软件吧~
联系我们
售前咨询电话
020-88520693
意见箱 · 建议反馈
您的宝贵建议,使白码更完美!
微信扫码添加白码小助理