企業微信API:按鈕互動型通知+資料回撥

我見青山多嫵媚發表於2021-11-16

效果描述:

系統通過api與企業微信進行對接,可實現系統資料與企業微信上進行資料互動。

本次教程在白碼低程式碼開發平臺以訂單的提交效果做示例。

效果演示:

稽核通過:

企業微信API:按鈕互動型通知+資料回撥

稽核拒絕:

企業微信API:按鈕互動型通知+資料回撥

效果實現:

  1. 首先需要系統整合企業微信,按照提示進行。
企業微信API:按鈕互動型通知+資料回撥

2.整合之後,需要在系統上做出系統使用者與企業微訊號進行繫結的效果,本次示例不再進行說明,繫結企業微信id教程:

3.在API對接模組中,選擇企業微信API(第三方)進行新增企業微信請求API,新增完後進行引數的配置。

新建API:

企業微信API:按鈕互動型通知+資料回撥

引數配置:

企業微信API:按鈕互動型通知+資料回撥

API請求程式碼示例:

async function run($input, $output, $modules = modules) {
    /**傳送應用文字訊息
       * 官方API:
       * 錯誤碼查詢工具: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:按鈕互動型通知+資料回撥

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。新建一個“傳送互動訊息”功能,傳遞必要的引數。後面在訂單新增的時候呼叫該功能。

企業微信API:按鈕互動型通知+資料回撥

資料處理步驟:

企業微信API:按鈕互動型通知+資料回撥

程式碼參照:

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}的訂單申請`
}

該功能做好後,在新增訂單功能中,呼叫本功能。

企業微信API:按鈕互動型通知+資料回撥

呼叫步驟示例:

企業微信API:按鈕互動型通知+資料回撥

示例程式碼:

async function runProcess($model = model,$plugin = plugin,$params = params){
await $plugin.program.exec("6141623a841ce71ef89fa745",{//呼叫傳送互動型訊息通知功能,功能id
    "61416240e87b7e1ee12f4a6e":$params.order //呼叫傳送互動型訊息通知功能的選擇訂單步驟id
})
}

6.新建一個“訂單稽核”功能,用於企業微信互動訊息稽核結果回撥,更新該訊息的按鈕狀態、訂單的稽核狀態。

企業微信API:按鈕互動型通知+資料回撥

7.新增一個webhook並確保該api為開啟狀態,用於接收任務推送後審批結果回撥,並進行處理。

企業微信API:按鈕互動型通知+資料回撥

資料回撥示例程式碼:

async function hook($input = {}, $output = {}, $modules = modules) {
  //通訊錄回撥:
  //外部聯絡回撥:
  //OA審批迴調:
  //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部落格 ” ,連結:http://blog.itpub.net/69998487/viewspace-2842530/,如需轉載,請註明出處,否則將追究法律責任。

相關文章