oa的操作已經測試了一遍

如果是自建oa則代表發起的審批是跳轉網頁,否則釘釘打開后是一個表單界面,不需要調整自己搞得oa。
所以我感覺目前公司的需求更適合官方oa 表單來填寫,更靈活,還支持用戶配置。
但是用戶點了審批,這個表單的結果怎么監聽呢?
自建了應用之后
填寫了一個網址測試,發現有跡可循。
其實際上的發起的請求一目兩然。
驗簽的c#版本倒是提供了
他推薦流模式,但是只給了java,和go,我喜歡偷懶,那就直接http實現吧
java版本:
import com.alibaba.fastjson.JSONObject;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;@RestController
public class CallbackController {@PostMapping("{你注冊的HTTP地址的urlpath}")public Map<String, String> callBack(@RequestParam(value = "msg_signature", required = false) String msg_signature,@RequestParam(value = "timestamp", required = false) String timeStamp,@RequestParam(value = "nonce", required = false) String nonce,@RequestBody(required = false) JSONObject json) {}
}

c#沒有提供案例
但是也可以根據上面的報錯紅色信息 舉一反三,不懂的朋友直接復制curl到apifox里面玩吧。
//https://github.com/open-dingtalk/DingTalk-Callback-Crypto/blob/main/DingTalkEncryptor.cs[HttpPost("callback/{urlpath}")]public string CallBack([FromQuery(Name = "msg_signature")] string? msgSignature,[FromQuery(Name = "timestamp")] string? timestamp,[FromQuery(Name = "nonce")] string? nonce,[FromBody] JObject? json // 以 JObject 接收 JSON 請求體){// 示例:從 JSON 中手動取字段string? encrypt = json?["encrypt"]?.ToString();Console.WriteLine($"接收到 encrypt = {encrypt}");// 構造返回的 JObjectJObject result = new JObject {["status"] = "ok",["msg"] = "callback received",};return result.ToString(); // 返回 JSON}
DingTalk-Callback-Crypto/DingTalkEncryptor.cs at main · open-dingtalk/DingTalk-Callback-Crypto

然后我開啟斷點調試http://nat.xx.xx.top:1111/callback/ding
點擊保存,這邊立馬傳過來參數了,nice

驗證沒問題那么保存會成功,保存失敗每次需要重新配置。

這是我接口直接復制curl里面的東西測試結果

下面是我自建公網轉發端口映射的技術棧 實現抓取到阿里那邊發起的請求

