Sendbird Desk ช่วยให้ลูกค้ามีส่วนร่วมอย่างแข็งแกร่งผ่านการสนับสนุนแบบสดในแอป Desk SDK ช่วยให้คุณเริ่มต้น กำหนดค่า และสร้างฟังก์ชันการทำงานที่เกี่ยวข้องกับการสนับสนุนลูกค้าในแอปพลิเคชัน Android ของคุณได้อย่างง่ายดาย
Sendbird Desk เป็นปลั๊กอินของแพลตฟอร์ม Sendbird Chat สำหรับจัดการตั๋ว และกิจกรรม Desk ทั้งหมดได้รับการจัดการผ่าน Chat SDK
ตั๋วทุกใบได้รับการมอบหมายตัวแทนที่เหมาะสม และจะถูกส่งไปยังช่องทางกลุ่มของการแชท ซึ่งใช้การส่งข้อความแบบเรียลไทม์บนตั๋วด้วย Sendbird Chat SDK
เหล่านี้คือองค์ประกอบหลักบางส่วนของ Desk SDK
ผู้ส่ง | ชนิดย่อย | |
---|---|---|
ข้อความของผู้ใช้ | ตัวแทนหรือลูกค้า | ข้อความที่หลากหลาย |
ข้อความของผู้ดูแลระบบ | ส่งจากเซิร์ฟเวอร์ Desk โดยไม่มีผู้ส่งเฉพาะ | ข้อความแจ้งเตือนและข้อความระบบ |
หมายเหตุ : Rich Messages ยังจัดประเภทเพิ่มเติมเป็นการดูตัวอย่าง 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 ภายนอก ขั้นแรก ให้เพิ่มโค้ดต่อไปนี้ลงในไฟล์ root 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
เดียวกันสำหรับทั้ง Desk SDK และ Chat SDK หากคุณเริ่มต้น Sendbird Desk ด้วยอินสแตนซ์ Sendbird ของApp_ID
อื่น ข้อมูลที่มีอยู่ในแอปไคลเอ็นต์ทั้งหมดจะถูกล้าง
คุณสามารถใช้ Chat SDK เท่านั้นหรือทั้ง Chat และ Desk SDK ร่วมกันในแอปไคลเอ็นต์ของคุณ ขึ้นอยู่กับบริการแชทที่คุณต้องการให้บริการ
SDK | ใช้สำหรับ |
---|---|
แชท SDK | โปรแกรมส่งข้อความในแอปที่ลูกค้าสามารถสนทนากันได้ |
Chat และ Desk 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 ด้วย ID ผู้ใช้และโทเค็นการเข้าถึงก่อน
ใช้เมธอด 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()
ผ่านการเรียกกลับจากเซิร์ฟเวอร์
ก่อนที่ลูกค้าจะส่งข้อความแรก เจ้าหน้าที่จะไม่เห็นตั๋วในแดชบอร์ด และการกำหนดตั๋วจะไม่เกิดขึ้น เมื่อการสนทนาเริ่มต้น ตั๋วจะถูกกำหนดให้กับตัวแทนที่พร้อมใช้งานโดย Desk Dashboard ขณะที่ข้อความถูกส่งและรับผ่าน Chat SDK
คุณสามารถใช้พารามิเตอร์ต่อไปนี้เมื่อสร้างตั๋ว
หมายเหตุ : ต้องกำหนดเฉพาะ Groupkey และ customFields และสามารถเข้าถึงได้จากแดชบอร์ดเท่านั้น
การโต้แย้ง | พิมพ์ | คำอธิบาย |
---|---|---|
TICKET_TITLE | เชือก | ระบุชื่อเรื่องของตั๋ว |
ชื่อผู้ใช้ | เชือก | ระบุชื่อของผู้ใช้ที่ส่งหรือรับตั๋ว |
GROUP_KEY | เชือก | ระบุตัวระบุของทีมเฉพาะ |
ฟิลด์ที่กำหนดเอง | วัตถุที่ซ้อนกัน | ระบุข้อมูลเพิ่มเติมของตั๋วที่ประกอบด้วยรายการที่กำหนดเองของ คีย์-ค่า เฉพาะฟิลด์ที่กำหนดเองที่ลงทะเบียนแล้วใน การตั้งค่า > ฟิลด์ ตั๋ว ในแดชบอร์ดของคุณเท่านั้นที่สามารถใช้เป็นคีย์ได้ |
ลำดับความสำคัญ | เชือก | ระบุค่าลำดับความสำคัญของตั๋ว ค่าที่สูงกว่าหมายถึงลำดับความสำคัญที่สูงกว่า ค่าที่ถูกต้องคือ LOW , MEDIUM , HIGH และ URGENT |
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
s ของช่องกลุ่มที่เกี่ยวข้องเป็นอาร์กิวเมนต์ไปยังพารามิเตอร์ 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.
}
});
หมายเหตุ : สามารถเพิ่มช่องที่เกี่ยวข้องได้สูงสุด 3 ช่องต่อตั๋ว
ด้วยการแสดงตัวอย่าง 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 "
}
}
ข้อความผู้ดูแลระบบเป็นข้อความที่ปรับแต่งได้ซึ่งส่งโดยระบบ และข้อความผู้ดูแลระบบมี 2 ประเภท การแจ้งเตือน คือข้อความที่ส่งและแสดงต่อทั้งลูกค้าและตัวแทน เช่น ข้อความต้อนรับหรือข้อความล่าช้า ข้อความระบบ คือข้อความที่ส่งและแสดงต่อตัวแทนใน มุมมองรายละเอียดตั๋ว เมื่อตั๋วมีการเปลี่ยนแปลงบางอย่าง เช่น การเปลี่ยนแปลงสถานะตั๋วและผู้ได้รับมอบหมาย
หมายเหตุ : คุณสามารถปรับแต่งการแจ้งเตือนได้ใน Desk > การตั้งค่า > ทริกเกอร์ และข้อความระบบใน Desk > การตั้งค่า > ข้อความของระบบ ในแดชบอร์ดของคุณ
เมื่อแอปไคลเอ็นต์ได้รับข้อความผ่านเมธอด '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 ประเภทดังนี้
สถานะ | คำอธิบาย |
---|---|
ซึ่งรอคอย | ตั้งค่าเมื่อตัวแทนส่งข้อความคำขอการยืนยัน |
ยืนยันแล้ว | กำหนดเวลาที่ลูกค้าตกลงที่จะปิดตั๋ว (ค่าเริ่มต้น: จริง ) |
ปฏิเสธ | ตั้งค่าเมื่อลูกค้าปฏิเสธที่จะปิดตั๋ว (ค่าเริ่มต้น: เท็จ ) |
เมื่อลูกค้าตอบกลับข้อความ การตอบสนองจริง (เห็นด้วย) หรือเท็จ (ปฏิเสธ) จะถูกส่งไปยังเซิร์ฟเวอร์ 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) |
ข้อความ | ข้อความแสดงข้อผิดพลาดโดยละเอียดพร้อมรหัสข้อผิดพลาดเฉพาะ ถ้ามี |