钉钉中的corpId有不同含义?

前言

我的技术同我说钉钉只能有一个回调,我也看了钉钉给到的示例代码,这些代码确实有一定的误导性;
先放一段代码,等下有用

 这个示例代码在:DingtalkCrypt 这个类的构造函数,是理解错误还是什么原因呢?		
 public function __construct($token, $encodingAesKey, $suiteKey)
	{
		$this->m_token = $token;
		$this->m_encodingAesKey = $encodingAesKey;
		$this->m_suiteKey = $suiteKey;
	}
 $token:应用token,
 $encodingAesKey:为应用加密串, 
 $suiteKey:这个是关键是公司ID 或者应用ID

困惑开始

A:在代码中发起注册事件

$c = new DingTalkClient
		(
			DingTalkConstant::$CALL_TYPE_OAPI,
			DingTalkConstant::$METHOD_POST,
			DingTalkConstant::$FORMAT_JSON
		);
		$req = new OapiCallBackRegisterCallBackRequest;
		$req->setUrl("https://×××××.com/api/res/dingtalk/callback"); // 接收事件回调的url,必须是公网可以访问的url地址
		$req->setAesKey($this->ENCODING_AES_KEY);
		$req->setToken($this->TOKEN);
		$req->setCallBackTag(json_encode(['bpms_task_change','user_leave_org'])); // 需要注册的回调事件
		$resp = $c->execute($req, $this->getToken(),"https://oapi.dingtalk.com/call_back/register_call_back");
		exit();

这里相关参数请查询钉钉文档,上面的注册没有涉及为哪个应用注册回调,钉钉的文档也没有任何说明;
B:接受回调处理,采用钉钉提供的 DingtalkCrypt(上面已经看到了),如果$suiteKey =!公司ID,这个DingtalkCrypt-》DecryptMsg 将返回 900005 表示验证失败;DingtalkCrypt 类的 decrypt 方法

	public function decrypt($encrypted, $corpid)
	{
		try {
			$ciphertext_dec = base64_decode($encrypted);
			$iv = substr($this->key, 0, 16);

/** 以下注释代码块在PHP7.2环境下不可用			
			$module = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');		
			mcrypt_generic_init($module, $this->key, $iv);
			$decrypted = mdecrypt_generic($module, $ciphertext_dec);
			mcrypt_generic_deinit($module);
			mcrypt_module_close($module);
*/
			$decrypted = openssl_decrypt($ciphertext_dec, 'AES-256-CBC', $this->key, OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING, $iv); # 替代方案

		} catch (Exception $e) {
			return array($this->$DecryptAESError, null);
		}
		try {
			//去除补位字符
			$result = $this->decode($decrypted);
			//去除16位随机字符串,网络字节序和AppId
			if (strlen($result) < 16)
				return "";
			$content = substr($result, 16, strlen($result));
			$len_list = unpack("N", substr($content, 0, 4));
			$xml_len = $len_list[1];
			$xml_content = substr($content, 4, $xml_len);
			$from_corpid = substr($content, $xml_len + 4);
		} catch (Exception $e) {
			print $e;
			return array($this->$DecryptAESError, null);
		}
		
		if ($from_corpid != $corpid)
			return array($this->$ValidateSuiteKeyError, null);
		return array(0, $xml_content);
	}

$from_corpid != $corpid 这个地方对返回的内容和传入的suiteKey 进行了校验;

于是给人误导了:钉钉的回调就是按公司进行回调,而不是按应用回调的

如果事实是这样的,钉钉的产品总监应该下岗;

可以看一下:
钉钉回调接口文档

按文档注册回调

1、在钉钉的后台配置应用的:
$token:应用token, $encodingAesKey:为应用加密串,
和回调接口
2、测试回调接口的正确性
3、后台随时可以调整回调事件;

截图说明一切

在这里插入图片描述

钉钉的corpId再次让人困惑

回调方法参数说明

{
	"processInstanceId":"2bbfb476-7497-4a33-9f27-c2ad14909838", //审批唯一ID
	"corpId":"dinga955c2d77886330a00", //这个其实是AppKey
	"EventType":"bpms_task_change",//审批事件
	"businessId":"202106011351000448657",
	"title":"×××产品工单", //工单标题
	"type":"start",//审批发起
	"createTime":1622526705000,
	"processCode":"PROC-F5D9AFCB-60D7-4724-BDF6-DA0A900DC331",//审批模板
	"bizCategoryId":"",
	"staffId":"693466673", //审批人
	"taskId":68811200154// 审批任务ID
}

我们先来看一下这个截图:注意CorpID指代什么内容,其它忽略;
在这里插入图片描述

再来看另外一个截图:注意AppKey指代什么内容,其它忽略;