解密抓到的事件
//https://github.com/open-dingtalk/DingTalk-Callback-Crypto/blob/main/DingTalkEncryptor.cs[HttpPost("callback/{urlpath}")]public string CallBack([FromQuery(Name = "msg_signature")] string? msgSignature,[FromQuery(Name = "timestamp")] string? timestamp,[FromQuery(Name = "nonce")] string? nonce,[FromBody] JObject? json // 以 JObject 接收 JSON 請求體){// 示例:從 JSON 中手動取字段string? encrypt = json?["encrypt"]?.ToString();// DingTalkEncryptor dingTalkEncryptor=new DingTalkEncryptor(msgSignature, timestamp, nonce);string aesKey = "jfMpfdLWzGyZAhGc3sljt9rUsEvfiuWEDmDNCcYjoUX";string signKey = "TJKIRtrgH9a6vo72W0JZjp4iU541VJpHANjzX";DingTalkEncryptor callbackCrypto = new DingTalkEncryptor(token: signKey, encodingAesKey: aesKey,corpId:"dinggfmqeejcxfh76eja");String decryptMsg = callbackCrypto.getDecryptMsg(msgSignature, timestamp, nonce, encrypt);Debug.WriteLine("decryptMsg:"+ decryptMsg);// 3. 反序列化回調事件json數據JObject eventJson = JObject.Parse(decryptMsg);String eventType = eventJson["EventType"].ToString(); //bpms_instance_change// 4. 根據EventType分類處理if ("check_url" == eventType) {// 測試回調url的正確性Debug.WriteLine("測試回調url的正確性");}else if ("user_add_org" == eventType) {// 處理通訊錄用戶增加事件Debug.WriteLine("發生了:" + eventType + "事件");}else {// 添加其他已注冊的Debug.WriteLine("發生了:" + eventType + "事件");}// 5. 返回success的加密數據Dictionary<string, string> successMap = callbackCrypto.getEncryptedMap("success");Console.WriteLine($"接收到 encrypt = {encrypt}");return JObject.FromObject(successMap).ToString();}
然后 如果審批 被同意或者被拒絕則bpms_instance_change
中的type等于finish
下面這個:
這是發起實例后,修改了審批人,這個時候type還是等于start,然后 我點了拒絕后的信息
decryptMsg:{"EventType":"check_url"}
測試回調url的正確性
decryptMsg:{"EventType":"check_url"}
測試回調url的正確性
decryptMsg:{"EventType":"check_url"}
測試回調url的正確性
線程 0x5754 已退出,返回值為 0 (0x0)。
decryptMsg:{"processInstanceId":"a3Dk0aPSRjioHwXjwvftZA03241752197014","eventId":"475679dc49894ab0866e21d49cb2fad3","corpId":"ding5769db03cf6cefd4a1320dcb25e91351","resource":"/v1.0/event/bpms_instance_change/processCode/PROC-DD3B3D23-ECA2-492F-847E-20DEB0C0AFB3/type/start","EventType":"bpms_instance_change","businessId":"202507110923000340503","title":"情遷提交的A測試","type":"start","url":"https://aflow.dingtalk.com/dingtalk/mobile/homepage.htm?corpid=ding5769db03cf6cefd4a1320dcb25e91351&dd_share=false&showmenu=false&dd_progress=false&back=native&procInstId=a3Dk0aPSRjioHwXjwvftZA03241752197014&taskId=&swfrom=isv&dinghash=approval&dtaction=os&dd_from=corp#approval","createTime":1752197015000,"processCode":"PROC-DD3B3D23-ECA2-492F-847E-20DEB0C0AFB3","bizCategoryId":"","staffId":"0716043442804764"}
發生了:bpms_instance_change事件decryptMsg:{"processInstanceId":"a3Dk0aPSRjioHwXjwvftZA03241752197014","eventId":"26d224da367e4a12872eca6f42bf82d0","finishTime":1752197095000,"corpId":"ding5769db03cf6cefd4a1320dcb25e91351","resource":"/v1.0/event/bpms_instance_change/processCode/PROC-DD3B3D23-ECA2-492F-847E-20DEB0C0AFB3/type/finish","EventType":"bpms_instance_change","businessId":"202507110923000340503","title":"情遷提交的A測試","type":"finish","url":"https://aflow.dingtalk.com/dingtalk/mobile/homepage.htm?corpid=ding5769db03cf6cefd4a1320dcb25e91351&dd_share=false&showmenu=false&dd_progress=false&back=native&procInstId=a3Dk0aPSRjioHwXjwvftZA03241752197014&taskId=&swfrom=isv&dinghash=approval&dtaction=os&dd_from=corp#approval","result":"refuse","createTime":1752197015000,"processCode":"PROC-DD3B3D23-ECA2-492F-847E-20DEB0C0AFB3","bizCategoryId":"","staffId":"0716043442804764"}
發生了:bpms_instance_change事件
雖然知道了結果但是不知道填寫的具體信息包括拒絕的理由
就需要這個接口了。
curl --location --request POST 'http://api.dingtalk.com/v1.0/workflow/processInstances?processInstanceId=a3Dk0aPSRjioHwXjwvftZA03241752197014' \
--header 'x-acs-dingtalk-access-token: 5f4bab5f471635cea6bb4b3exxxxxxx' \
--header 'AppTime: 1724827203420' \
--header 'User-Agent: Apifox/1.0.0 (https://apifox.com)' \
--header 'Content-Type: application/json' \
--data-raw '{"originatorUserId" : "0716043442804764","processCode":"PROC-A13F14D1-B48E-4111-AC4F-36DF88BE5110"}'
我這邊返回的結果:
{"result": {"finishTime": "2025-07-11T09:24Z","attachedProcessInstanceIds": [],"businessId": "202507110923000340503","title": "情遷提交的A測試","originatorDeptId": "-1","operationRecords": [{"date": "2025-07-11T09:23Z","result": "NONE","images": [],"showName": "提交申請","type": "START_PROCESS_INSTANCE","userId": "0716043442804764"},{"date": "2025-07-11T09:24Z","result": "REFUSE","activityId": "sid-1234_5678","images": [],"showName": "審批人","remark": "。。。。我拒絕了你","type": "EXECUTE_TASK_NORMAL","userId": "0716043442804764"}],"formComponentValues": [{"componentType": "TextField","name": "用戶名","bizAlias": "TextField-bizAlias","id": "TextField-abcd","value": "單行輸入框示例"}],"result": "refuse","bizAction": "NONE","createTime": "2025-07-11T09:23Z","originatorUserId": "0716043442804764","tasks": [{"result": "REFUSE","activityId": "sid-1234_5678","finishTime": "2025-07-11T09:24Z","pcUrl": "aflow.dingtalk.com?procInsId=a3Dk0aPSRjioHwXjwvftZA03241752197014&taskId=94836079594&businessId=202507110923000340503","createTime": "2025-07-11T09:24Z","mobileUrl": "aflow.dingtalk.com?procInsId=a3Dk0aPSRjioHwXjwvftZA03241752197014&taskId=94836079594&businessId=202507110923000340503","userId": "0716043442804764","taskId": 94836079594,"status": "COMPLETED"}],"originatorDeptName": "測試推送","status": "COMPLETED"},"success": true
}
本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。 如若轉載,請注明出處:http://www.pswp.cn/bicheng/88918.shtml 繁體地址,請注明出處:http://hk.pswp.cn/bicheng/88918.shtml 英文地址,請注明出處:http://en.pswp.cn/bicheng/88918.shtml
如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!