Sendbird Desk обеспечивает активное взаимодействие с клиентами благодаря интерактивной поддержке в приложении. Desk SDK позволяет легко инициализировать, настраивать и встраивать функции поддержки клиентов в ваши приложения Android.
Sendbird Desk — это плагин платформы чата Sendbird для управления заявками, и все события Desk обрабатываются через Chat SDK.
Каждому билету назначаются соответствующие агенты, и он будет перенаправлен в групповой канал чата, который реализует обмен сообщениями в заявках в режиме реального времени с помощью Sendbird Chat SDK.
Это некоторые из основных компонентов Desk SDK.
Отправитель | Подтипы | |
---|---|---|
Сообщение пользователя | Агент или клиент | Богатые сообщения |
Сообщение администратора | Отправлено с настольного сервера без указания отправителя. | Уведомительные сообщения и системные сообщения |
Примечание . Расширенные сообщения дополнительно подразделяются на предварительный просмотр URL-адреса, запрос подтверждения закрытия заявки и сообщения с запросом обратной связи.
Узнайте больше о Sendbird Desk SDK для Android в документе Desk SDK для Android. Если у вас есть какие-либо комментарии или вопросы относительно ошибок и запросов на добавление новых функций, посетите сообщество Sendbird.
В этом разделе показаны предварительные требования, которые необходимо выполнить для использования Sendbird Desk SDK для Android.
Android 5.0 (API level 21) or higher
Java 8 or higher
Support androidx only
Android Gradle plugin 4.0.1 or higher
Sendbird Chat SDK for Android 4.0.3 and later
В этом разделе представлена информация, необходимая для начала работы с Sendbird Desk SDK для Android.
Наш пример приложения демонстрирует основные функции Sendbird Desk SDK. Загрузите приложение из нашего репозитория GitHub, чтобы получить представление о том, что можно делать с реальным SDK, и приступить к созданию собственного проекта.
Приложение Sendbird включает в себя все необходимое для службы чата, включая пользователей, сообщения и каналы. Чтобы создать приложение:
Независимо от платформы, в одно приложение можно интегрировать только одно приложение Sendbird; однако приложение поддерживает связь на всех платформах Sendbird без какой-либо дополнительной настройки.
Примечание . Все данные ограничены рамками одного приложения, поэтому пользователи разных приложений Sendbird не могут общаться друг с другом.
Установить Chat SDK несложно, если вы знакомы с использованием внешних библиотек или SDK. Сначала добавьте следующий код в корневой файл build.gradle
:
allprojects {
repositories {
.. .
maven { url " https://repo.sendbird.com/public/maven " }
}
}
Примечание . Убедитесь, что приведенный выше блок кода не добавлен в файл
bundle.gradle
вашего модуля.
Затем добавьте зависимость в файл build.gradle
верхнего уровня проекта.
dependencies {
implementation ' com.sendbird.sdk:sendbird-desk-android-sdk:1.1.4 '
}
Примечание . Версии Desk SDK
1.0.12
или ниже можно загрузить из JCenter до 1 февраля 2022 г. Версии SDK выше1.0.12
будут доступны в удаленном репозитории Sendbird.
Кроме того, вы можете загрузить Desk SDK из этого репозитория. Скопируйте Desk SDK в папку libs/
и обязательно включите библиотеку в файл build.gradle
.
После завершения установки можно создать тикет для общения агента с клиентом. Следуйте пошаговым инструкциям ниже, чтобы создать свой первый билет.
Во-первых, экземпляр SendBirdDesk должен быть инициализирован при запуске клиентского приложения. Вызовите SendbirdChat.init() и SendBirdDesk.init() в Application.onCreate(). SendbirdChat.init() должен быть сначала инициализирован APP_ID вашего приложения Sendbird на панели управления.
public class MyApplication extends Application {
@ Override
public void onCreate () {
super . onCreate ();
final InitParams initParams = new InitParams ( APP_ID , this , false );
SendbirdChat . init ( initParams , new InitResultHandler () {
@ Override
public void onMigrationStarted () {
}
@ Override
public void onInitFailed ( SendbirdException e ) {
// If initializing fails, this method is called.
}
@ Override
public void onInitSucceed () {
// If initializing is successful, this method is called and you can proceed to the next step.
// You can use all Sendbird APIs, including Connect, after init is completed in your app.
SendBirdDesk . init ();
}
});
}
}
Примечание . Один и тот же
APP_ID
следует использовать для SDK Desk и Chat. Если вы запустите Sendbird Desk с экземпляром Sendbird другогоApp_ID
, все существующие данные в клиентском приложении будут удалены.
В клиентском приложении можно использовать только Chat SDK или оба SDK Chat и Desk вместе, в зависимости от службы чата, которую вы хотите предоставить.
SDK | Используется для |
---|---|
SDK для чата | Мессенджер в приложении, где клиенты могут общаться друг с другом. |
SDK для чата и рабочего стола | Тикеты, где клиенты могут общаться с агентами. |
public class MyApplication extends Application {
@ Override
public void onCreate () {
super . onCreate ();
final InitParams initParams = new InitParams ( APP_ID , this , false );
SendbirdChat . init ( initParams , new InitResultHandler () {
@ Override
public void onMigrationStarted () {
}
@ Override
public void onInitFailed ( SendbirdException e ) {
// If initializing fails, this method is called.
}
@ Override
public void onInitSucceed () {
// If initializing is successful, this method is called and you can proceed to the next step.
// You can use all Sendbird APIs, including Connect, after init is completed in your app.
SendBirdDesk . init ();
}
});
}
}
Клиенты могут запросить поддержку по различным каналам: чатам в приложении или социальным сетям, таким как Facebook, Instagram и Twitter. Чтобы использовать эти функции поддержки Desk SDK, экземпляр SendBirdDesk
должен быть подключен к серверу Sendbird в зависимости от того, с какого канала поступил запрос:
authenticate()
с использованием идентификаторов пользователей.После аутентификации клиенты могут общаться в чате с агентами на платформе Sendbird Chat.
SendbirdChat . connect ( userId , accessToken , new ConnectHandler () {
@ Override
public void onConnected ( User user , SendbirdException e ) {
if ( e != null ) { // error.
return ;
}
// Use the same user Id and access token used in the SendbirdChat.connect().
SendBirdDesk . authenticate ( userId , accessToken , new SendBirdDesk . AuthenticateHandler () {
@ Override
public void onResult ( SendbirdException e ) {
if ( e != null ) { //error.
return ;
}
// SendBirdDesk is now initialized, and the customer is authenticated.
}
});
}
});
Примечание . Клиенты платформы Sendbird Chat — это пользователи, которые уже прошли аутентификацию с помощью Chat SDK. Если вы одновременно реализуете Chat SDK и Desk SDK, сначала подключите пользователя к серверу Sendbird, указав его идентификатор пользователя и токен доступа.
Реализуйте метод Ticket.create()
для создания нового билета до или после первоначального сообщения клиента.
Ticket . create ( ticketTitle , userName , new Ticket . CreateHandler () {
@ Override
public void onResult ( Ticket ticket , SendbirdException e ) {
if ( e != null ) { // error
return ;
}
// The ticket is created. Agents and customers can chat with each other by sending a message through the ticket.getChannel().sendUserMessage() or sendFileMessage().
}
});
После успешного создания билета на сервере Sendbird вы можете получить доступ к билету и его каналу в ticket.getChannel()
через обратный вызов с сервера.
Прежде чем клиент отправит первое сообщение, агенты не видят заявку на информационной панели, и назначение заявки не происходит. Когда начинается разговор, билет назначается доступному агенту с помощью панели управления, а сообщения отправляются и принимаются через Chat SDK.
При создании заявки вы можете использовать следующие параметры.
Примечание . Необходимо определить только Groupkey и customField, и они доступны только с панели мониторинга.
Аргумент | Тип | Описание |
---|---|---|
БИЛЕТ_TITLE | нить | Указывает заголовок заявки. |
ИМЯ ПОЛЬЗОВАТЕЛЯ | нить | Указывает имя пользователя, который отправляет или получает билет. |
ГРУППА_КЛЮЧ | нить | Указывает идентификатор конкретной команды. |
пользовательские поля | вложенный объект | Указывает дополнительную информацию о билете, состоящую из пользовательских элементов "ключ-значение" . В качестве ключа можно использовать только настраиваемые поля, уже зарегистрированные в «Настройки» > «Поля заявки» на панели управления. |
ПРИОРИТЕТ | нить | Указывает значение приоритета билета. Более высокие значения означают более высокий приоритет. Допустимые значения: НИЗКИЙ , СРЕДНИЙ , ВЫСОКИЙ и СРОЧНЫЙ . |
RELATED_CHANNEL_URLS | множество | Указывает групповые каналы на платформе Sendbird Chat, которые связаны с этим билетом и состоят из URL-адресов каналов и названий каналов. Можно добавить до 3 связанных каналов. |
Map < String , String > customFields = new HashMap <>();
customFields . put ( "product" , "desk" );
customFields . put ( "line" , "14" );
customFields . put ( "select" , "option2" );
Ticket . create ( TICKET_TITLE , USER_NAME ,
"cs-team-1" , // GROUP_KEY
customFields , // CUSTOM_FIELDS
PRIORITY ,
RELATED_CHANNEL_URLS ,
new Ticket . CreateHandler () {
@ Override
public void onResult ( Ticket ticket , SendbirdException e ) {
if ( e != null ) { // Error.
return ;
}
// The ticket is created with parameters.
}
}
);
В этом разделе подробно описана процедура обработки и закрытия заявки из клиентского приложения.
Используйте метод ticket.setCustomFields()
, чтобы добавить дополнительную информацию о конкретном билете.
Map < String , String > customFields = new HashMap <>();
customFields . put ( "product" , "Desk" );
customFields . put ( "line" , String . valueOf ( 30 ));
ticket . setCustomFields ( customFields , new Ticket . SetCustomFieldHandler () {
@ Override
public void onResult ( Ticket ticket , SendbirdException e ) {
if ( e != null ) { // Error.
return ;
}
// Custom fields for the ticket are set.
// Some fields can be ignored if their keys aren't registered in the dashboard.
}
});
Примечание . В качестве ключа можно использовать только настраиваемые поля, зарегистрированные в разделе «Рабочий стол» > «Настройки» > «Поля заявки» на панели управления.
Используйте метод setCustomerCustomFields()
в SendBirdDesk, чтобы ваши клиенты добавляли дополнительную информацию о себе.
Примечание . В качестве ключа можно использовать только настраиваемые поля, зарегистрированные в разделе «Рабочий стол» > «Настройки» > «Поля клиента» на вашей информационной панели.
Map < String , String > customFields = new HashMap <>();
customFields . put ( "gender" , "female" );
customFields . put ( "age" , String . valueOf ( 30 ));
SendBirdDesk . setCustomerCustomFields ( customFields , new SendBirdDesk . SetCustomerCustomFieldsHandler () {
@ Override
public void onResult ( SendbirdException e ) {
if ( e != null ) { // Error.
return ;
}
// Custom fields for the customer are set.
// Some fields can be ignored if their keys aren't registered in the dashboard.
}
});
Используйте метод setCustomerCustomFields()
SendBirdDesk
, чтобы ваши клиенты добавляли дополнительную информацию о себе.
Примечание . В качестве ключа можно использовать только настраиваемые поля, зарегистрированные в разделе «Настройки» > «Поля клиента» на панели управления.
Map < String , String > customFields = new HashMap <>();
customFields . put ( "gender" , "female" );
customFields . put ( "age" , String . valueOf ( 30 ));
SendBirdDesk . setCustomerCustomFields ( customFields , new SendBirdDesk . SetCustomerCustomFieldsHandler () {
@ Override
public void onResult ( SendbirdException e ) {
if ( e != null ) { // Error.
return ;
}
// Custom fields for the customer are set.
// Some fields can be ignored if their keys aren't registered in the dashboard.
}
});
Связанные каналы обозначают групповые каналы на платформе Sendbird Chat, которые связаны с заявкой. При создании заявки передайте channel_url
связанных групповых каналов в качестве аргумента параметра relatedChannelUrls
в методе Ticket.create()
. Чтобы обновить связанные каналы, используйте вместо этого ticket.setRelatedChannelUrls()
. Свойство ticket.relatedChannels
в обратном вызове указывает объект группового канала связанных каналов и содержит имена каналов и их URL-адреса.
ticket . setRelatedChannelUrls ( RELATED_CHANNEL_URLS , new Ticket . SetRelatedChannelUrlsHandler () {
@ Override
public void onResult ( Ticket ticket , SendbirdException e ) {
if ( e != null ) { // Error.
return ;
}
// The ticket.relatedChannels property has been updated.
}
});
Примечание . К одному билету можно добавить до трех связанных каналов.
Благодаря предварительному просмотру URL-адресов пользователи вашего приложения могут оправдать свои ожидания относительно того, что они получат, прежде чем откроют ссылку во время разговора.
Для предварительного просмотра URL-адресов необходимо проверять каждое текстовое сообщение, если оно содержит какие-либо URL-адреса. Когда текстовое сообщение, содержащее URL-адрес, успешно отправлено, URL-адрес необходимо извлечь и передать на сервер Sendbird с помощью метода getUrlPreview()
. Задайте проанализированные данные, полученные от сервера, как объект JSON
и преобразуйте объект в строку, чтобы передать его в качестве аргумента в параметре метода updateUserMessage()
. Затем обновленное сообщение с предварительным просмотром URL-адреса доставляется клиентским приложениям с помощью метода onMessageUpdated()
обработчика событий канала.
ticket . getChannel (). sendUserMessage ( TEXT , new UserMessageHandler () {
@ Override
public void onResult ( UserMessage userMessage , SendbirdException e ) {
if ( e != null ) { // Error.
return ;
}
List < String > urls = extractUrlsFromMessage ( userMessage . getMessage ());
if ( urls . size () > 0 ) {
String strUrlPreview = toJsonString ( getOGTagsWithUrl ( urls . get ( 0 )));
UserMessageUpdateParams updateParams = new UserMessageUpdateParams ( TEXT );
updateParams . setData ( strUrlPreview );
updateParams . setCustomType ( "SENDBIRD_DESK_RICH_MESSAGE" );
ticket . getChannel (). updateUserMessage ( userMessage . getMessageId (), updateParams , new UserMessageHandler () {
@ Override
public void onResult ( UserMessage userMessage , SendbirdException e ) {
if ( e != null ) { // Error.
return ;
}
}
});
}
}
});
Примечание . Перейдите на страницу Github и обратитесь к классам
updateUserMessageWithUrl()
иUrlPreviewAsyncTask
в примере кода. Вы получите представление о том, как реализовать методы в приведенном выше примере кода, такие какextractUrlsFromMessage()
,getOGTagsWithUrl()
иtoJsonString()
, которые не являются реальным кодом, но предназначены для того, чтобы помочь вам понять общий процесс использования. Предварительный просмотр URL.
В методе onMessageUpdated()
обработчика событий канала вы можете найти данные для предварительного просмотра URL-адреса в свойстве message.data
, как показано ниже.
{
"type" : " SENDBIRD_DESK_URL_PREVIEW " ,
"body" : {
"url" : " https://sendbird.com/ " ,
"site_name" : " Sendbird " ,
"title" : " Sendbird - A Complete Chat Platform, Messaging and Chat SDK and API " ,
"description" : " Sendbird's chat, voice and video APIs and SDKs connect users through immersive, modern communication solutions that drive better user experiences and engagement. " ,
"image" : " https://6cro14eml0v2yuvyx3v5j11j-wpengine.netdna-ssl.com/wp-content/uploads/sendbird_thumbnail.png "
}
}
Сообщения администратора — это настраиваемые сообщения, отправляемые системой. Существует два типа сообщений администратора. Уведомления — это сообщения, которые отправляются и отображаются как клиентам, так и агентам, например приветственные сообщения или сообщения о задержке. Системные сообщения — это сообщения, отправляемые и отображаемые агентам в представлении сведений о заявке, когда в заявке есть некоторые изменения, например, изменения в статусе заявки и правопреемнике.
Примечание . Вы можете настроить уведомления в разделе «Рабочее устройство» > «Настройки» > «Триггеры» , а также системные сообщения в разделе «Рабочее устройство» > «Настройки» > «Системные сообщения» на панели управления.
Когда клиентское приложение получает сообщение через метод onMessageReceived() обработчика событий канала, системные сообщения отличаются от сообщений уведомлений по значению message.custom_type
, а их подтип указывается в message.data
, как показано ниже.
{
"message_id" : 40620745 ,
"type" : " ADMM " ,
"custom_type" : " SENDBIRD_DESK_ADMIN_MESSAGE_CUSTOM_TYPE " ,
"data" : " { " type " : " SYSTEM_MESSAGE_TICKET_ASSIGNED_BY_SYSTEM " , " ticket " : <Ticket Object>} " ,
"message" : " The ticket is automatically assigned to Cindy. "
}
Примечание .
transfer
появляется только в том случае, еслиdata
имеютSYSTEM_MESSAGE_TICKET_TRANSFERRED_BY_AGENT
.
Системные сообщения предназначены для отображения только агентам. Обратитесь к следующему образцу кода, чтобы не показывать его своим клиентам.
public static boolean isVisible ( BaseMessage message ) {
if ( message instanceof AdminMessage ) {
String data = message . getData ();
if (! TextUtils . isEmpty ( data )) {
String customType = message . getCustomType ();
boolean isSystemMessage = ADMIN_MESSAGE_CUSTOM_TYPE . equals ( customType );
JsonObject dataObj = new JsonParser (). parse ( data ). getAsJsonObject ();
String type = dataObj . get ( "type" ). getAsString ();
return ! isSystemMessage
&& ! EVENT_TYPE_ASSIGN . equals ( type )
&& ! EVENT_TYPE_TRANSFER . equals ( type )
&& ! EVENT_TYPE_CLOSE . equals ( type );
}
}
return true ;
}
Хотя у администраторов есть разрешение на непосредственное закрытие заявки, агенты могут либо закрыть заявку, как это делают администраторы, либо спросить клиентов, закрывать ли заявку, в зависимости от настроек разрешений агента. Сообщение с запросом на подтверждение может иметь 3 типа состояний, как показано ниже.
Состояние | Описание |
---|---|
ОЖИДАЮЩИЙ | Устанавливается, когда агент отправляет сообщение с запросом на подтверждение. |
ПОДТВЕРЖДЕННЫЙ | Устанавливается, когда клиент соглашается закрыть заявку. (По умолчанию: правда ) |
ОТКЛОНЕННЫЙ | Устанавливается, когда клиент отказывается закрывать заявку. (По умолчанию: ложь ) |
Когда клиент отвечает на сообщение, ответ true (согласен) или false (отказ) отправляется на сервер Sendbird как CONFIRMED
или DECLINED
путем вызова метода Ticket.confirmEndOfChat()
.
ticket . confirmEndOfChat ( USER_MESSAGE , true | false , new Ticket . ConfirmEndOfChatHandler () {
@ Override
public void onResult ( Ticket ticket , SendbirdException e ) {
if ( e != null ) { // Error.
return ;
}
// You can update the UI of the message. For example, you can hide YES and No buttons.
}
});
{
"type" : " SENDBIRD_DESK_INQUIRE_TICKET_CLOSURE " ,
"body" : {
"state" : " CONFIRMED "
}
}
Вы можете отправить сообщение клиентам сразу после закрытия заявки, чтобы спросить, удовлетворены ли они поддержкой, предоставляемой через заявку. Когда на вашей информационной панели включена функция оценки удовлетворенности клиентов , клиенты получат сообщение с просьбой поставить оценку и оставить комментарий в качестве отзыва. Сообщение может иметь 2 состояния, как показано ниже.
Состояние | Описание |
---|---|
ОЖИДАЮЩИЙ | Устанавливается, когда агент отправляет сообщение с запросом обратной связи от клиента. |
ПОДТВЕРЖДЕННЫЙ | Устанавливается, когда клиент отправляет ответ. |
Когда клиент отвечает на сообщение, его оценка и комментарий к заявке отправляются на сервер Desk посредством вызова метода ticket.submitFeedback()
. Затем состояние сообщения запроса подтверждения меняется на CONFIRMED
.
ticket . submitFeedback ( USER_MESSAGE , SCORE , COMMENT , net Ticket . SubmitFeedbackHandler () {
@ Override
public void onResult ( Ticket ticket , SendbirdException e ) {
if ( e != null ) { // Error.
return ;
}
}
});
Сервер Sendbird Desk уведомляет клиентское приложение клиента об обновлениях с помощью метода onMessageUpdate()
обработчика событий канала.
public void onMessageUpdated ( final BaseChannel channel , final BaseMessage message ) {
Ticket . getByChannelUrl ( channel . getUrl (), new Ticket . GetByChannelUrlHandler () {
@ Override
public void onResult ( Ticket ticket , SendbirdException e ) {
if ( e != null ) return ;
String data = message . getData ();
if (! TextUtils . isEmpty ( data )) {
JsonObject dataObj = new JsonParser (). parse ( data ). getAsJsonObject ();
String type = dataObj . get ( "type" ). getAsString ();
boolean isFeedbackMessage = "SENDBIRD_DESK_CUSTOMER_SATISFACTION" . equals ( type );
if ( isFeedbackMessage ) {
JsonObject feedback = dataObj . get ( "body" ). getAsJsonObject ();
String state = feedback . get ( "state" ). getAsString ();
switch ( state ) {
case "CONFIRMED" :
// TODO: Implement your code for the UI when there is a response from the customer.
break ;
case "WAITING" :
// TODO: Implement your code for the UI when there is no response from the customer.
break ;
}
}
}
}
});
}
Примечание . Следующий строковый объект
JSON
можно найти в свойствеmessage.data
в методеonMessageUpdate()
обработчика событий канала.
{
"type" : " SENDBIRD_DESK_CUSTOMER_SATISFACTION " ,
"body" : {
"state" : " CONFIRMED " ,
"customerSatisfactionScore" : 3 ,
"customerSatisfactionComment" : " It was really helpful :) "
}
}
Закрытый билет можно открыть повторно с помощью метода reopen()
в Ticket
.
ticket . reopen ( new Ticket . ReopenHandler () {
@ Override
public void onResult ( Ticket ticket , SendbirdException e ) {
if ( e != null ) { // Error.
return ;
}
}
});
Вы можете получить список открытых и закрытых заявок текущего клиента, используя Ticket.getOpenedList()
и Ticket.getClosedList()
.
Вы можете создать активность в почтовом ящике для истории открытых и закрытых заявок для вашего клиента. Ноль — хорошее начальное значение, тогда для каждого вызова будет возвращено максимум 10 билетов в порядке убывания времени создания последнего сообщения.
Примечание . За один запрос можно получить только 10 билетов по времени создания сообщения в порядке убывания.
// getOpenedList()
Ticket . getOpenedList ( OFFSET , new Ticket . GetOpenedListHandler () {
@ Override
public void onResult ( List < Ticket > tickets , boolean hasNext , SendbirdException e ) {
if ( e != null ) { // Error.
return ;
}
// offset += tickets.size(); for the next tickets.
// TODO: Implement your code to display the ticket list.
}
});
// getClosedList()
Ticket . getClosedList ( OFFSET , new Ticket . GetClosedListHandler () {
@ Override
public void onResult ( List < Ticket > tickets , boolean hasNext , SendbirdException e ) {
if ( e != null ) { // Error.
return ;
}
// offset += tickets.size(); for the next tickets.
// TODO: Implement your code to display the ticket list.
}
});
Для заявок с настраиваемыми полями вы можете добавить фильтр к getOpenList()
и getClosedList()
для сортировки заявок по ключам и значениям настраиваемых полей.
Map < String , String > customFieldFilter = new HashMap <>();
customFieldFilter . put ( "subject" , "doggy_doggy" );
Ticket . getOpenedList ( OFFSET , customFieldFilter , new Ticket . GetOpenedListHandler () {
@ Override
public void onResult ( List < Ticket > tickets , boolean hasNext , SendbirdException e ) {
if ( e != null ) { // Error.
return ;
}
List < Ticket > openedTicket = tickets ;
// offset += tickets.length; for the next tickets.
// TODO: Implement your code to display the ticket list.
}
});
Вы можете получить конкретный билет по URL-адресу его канала.
Ticket . getByChannelUrl ( channel . getUrl (), new Ticket . GetByChannelUrlHandler () {
@ Override
public void onResult ( Ticket ticket , SendbirdException e ) {
if ( e != null ) { // Error.
return ;
}
}
});
Вы можете отобразить количество открытых заявок в клиентском приложении, используя Ticket.getOpenCount()
.
Ticket . getOpenCount ( new Ticket . GetOpenCountHandler () {
@ Override
public void onResult ( int count , SendbirdException e ) {
if ( e != null ) { // Error.
return ;
}
// TODO: Implement your code with the result value.
}
});
Используйте метод ticket.close()
, чтобы клиенты могли напрямую закрывать заявку в своем клиентском приложении, чтобы агенты могли быстро переключаться на запросы других клиентов без задержки или подтверждения клиента.
ticket . close ( CLOSE_COMMENT , new Ticket . CloseHandler () {
@ Override
public void onResult ( Ticket ticket , SendbirdException e ) {
if ( e != null ) { // Error.
return ;
}
// TODO: Implement your code to close a ticket.
}
});
В случае сбоя запроса API параметр SendbirdException
в обработчике будет содержать информацию об ошибке.
Свойство | Описание |
---|---|
код | SendBirdError.ERR_REQUEST_FAILED (800220) |
сообщение | Подробное сообщение об ошибке с конкретным кодом ошибки, если он существует. |