在这里插入图片描述

实际事件返回的数据显示:这个corpID = AppKey,也可以等于 corpID=corpID (你手工注册事件时,就发生);

在不同的地方相同的变量corpID有不同的含义,耐人寻味;

在回调事件中你可以区分不同的AppKey走不同的处理;

钉钉的文档,坑太多!

<think>好的,我现在需要处理用户关于钉钉审批模式和API集成的问题。首先,用户想知道钉钉审批支持哪些模式,以及如何通过API对接实现功能集成。我需要根据提供的引用内容来整理答案,同时遵循之前的系统级指令,比如正确使用LaTeX格式,生成相关问题,并且添加引用标识。 首先,钉钉审批的模式可能包括表单设计、流程配置、消息通知等。根据引用[1]和[4],用户提到OA系统需要对接考勤审批和用印申请,这说明钉钉审批支持自定义表单和流程。另外,引用[4]中的演示案例提到报销单生成总账凭证,可能涉及数据同步到财务系统,这应该属于集成模式的一部分。 接下来,API对接方面,引用[1]提到钉钉能提供接口,引用[2]和[3]则具体描述了集成的步骤和代码示例。比如引用[2]提到的三步配置,包括记录接口参数、字段映射和方案设置,而引用[3]展示了如何通过本地存储处理token,这可能与API鉴权相关。需要详细说明如何调用钉钉的审批接口,比如发起审批、处理回调、同步数据等步骤。 另外,要注意用户可能需要具体的实现步骤,比如如何获取API权限,配置参数,处理回调等。同时,生成的代码示例要符合Python或其他常见语言的格式,确保语法正确。根据引用[3]中的代码,可能需要使用token进行身份验证,所以在示例中要体现这一点。 然后,生成的相关问题需要围绕钉钉审批的扩展应用、安全性、测试方法以及与其他系统的集成,比如引用[4]中的金蝶云星空案例,可以提问如何实现报销单生成凭证的问题。 最后,确保回答结构清晰,分点说明模式和集成步骤,引用正确的位置,比如引用[1]关于接口支持,引用[2]关于三步配置,引用[3]关于token管理,引用[4]关于具体应用案例。同时,注意使用中文,避免使用Markdown格式,但代码块需要用反引号包裹。</think>### 钉钉审批模式与API集成说明 #### 一、钉钉审批支持的模式 1. **自定义审批流程** 钉钉允许通过可视化表单设计器定义审批模板,例如请假、报销、用印申请等。流程支持多级审批、条件分支、消息通知等功能[^1][^4]。 2. **系统集成模式** 钉钉审批可与外部系统(如OA、ERP)对接,实现数据双向同步。例如,报销单审批通过后自动生成财务凭证(如引用[4]中金蝶云星空的案例)。 3. **API驱动模式** 通过开放接口实现自动化操作,包括发起审批、查询状态、回调通知等。例如,通过API将企业自建系统的数据推送至钉钉审批流[^1][^3]。 --- #### 二、通过API对接钉钉审批的步骤 1. **获取API权限** - 在钉钉开发者后台创建应用,启用“审批API”权限。 - 使用`CorpId`和`AppKey`生成访问令牌(Token),如引用[3]中的`localStorage`管理Token示例: ```javascript // Token管理示例 export function getToken() { return localStorage.getItem("token") as string; } ``` 2. **调用审批接口** - **发起审批实例**:调用`topapi/processinstance/create`接口,传入表单数据。 - **查询审批状态**:使用`topapi/processinstance/get`接口实时获取进度。 - **回调通知**:配置HTTP回调地址接收审批结果(如通过/拒绝)[^2]。 3. **数据字段映射** 根据业务需求配置钉钉审批表单与企业系统的字段对应关系。例如,将钉钉的“报销金额”映射至金蝶系统的“凭证金额”(引用[2]中的字段映射步骤)。 4. **异常处理与日志** 设置重试机制(如引用[2]提到的重试次数)和日志监控,确保接口稳定性。 --- #### 三、代码示例(Python调用钉钉API) ```python import requests def create_approval_instance(token, form_data): url = "https://oapi.dingtalk.com/topapi/processinstance/create" headers = {"Content-Type": "application/json"} params = {"access_token": token} payload = { "process_code": "审批模板ID", "originator_user_id": "发起人ID", "form_component_values": form_data } response = requests.post(url, params=params, headers=headers, json=payload) return response.json() ``` --- #### 四、典型应用场景 1. **考勤审批对接**:OA系统调用钉钉接口同步请假、加班数据。 2. **财务报销集成**:钉钉审批通过后自动生成ERP凭证(如引用[4]的金蝶案例)。 3. **用印流程自动化**:审批结果触发电子签章系统操作[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值