Chaves API de funções
Uma função sem servidor dentro do seu CRM pode ser invocada de qualquer aplicativo de terceiros ou dentro do CRM usando um webhook. No entanto, geralmente a maioria dos webhooks não suporta OAuth2, exceto alguns deles. Nesse caso, você pode executar a função usando o método de autenticação API Key , que pode ser usado por você ou outros para invocar a função de qualquer lugar.
A diferença entre API Key e OAuth2 está no modo de autenticação. A API Key precisa ser autenticada na URL de solicitação e não como um cabeçalho.
Função de exemplo:
Cenário:
Softwares de helpdesk e relacionados a suporte são absolutamente essenciais em um negócio que envolve interação com clientes e consumidores. Integrar seus softwares de helpdesk com seu CRM economiza muito tempo e esforço para gerenciar todas as informações do seu negócio em um único lugar.
O Zendesk é um desses softwares. O Zoho Desk, desenvolvido pela Zoho, também é um, mas a diferença é que a integração do Zoho Desk é feita automaticamente no Zoho CRM, enquanto você precisa integrar o Zendesk somente por meio de Widgets. Além disso, quando você precisa transferir as informações do ticket de um helpdesk para outro, você precisa ir muito longe. Portanto, uma integração do Zendesk e do Zoho Desk, por meio de Funções Serverless no Zoho CRM, é bem conveniente e útil.
O cenário que vamos assumir agora é similar. Sempre que um "Ticket" é criado no "Zendesk", um ticket deve ser criado no Zoho Desk também, com as mesmas informações.
Aplicações necessárias:
- Zendesk
Zoho Desk
Parte 1: Faça uma conexão
Para que a Função faça uso de aplicativos de terceiros e facilite a transferência de dados, você precisa primeiro configurar uma conexão entre o Zoho CRM e o software de terceiros. Neste caso, seria o Zendesk.
Crie uma conexão com o Zoho Desk:
Parte 2: Crie a função
Crie uma função no Zoho CRM (incluindo o código da Conexão).
Parte 2.1: Escreva a função
- string createTicket(string requestBody){
- if(isNull(requestBody))
- {
- return "Sem conteúdo";
- }
- if(!requestBody.contains("argumentos"))
- {
- return "Formato inválido";
- }
- requestBody = requestBody.get("argumentos");
- requestBody = requestBody.get("requestBody");
- requestBody = requestBody.get("detalhes");
- deskURL = "https://desk.zoho.com/api/v1/";
- header = {"orgId":"664950682"};
- departmentId = "264631000000006907"; //Obter detalhes do ticket e do usuário do requestBody
- userDetails = requestBody.get("usuário");
- ticketDetails = requestBody.get("ticket"); //Criar mapa
- param = Map(); //Inserir detalhes
- param.put("departmentId",departmentId);
- if(!userDetails.contains("email"))
- {
- return "O e-mail é obrigatório";
- }
- email = userDetails.get("email");
- param.put("email",email);
- contactName = "Convidado";
- if(userDetails.contains("nome_completo"))
- {
- contactName = userDetails.get("nome_completo");
- }
- else if(userDetails.contains("primeiro_nome") && userDetails.contains("último_nome"))
- {
- contactName = userDetails.get("primeiro_nome") + " " + userDetails.contains("último_nome");
- }
- else if(userDetails.contains("primeiro_nome"))
- {
- contactName = userDetails.get("primeiro_nome");
- }
- else if(userDetails.contains("last_name"))
- {
- contactName = userDetails.get("last_name");
- }
- //Obter ID de contato do nome do contato
- //Obter todos os contatos
- contactList = invokeurl
- [
- url :deskURL + "contacts"
- type :GET
- headers:header
- connection:"zoho_desk9"
- ];
- isExistingCustomer = false;
- contactId = "";
- contactList = contactList.get("data");
- para cada contactInfo em contactList
- {
- contactEmail = contactInfo.get("email");
- if(!isNull(contactEmail))
- {
- if(email.equals(contactEmail))
- {
- isExistingCustomer = true;
- contactId = contactInfo.get("contactId");
- break;
- }
- }
- }
- info isExistingCustomer;
- if(!isExistingCustomer)
- {
- //Criar um novo contato
- 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 + "contatos"
- tipo :POST
- parâmetros:contactParam.toString()
- cabeçalhos:cabeçalho
- conexão:"zoho_desk9"
- ];
- contactId = contactList.get("id");
- }
- param.put("contactId",contactId);
- if(!ticketDetails.contains("título"))
- {
- return "o título é obrigatório";
- }
- param.put("assunto",ticketDetails.get("título"));
- if(!ticketDetails.contains("status"))
- {
- return "o status é obrigatório";
- }
- param.put("status",ticketDetails.get("status"));
- if(ticketDetails.contains("prioridade"))
- {
- param.put("prioridade",ticketDetails.get("prioridade"));
- }
- if(userDetails.contains("organização"))
- {
- organização = userDetails.get("organização");
- if(organization.contains("nome"))
- {
- param.put("accountName",organization.get("nome"));
- }
- }
- if(userDetails.contains("celular"))
- {
- param.put("telefone",userDetails.get("celular"));
- }
- if(userDetails.contains("descrição"))
- {
- param.put("descrição",userDetails.get("descrição"));
- }
- 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");
- }
- //Enviar notificação para a equipe de suporte
- sendmail
- [
- from :zoho.adminuserid
- to :"deborah.g@zohocorp.com"
- subject :"no-reply"
- message :"'Prezada equipe,<expression></expression><div><br></div><div>Um novo ticket é criado dentro do Zoho DESK por meio do Zendesk.</div><div><br></div><div>Detalhes do ticket- </div><div><br></div><div>Nome de usuário - ' + contactName + '</div><div><br></div><div><br></div><div>Corpo da solicitação = " + requestBody + "</div><div><br></div>'"
- ]
- return response;
- }
Quando um webhook envia dados para uma função, não há como saber o número de argumentos presentes nele. Para lidar com esse problema, você pode fazer com que a função contenha todo o corpo da solicitação dentro de um único argumento .
Invoque a API do Desk dentro da função e salve a função.
O resultado:
Criando um ticket no Zendesk:
O ticket é criado no Zoho Desk