无服务器函数 - 使用 API 密钥
函数的 API 密钥
CRM 中无服务器函数可从任何第三方应用程序或在 CRM 中用 webhook 进行调用。但是,除少数 webhook 支持外,通常大多数 webhook 不支持 OAuth2。在这一情况下,您可以用 API 密钥身份验证方法执行该函数,您或其他人可用该方法从任何地方调用该函数。
API 密钥与 OAuth2 的不同之处在于身份验证的模式。API 密钥必须在请求 URL 中进行身份验证,而非作为Header。
另请参阅:
- Zoho CRM 中的函数。
- 使用 V2.0 API 的函数的集成任务 。
- Deluge 脚本 - 参考指南。
- 连接 - 通过在函数中调用 API,将 Zoho CRM 与任何第三方应用程序连接。
- Zoho Desk - Zoho 推出的帮助台软件。
示例函数:
场景:
在涉及与顾客和客户交互的企业中,帮助台和支持相关软件是绝对必不可少的。将帮助台软件与 CRM 集成节省大量时间和精力,从一个集中的平台来管理所有业务信息。
Zendesk 就是一款这样的软件。Zoho 开发的 Zoho Desk 也是这样一款软件,但不同之处是 Zoho Desk 是自动在 Zoho CRM 中集成的,而 Zendesk 只能通过小部件来集成。而且,当需要工单信息从一个帮助台转移到另一个时,您需要大费周章。因此,在 Zoho CRM 中通过无服务器函数集成 Zendesk 和 Zoho Desk 相当方便且有用。
我们要假设的场景相似。无论何时在 "Zendesk" 中创建一个工单,将会在 Zoho Desk 中同样创建一个带相同信息的工单。
所需应用程序:
- Zendesk
- Zoho Desk
第 1 部分:进行连接
为了使函数能够使用第三方应用程序并促进数据传输,您需要首先在Zoho CRM和第三方软件之间建立连接。在此情况下,第三方应用就是 Zendesk 。阅读更多。
创建到 Zoho Desk 的连接:
第 2 部分:创建函数
在 Zoho CRM 中创建函数(包括来自“连接器”的代码)。
第 2.1 部分:编写函数
函数代码为:
string createTicket(string requestBody){
if(isNull(requestBody))
{
return "No Content";
}
if(!requestBody.contains("arguments"))
{
return "Invalid Format";
}
requestBody = requestBody.get("arguments");
requestBody = requestBody.get("requestBody");
requestBody = requestBody.get("details");
deskURL = "https://desk.zoho.com/api/v1/";
header = {"orgId":"664950682"};
departmentId = "264631000000006907"; //Get ticket and user details from requestBody
userDetails = requestBody.get("user");
ticketDetails = requestBody.get("ticket"); //Create map
param = Map(); //Insert Details
param.put("departmentId",departmentId);
if(!userDetails.contains("email"))
{
return "Email is Mandatory";
}
email = userDetails.get("email");
param.put("email",email);
contactName = "Guest";
if(userDetails.contains("full_name"))
{
contactName = userDetails.get("full_name");
}
else if(userDetails.contains("first_name") && userDetails.contains("last_name"))
{
contactName = userDetails.get("first_name") + " " + userDetails.contains("last_name");
}
else if(userDetails.contains("first_name"))
{
contactName = userDetails.get("first_name");
}
else if(userDetails.contains("last_name"))
{
contactName = userDetails.get("last_name");
}
//Get Contact ID from Contact name
//Get all Contacts
contactList = invokeurl
[
url :deskURL + "contacts"
type :GET
headers:header
connection:"zoho_desk9"
];
isExistingCustomer = false;
contactId = "";
contactList = contactList.get("data");
for each contactInfo in contactList
{
contactEmail = contactInfo.get("email");
if(!isNull(contactEmail))
{
if(email.equals(contactEmail))
{
isExistingCustomer = true;
contactId = contactInfo.get("contactId");
break;
}
}
}
info isExistingCustomer;
if(!isExistingCustomer)
{
//Create a new Contact
contactParam = Map();
contactParam.put("firstName",userDetails.get("first_name"));
contactParam.put("lastName",userDetails.get("last_name"));
contactParam.put("mobile",userDetails.get("mobile"));
contactParam.put("email",userDetails.get("email"));
contactParam.put("accountId","264631000000081178");
contactList = invokeurl
[
url :deskURL + "contacts"
type :POST
parameters:contactParam.toString()
headers:header
connection:"zoho_desk9"
];
contactId = contactList.get("id");
}
param.put("contactId",contactId);
if(!ticketDetails.contains("title"))
{
return "title is mandatory";
}
param.put("subject",ticketDetails.get("title"));
if(!ticketDetails.contains("status"))
{
return "status is mandatory";
}
param.put("status",ticketDetails.get("status"));
if(ticketDetails.contains("priority"))
{
param.put("priority",ticketDetails.get("priority"));
}
if(userDetails.contains("organization"))
{
organization = userDetails.get("organization");
if(organization.contains("name"))
{
param.put("accountName",organization.get("name"));
}
}
if(userDetails.contains("mobile"))
{
param.put("phone",userDetails.get("mobile"));
}
if(userDetails.contains("description"))
{
param.put("description",userDetails.get("description"));
}
info param;
response = invokeurl
[
url :deskURL + "tickets"
type :POST
parameters:param.toString()
headers:header
connection:"zoho_desk9"
];
if(response.contains("errorMessage"))
{
return "Sorry Something went wrong. error ::: " + response.get("errorMessage");
}
//Send Notification to Suppot Team
sendmail
[
from :zoho.adminuserid
to :"deborah.g@zohocorp.com"
subject :"no-reply"
message :"'Dear Team,<expression></expression><div><br></div><div>A New Ticket is created inside Zoho DESK through Zendesk.</div><div><br></div><div>Ticket Details - </div><div><br></div><div>User Name - ' + contactName + '</div><div><br></div><div><br></div><div>Request Body = " + requestBody + "</div><div><br></div>'"
]
return response;
}
第 2.2 部分:以 API 形式提供函数:
- 对需要以 API 形式出现的相应函数点击设置图标。
- 点击 REST API。
- 启用 API 密钥滑块。
- 点击保存。
第 3 部分:在 Zendesk 中创建 Webhook:
- 转至“管理 > 扩展 > HTTP 目标”。
- 提供以下信息:
- 函数 URL
- 方法 - GET 或 POST
- 选择 JSON 作为内容类型。要了解详情,请点击此处。
备注:
- 函数 URL 是您从第 2 步获得的 API 密钥 URL。
第 4 部分:在 Zendesk 中创建触发器:
- 条件 - 创建工单时。
- 通知目标 - HTTP 目标名
参数的 JSON 正文:
{"arguments":
{
"requestBody":{
"details":{
"ticket":
{
"title":"{{ticket.title}}",
"description":"{{ticket.description}}",
"source":"{{ticket.via}}",
"priority":"{{ticket.priority}}",
"due_date":"{{ticket.due_date}}",
"URI":"{{ticket.url}}",
"status":"{{ticket.status}}"
},
"assigne":
{
"email":"{{ticket.assignee.email}}",
"name":"{{ticket.assignee.name}}",
"first_name":"{{ticket.assignee.first_name}}",
"last_name":"{{ticket.assignee.last_name}}"
},
"user":
{
"full_name":"{{current_user.name}}",
"first_name":"{{current_user.first_name}}",
"language":"{{current_user.language}}",
"details":"{{current_user.details}}",
"mobile":"{{current_user.phone}}",
"email":"{{current_user.email}}",
"organization":
{
"details":"{{current_user.organization.details}}",
"name":"{{current_user.organization.name}}"
}}
}}
}}
第 5 部分:配置包含整个请求正文的参数。
当 webhook 发送数据至函数时,没有办法知道其中的参数数目。为了解决此问题,您可以让函数在单个参数中包含整个请求正文。
调用函数内 Desk API 并保存该函数。
结果:
在 Zendesk 中创建工单:
工单创建在 Zoho Desk 中