Реферная ссылка необходима, если нам надо передать в мессенджер какие-либо данные клиента при старте диалога. В Sherlock Platform для передачи такой информации используется следующий алгоритм:
- В браузере формируется и сохраняется в cookie уникальный идентификатор сессии
- Необходимая информация сохраняется в Sherlock через API
- В ссылку для перехода в мессенджер подставляется идентификатор сессии
При использовании стандартного виджета библиотеки чата на сайт данная логика реализуется автоматически. Пример реализации есть в приложенном файле, а также описан по шагам ниже:
1. Проверить наличие идентификатора сессии в cookie. Пример кода на JavaScript ниже:
getCookie: function(name){
if (document.cookie !== undefined && document.cookie !== null) {
const value = document.cookie;
const parts = value.split(name +'=');
if (parts.length === 2) {
return parts.pop().split(';').shift();
} else {
return '';
}
}
return '';
}
2. Сформировать идентификатор сессии. Рекомендуем использовать Guid. Пример функции для формирования ниже:
createGuid: function(){
function S4() {
return (((1+Math.random())*0x10000)|0).toString(16).substring(1);
}
return (S4() + S4() + "-" + S4() + "-4" + S4().substr(0,3) + "-" + S4() + "-" + S4() + S4() + S4()).toLowerCase();
}
3. Сохранить идентификатор сессии в cookie. Пример функции ниже:
setCookie: function(value, days) {
var expires = "";
if (days) {
var date = new Date();
date.setTime(date.getTime() + (days*24*60*60*1000));
expires = "; expires=" + date.toUTCString();
}
document.cookie = "externalId=" + (value || "") + expires + "; path=/; sameSite: none; secure: true";
}
4. Передать данные в Sherlock. Пример функции ниже:
saveSession: async function(externalId, yourData) {
let token = await fetch('https://<SherlockApiUrl>/v2/Token/TokenByAccessToken?accessToken=BE9B6ACD-A414-4A29-8530-FCAD6498EDEC')
.then(function(res) {
return res.json();
})
.catch(function(err){
console.warn("Sherlock Error: " + err);
})
let _this = this;
fetch(
'https://<SherlockApiUrl>/v2/Widget/(default)/client/' + externalId + '?isButtonShown=true&isWidgetOpened=true',
{ method: 'POST', body: JSON.stringify({'YourData': yourData}), headers: { 'Content-Type': 'application/json;charset=utf-8', Authorization: 'Bearer ' + token.token }}
)
.then(function(){
_this.setCookie(externalId, 7);
})
.catch(function(err){
console.warn("Sherlock Error: " + err);
})
}
Обратите внимание, что в Json можно указать несколько параметров на том же уровне вложенности. Например: JSON.stringify({'data1': data1, 'data2': data2,...})
5. Установить параметр для ссылок перехода в мессенджеры. Пример ниже:
setLink: function(elementId, externalId) {
let element = document.getElementById(elementId);
if (element !== null) {
if(elementId!='sh-whatspp')
element.setAttribute("href", this.getHrefById(elementId)+externalId);
else
element.setAttribute("href", this.getHrefById(elementId)+'['+externalId+']');
}
},
getHrefById: function(id) {
switch(id){
case 'sh-telegram': return 'https://t.me/telegram_Bot?start=';
case 'sh-viber': return 'viber://pa?chatURI=viber_bot&context=';
case 'sh-mssngr': return 'https://m.me/1234567890?ref=';
case 'sh-whatspp': return 'https://wa.me/79997776655?text=';
default: return '';
}
}
Ниже приведем пример основной функции, вызывающей указанные выше:
init: function() {
let externalId = this.getCookie('externalId');
let links = document.getElementsByClassName('sherlock-links');
if (externalId == undefined || externalId ==null || externalId.length === 0) {
externalId = this.createGuid();
}
let yourData = '<требуемые данные>';
this.saveSession(externalId, yourData);
for(let i = 0; i < links.length; i++) {
this.setLink(links.item(i).id, externalId);
}
}