You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 15:25:23