Перейти к содержанию

Взаимодействие с виджетом

Для передачи данных в виджет можно использовать url, добавляя определённые параметры и их значения, или метод postMessage

Передача данных пользователя на виджет

Для передачи в окно виджета, открытом на клиентском сайте, клиентских данных используется метод postMessage.

При открытии виджет отправляет сообщение 'widget.init',после которого можно вызвать метод postMessage с параметром name:'setClientData' и передать в объект data объект clientData, имеющий интерфейс IClientPresetData, описанный ниже

export interface IClientPresetData {
  name?: string;
  surname?: string;
  patronymic?: string;
  email?: string;
  phone?: string;
  extraID?: string;
  extraData?: any;
  birthday?: string;
  comment?: string;
  gender?: string; // NOT_SPECIFIED | MALE | FEMALE
  insuranceNumber?: string;
  insuranceProgram?: string;
  receptionType?: string;
}

Фрагмент когда ниже выведет список сообщений, отправляемых виджетом в консоль, а также передаст клиентские данные в виджет.

window.addEventListener('message', function(event) {
  'use strict';
  var data = event.data;
  var messageEvent = JSON.parse(data);
  console.log(
    'Message received event "' + messageEvent.name + '":',
    messageEvent.data,
  );

  switch (messageEvent.name) {
    case 'widget.init':
      event.source.postMessage(
        JSON.stringify({
          name: 'setClientData',
          data: {
            clientData: {
              name: 'tes2t',
              surname: 'te2st',
              patronymic: 't2est',
              email: '[email protected]',
              phone: '+79030864396',
              extraID: '89030864396',
              comment: 'Some important note',
              extraData: {
                calendarId: '89030864396',
              },
              birthday: '1986-11-24',
              gender: 'MALE',
              insuranceNumber: '12345',
              insuranceProgram: 'ФАКТ',
              receptionType: 'ST',
            },
          },
        }),
        '*',
      );
      break;
    case 'appointment.confirm':
      break;
    case 'appointment.confirmFail':
      break;
    default:
      break;
  }
});

Список сообщений из виджета

Название Описание Передаются данные
widget.init Открытие виджета клиентом
business.select выбор филиала для записи ( не передаётся при открытии одиночного бизнеса ) {business:{ id: string}}
widget.backclick перемещение в виджете на предыдущий экран, очистка ранее выбранного параметра {business:{ id: string},from:{ step: params.fromScreen }}
service.select выбор услуги или категории для записи {business:{ id: string}
service.group.select выбор категории для записи service:{ id: string, parent_id: string}}
resource.select выбор услуги для записи {business:{ id: string},resource:{ id: string}}
datetime.select успешный выбор времени для записи, создание резерва {business:{ id: string},selectedDateTime:{ date: String, time: string}}
datetime.selectFail ошибка ри резервировании слота времени для записи, означает что создать резерв для записи по каким-то причинам не удалось {business:{ id: string }, client: {extraID: string,extraData:any},appointment: {resourceId:string,taxonomyId:string}}
appointment.confirm подтверждение записи , интерфейс данных {business:{ id: string }, appointment:{ id: string}, client: { extraID: string, extraData: any}}
appointment.confirmFail подтвердить резерв/создать запись не удалось {business:{ id: string}, appointment:{ selectedTime: String, selectedDate: string,resourceId: string,taxonomyId:String}, client: { extraID: string, extraData: any }}

Передача страховых данных в виджет через адресную строку

Для передачи Вида помощи и страховой программы можно использовать postmessage механизм, описанный выше, или адресную строку.

Для передачи данных через адресную строку необходимо сформировать JSON объект реализующий интерфейс IClientPresetData и обернуть его в encodeURI() или аналогичный кодирующий uri строку метод и передать через GET-параметр ClientJSON в адресную строку брузера, пример ссылки и JSON объекта:

const clientData = {
  "name":"Вася",
  "surname": "Пупкин",
  "patronymic": "Леонидович",
  "email": "[email protected]",
  "phone": "+7903086493",
  "extraID": "some id",
  "extraData": "any data",
  "birthday": "ММ.ДД.ГГГГ",
  "comment": "string",
  "gender": "MALE",
  "insuranceNumber":"12345",
  "insuranceProgram": "ФАКТ",
  "receptionType": "ST",
}

const  clientDataURI = encodeURI(JSON.stringify(clientData))

URL для открытия виджета тогда будет выглядеть следующим образом:

https://widget.med.me/?BUSINESS_ID=4000000006308&ClientJSON=%7B%22name%22:%22%D0%92%D0%B0%D1%81%D1%8F%22,%22surname%22:%22%D0%9F%D1%83%D0%BF%D0%BA%D0%B8%D0%BD%22,%22patronymic%22:%22%D0%9B%D0%B5%D0%BE%D0%BD%D0%B8%D0%B4%D0%BE%D0%B2%D0%B8%D1%87%22,%22email%22:%[email protected]%22,%22phone%22:%22+7903086493%22,%22extraID%22:%22some%20id%22,%22extraData%22:%22any%20data%22,%22birthday%22:%22%D0%9C%D0%9C.%D0%94%D0%94.%D0%93%D0%93%D0%93%D0%93%22,%22comment%22:%22string%22,%22gender%22:%22MALE%22,%22insuranceNumber%22:%2212345%22,%22insuranceProgram%22:%22%D0%A4%D0%90%D0%9A%D0%A2%22,%22receptionType%22:%22ST%22%7D

Для передачи кода филиала нужно использовать GET-параметр business, ссылка для подключения виджета в таком случае будет вести на список услуг и будет выглядить следующим образом

для Сетевого бизнеса:

https://widget.med.me/category?
    business=someExtraId&
    route=c|sc|s|l|r&
    lang=ru-ru&
    NETWORK_ID=311&
    ClientJSON=%7B...%7D

для витрины:

https://widget.med.me/category?
    business=someExtraId&
    route=c|sc|s|l|r&
    lang=ru-ru&
    BUSINESS_ID=6000000006308&
    ClientJSON=%7B...%7D

Передача данных договора

Для передачи данных о договоре ( если нужно передать только номер договора ) следует использовать GET-параметр contractID при вызове виджета, он будет соответстовать внутреннему порядковому номеру договора в системе Gbooking.

Если нужно передать больше данных, в том числе номер договора клиента, который будет осуществлять запись, данные следует представить в виде объекта, реализущего интерфейс IContract

interface IContract {
  clientContractID?: string;
  id?: string;
  contractID?: string;
}

Подготовив объект contract вы можете передать его значение через postmessage, отправив событие с именем setContractData , либо перевести объект contract в строку и передать через GET параметр ContractJSON

window.addEventListener('message', function(event) {
  'use strict';
  var data = event.data;
  var messageEvent = JSON.parse(data);
  ...
  switch (messageEvent.name) {
    case 'widget.init':
      event.source.postMessage(
        JSON.stringify({
          name: 'setContractData',
          data: {
            contract
          },
        }),
        '*',
      );
      break;
    ...
  }
});