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
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!