将C#代码转为Zoho Deluge并解决Microsoft Graph订阅验证报错问题
问题描述
正在开发Cliq扩展,需将一段C#代码改写为Zoho Deluge代码,实现接收网站返回的validationToken并返回200 OK状态码。尝试订阅Microsoft Graph变更通知,调用API创建订阅后,Microsoft Graph发送了验证令牌,但返回令牌时出现错误。
原C#代码
if(!string.IsNullOrEmpty(validationToken)) { Console.WriteLine($"Received Token: '{validationToken}'"); return Ok(validationToken); }
初始API调用代码(创建订阅)
data.insert("changeType":"created,updated"); data.insert("notificationUrl":"https://cliq.zoho.com/api/v2/bots/testbot/incoming?zapikey=1001.d2067fe4b9b15aee1a542e4c6b6d40ca.efb4c86660bd487e511eeae596d4f3a2"); data.insert("resource":"/me/mailfolders('inbox')/messages"); data.insert("expirationDateTime":expire); data.insert("clientState":"SecretClientState"); data.insert("latestSupportedTlsVersion":"v1_2"); Api = invokeurl [ url :"https://graph.microsoft.com/v1.0/subscriptions" type :POST parameters:data.toString() connection:"microsoft" content-type:"application/json" ];
错误的验证令牌提交代码
token = params.get("validationToken"); decoded = zoho.encryption.urlDecode(token); data = Map(); data.put("Status code","200"); data.put("Response body",decoded); Api = invokeurl [ url :"https://graph.microsoft.com/v1.0/subscriptions" type :POST parameters:data.toString() connection:"microsoft" content-type:"application/json" ];
错误信息
{ "error": { "code": "InvalidRequest", "message": "expirationDateTime is a required property for subscription creation.", "innerError": { "date": "2023-03-01T10:05:01", "request-id": "d0566e86-c9a2-4208-846d-4c0965bfc96a", "client-request-id": "d0566e86-c9a2-4208-846d-4c0965bfc96a" } } }
解决方案
错误原因
你的验证代码完全偏离了Microsoft Graph的订阅验证流程:
- 创建订阅时,Graph会向你指定的
notificationUrl发送GET请求,携带validationToken参数; - 你错误地在验证时发起了POST请求到Graph的
/subscriptions端点(这是创建订阅的接口),该接口自然要求expirationDateTime等必填参数,因此报错。
正确的Deluge验证代码
只需要直接返回validationToken作为响应体,同时返回200状态码即可:
// 获取请求中的validationToken参数 validationToken = params.get("validationToken"); // 检查令牌是否存在 if (validationToken != null && !validationToken.isEmpty()) { // 直接返回令牌,状态码200,内容类型为纯文本 respond [ status: 200 content: validationToken content-type: "text/plain" ]; }
额外注意事项
- 确保初始订阅代码中的
expire变量是符合ISO 8601格式的字符串(例如2023-03-08T10:05:01Z),且订阅有效期不超过Graph允许的上限(邮件类订阅默认最长为4230分钟); - Cliq的bot端点需要能正常接收GET请求,确保你的bot配置允许处理GET类型的请求。
内容的提问来源于stack exchange,提问作者Sanjay Sankar J
相关产品推荐
相关产品推荐

