企业微信API:对接企业微信审批表单
Sen
• 发表于:2021-02-25 11:11:28 • 更新于:2021-10-21 10:31:43
734

目标:

管理软件通过API对接企业微信的报销审批数据,财务可结合报销金额和销售金额统计公司的总支出。

前期准备:

报销审批、报销审批明细数据表(如下图)审批审批明细

实现步骤:

1.在白码开发平台,API对接界面,新增一个webhook模板,作为企业微信回调的接口;新增模板

2.此时可以看到这个模板已经有一部分代码了;登录企业微信管理后台,找到应用管理的审批应用,复制secret到webhook对应的参数;审批应用复制参数

3.再到“我的企业”,复制企业id到webhook的Corpid参数;复制id参数

设置事件接收服务器4.回到审批应用,设置接收事件服务器;

复制webhook的路径,填写到接收消息服务器配置的URL,然后点击随机获取Token和EncodingAESKey,并复制到webhook对应的参数,开启webhook;

填写URL开启webhook

最后点击保存;

5.编写webhook代码;

编写webhook代码

//审批回调

                let info = data.ApprovalInfo;

                let status = {

                    1: false,//"审批中",

                    2: true,//"已通过",

                    3: false,//"已驳回",

                    4: false,//"已撤销",

                    6: true,//"通过后撤销",

                    7: false,//"已删除",

                    10: true//"已支付"

                };

                if (status[info.SpStatus] && info.SpName == "报销审批") {//审批表单名称为报销审批且状态为“已支付”

                    //调用功能,新增报销审批数据

                    await $modules.program.exec("", {

                        "": {

                            "": info.SpNo//审批编号

                        }

                    });

其中只录入审批通过的报销审批,其余忽略,通过调用功能的方式录入报销审批;

6.新增一个企业微信内部应用的云函数,获取审批表单完整数据;

同理填写API配置,并添加输入和输出参数,其中审批编号作为输入参数,审批单信息和审批申请详情作为输出参数;

新增云函数添加参数

async function run($input,$output,$modules = modules){

    const wxworkApi = $modules.wxworkApi;

    let res = await wxworkApi.request({

        method: "post",

        url: "oa/getapprovaldetail",

        data: {

            sp_no: $input.spNo

        }

    });

    $output.info = res.info;//审批单信息-全部

    $output.applyer=res.info.applyer;//申请人信息

    $output.contents=res.info.apply_data.contents;//审批申请详情,由多个表单控件及其内容组成

}

7.新增一个功能,供webhook调用;

①第一步使用交互输入的步骤,填写审批编号;

新增功能

②第二步使用自定义API,选择刚才写好的云函数,并设置输入参数为第一步填写的审批编号;

自定义API设置输入参数

③第三步使用编程的步骤,将API的输出参数进行处理,录入数据;这里处理的方式是根据报销审批的格式来定的;处理参数

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

    let info = await $params.info;//单据信息-全部

    let contents = await $params.contents;//审批申请详情

    //报销类型

    let type = contents[0].value.selector.options[0].value[0].text;

    //报销事由

    let reason = contents[1].value.text;

    //报销状态

    let statusMap = {

        1: "审批中",

        2: "已通过",

        3: "已驳回",

        4: "已撤销",

        6: "通过后撤销",

        7: "已删除",

        10: "已支付"

    }

    //报销单数据

    let spData = {

        "601bc08a75d5d14aeac3d547": info.sp_no,//单号

        "601bc09475d5d14aeac3d548": getTime(info.apply_time),//提交时间

        "601bc09d75d5d14aeac3d549": type,//报销类型

        "601bc0a675d5d14aeac3d54a": reason,//报销事由

        "601bc0d075d5d14aeac3d54d": statusMap[info.sp_status]//状态

    }

    //创建报销单

    let sp = await $plugin.data.saveData("", spData);

    //报销明细list

    let detailList = contents[2].value.children;

    let total = 0;//总费用金额

    for (let i = 0; i < detailList.length; i++) {

        let item = detailList[i];

        //报销明细数据

        let detailData = {

            "601bccae221d8322020e475d": item.list[0].value.selector.options[0].value[0].text,//费用类型

            "601bc0f79089024ae9e7b38e": getTime(item.list[1].value.date.s_timestamp, "date"),//发生时间

            "601bc0fe75d5d14aeac3d550": item.list[2].value.new_money,//费用金额

            "601bc10575d5d14aeac3d551": item.list[3].value.text,//费用说明

            "601bc0ed75d5d14aeac3d54f": sp._id//关联报销审批

        }

        //创建报销明细

        await $plugin.data.saveData("601bc0dd9089024ae9e7b38d", detailData);

        //计算费用总额

        total += new Number(item.list[2].value.new_money);

    }

    //更新总费用金额

    $plugin.data.updateData("601bc05475d5d14aeac3d546", sp._id, { "601bc0bc75d5d14aeac3d54c": total });

 

    // 时间戳转日期时间

    function getTime(time, type) {

        let date = new Date(new Number(time + "000"));

        let YY = date.getFullYear();

        let MM = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1);

        let DD = (date.getDate() + 1 < 10 ? '0' + date.getDate() : date.getDate());

        let hh = (date.getHours() + 1 < 10 ? '0' + date.getHours() : date.getHours());

        let mm = date.getMinutes() + 1 < 10 ? '0' + date.getMinutes() : date.getMinutes();

        return type == "date" ? YY + "-" + MM + "-" + DD : YY + "-" + MM + "-" + DD + " " + hh + ":" + mm;

    }

}

8.将这个功能的id、第一步的步骤id以及第一步的属性id复制到webhook调用功能参数;

复制调用参数

测试结果

测试结果

测试结果

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