公司的小程序最近開始接入小程序的客服功能愤兵,主要實現(xiàn)能夠自動回復(fù)以及人工回復(fù)鹿霸。 查閱微信開放文檔后,也基本上完成了需求恐似,但是其中遇到了很多問題杜跷,現(xiàn)在總結(jié)一下。
接入方式的選擇
微信的文檔中說的是可以有3種實現(xiàn)方式:
1.開發(fā)者服務(wù)器接收消息推送
2.云函數(shù)接收消息推送
3.云托管服務(wù)接收消息推送
當(dāng)然我這里選擇的是第一種方式矫夷。
接入步驟
第一步:填寫服務(wù)器配置
登錄小程序后臺后葛闷,在「開發(fā)」-「開發(fā)設(shè)置」-「消息推送」中,管理員掃碼啟用消息服務(wù)双藕,填寫服務(wù)器地址(URL)淑趾、令牌(Token) 和 消息加密密鑰(EncodingAESKey)等信息。
第二步:驗證消息的確來自微信服務(wù)器
開發(fā)者提交信息后延蟹,微信服務(wù)器將發(fā)送GET請求到填寫的服務(wù)器地址URL上。
第三步:接收消息和事件
當(dāng)某些特定的用戶操作引發(fā)事件推送時(如用戶向小程序客服發(fā)送消息、或者進(jìn)入會話等情況)忘渔,微信服務(wù)器會將消息(或事件)的數(shù)據(jù)包以 POST 請求發(fā)送到開發(fā)者配置的 URL高帖,開發(fā)者可以依據(jù)自身業(yè)務(wù)邏輯進(jìn)行響應(yīng)。
1.消息類型以及事件類型
目前發(fā)現(xiàn)的消息類型有:
1)text:普通文本消息
2)image:圖片消息
3)miniprogrampage:小程序卡片
4)link:鏈接
5)event:事件
目前發(fā)現(xiàn)的事件類型有:
1)user_enter_tempsession:用戶進(jìn)入客服會話
2)kf_create_session:人工客服進(jìn)入畦粮,客服助手小程序散址,注意這里不是指跟特定的用戶聊天而僅僅是進(jìn)入客服助手聊天列表
3)subscribe_msg_sent_event:小程序訂閱消息
2.接口參數(shù)接受
由于消息類型和事件類型以及是否加密等不確定性乖阵,所以推薦使用Map類型參數(shù)進(jìn)行參數(shù)的接收,其中參數(shù)基本包含如下字段:
1)MsgType:消息類型
2)Content:文本消息消息內(nèi)容
2)FromUserName:用戶openid
2)ToUserName:小程序的原始ID
2)CreateTime:消息創(chuàng)建時間
2)Event:當(dāng)MsgType為event的時候爪飘,會有指定的Event類型
3.怎么進(jìn)行消息回復(fù)
剛開始我以為微信是利用我們提供的POST接口進(jìn)行消息回復(fù)的义起,還是我太年輕啊,我們提供的POST接口目前是兩個作用师崎,一是告訴調(diào)用這個接口的服務(wù)我們處理成功了默终,根據(jù)文檔可以進(jìn)行如下回復(fù):
1)直接回復(fù)success(推薦方式)
2)直接回復(fù)空串(指字節(jié)長度為0的空字符串,而不是結(jié)構(gòu)體中content字段的內(nèi)容為空)
3)若接口文檔有指定返回內(nèi)容犁罩,應(yīng)按文檔說明返回
二是進(jìn)行消息轉(zhuǎn)發(fā)齐蔽,下面會說到,這里我直接回復(fù)success床估。 也就是說含滴,如果我們要自動回復(fù)用戶發(fā)送的消息,還需要采用其他的方式丐巫,腳指頭想一下谈况,可能是調(diào)用微信特定的接口,事實上就是這樣递胧,具體調(diào)用的是
https://api.weixin.qq.com/cgi-bin/message/custom/send
這個接口碑韵,但是我們可以自己不用去調(diào)用這個接口,這里重點來了缎脾,注意啦WN拧!遗菠!我們引入一個庫如下:
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-miniapp</artifactId>
<version>${weixin-java.version}</version>
</dependency>
這個庫封裝了大部分小程序開發(fā)過程中联喘,需要用到的微信調(diào)用,很方便的辙纬,而且我們自己不用去管那個access_token豁遭!那關(guān)于這個庫的配置什么的,這里我就不說了贺拣,你們自己去網(wǎng)上百度吧蓖谢,這里我們使用庫提供的WxMaMsgService中的sendKefuMsg方法進(jìn)行消息自動回復(fù),至于消息的類型以及怎么創(chuàng)建出消息纵柿,你們可以自己點到方法生命中去摸索蜈抓。
4.怎么轉(zhuǎn)發(fā)消息到人工客服
這時候你會發(fā)現(xiàn)启绰,自動回復(fù)的功能是實現(xiàn)了昂儒,但是人工客服那邊卻收不到消息,這可怎么辦啊委可,那么這個時候我們提供的POST接口就起作用了渊跋,對于需要轉(zhuǎn)發(fā)的消息腊嗡,可以通過進(jìn)行特定的回復(fù)來實現(xiàn),這里我貼下具體代碼:
HashMap<String, Object> resultMap = new HashMap<>();
resultMap.put("ToUserName", fromUserName);
resultMap.put("FromUserName", toUserName);
resultMap.put("CreateTime", Long.parseLong(createTime));
resultMap.put("MsgType", "transfer_customer_service");
String json = JSON.toJSONString(resultMap);
com.alibaba.fastjson.JSONObject result = com.alibaba.fastjson.JSONObject.parseObject(json);
return result.toString();
5.轉(zhuǎn)發(fā)消息到人工客服后服務(wù)端會收不到消息?
到目前為止好像自動回復(fù)和人工回復(fù)的功能都實現(xiàn)了拾酝,但是有沒有發(fā)現(xiàn)燕少,在人工客服介入之后,我們的服務(wù)卻收不到微信給我們轉(zhuǎn)的消息了蒿囤,這是為什么?查閱文檔發(fā)現(xiàn):
https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/customer-message/trans.html
用戶被客服接入以后客们,客服關(guān)閉會話以前,處于會話過程中時材诽,用戶發(fā)送的消息均會被直接轉(zhuǎn)發(fā)至客服系統(tǒng)底挫。當(dāng)會話超過 30 分鐘客服沒有關(guān)閉時,微信服務(wù)器會自動停止轉(zhuǎn)發(fā)至客服脸侥,而將消息恢復(fù)發(fā)送至開發(fā)者填寫的 URL 上建邓。
用戶在等待隊列中時,用戶發(fā)送的消息仍然會被推送至開發(fā)者填寫的 URL 上睁枕。
6.Media_Id怎么獲取
在進(jìn)行image或者miniprogrampage類型消息發(fā)送的時候,是需要一個media_id的官边,那么這個media_id怎么獲取呢?通過調(diào)用
https://api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE
這個接口進(jìn)行文件上傳外遇,這里同樣注意注簿,我們不需要自己調(diào)用,使用上面提到的庫中的WxMaMediaService的uploadMedia方法進(jìn)行文件上傳
7.消息回復(fù)限制
有時候發(fā)消息給用戶會報條數(shù)限制的錯誤,查閱文檔后發(fā)現(xiàn):
https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/customer-message/send.html
當(dāng)用戶和小程序客服產(chǎn)生特定動作的交互時(具體動作列表請見下方說明)臀规,微信將會把消息數(shù)據(jù)推送給開發(fā)者滩援,開發(fā)者可以在一段時間內(nèi)(目前為 48 小時)調(diào)用客服接口,通過調(diào)用 發(fā)送客服消息接口 來發(fā)送消息給普通用戶塔嬉。此接口主要用于客服等有人工消息處理環(huán)節(jié)的功能玩徊,方便開發(fā)者為用戶提供更加優(yōu)質(zhì)的服務(wù)。
這里需要注意的是不能直接發(fā)送消息給新用戶,超過48小時后不能發(fā)送,超過5條不能發(fā)送
8.事件類型處理
有時候不是所有轉(zhuǎn)發(fā)過來的消息我們都需要處理或者轉(zhuǎn)發(fā)到人工那邊,比如客服接入的事件,訂閱消息發(fā)送的事件,所以在代碼里有必要進(jìn)行處理,我這里處理了人工客服接入,進(jìn)行提示
if (MSG_TYPE_EVENT.equals(msgType)
&& !EVENT_KF_CREATE_SESSION.equals(msgEvent)) {
//對于事件一律不轉(zhuǎn)發(fā),除了人工客服接入
return "success";
}
9.發(fā)送的小程序卡片,跳轉(zhuǎn)不到指定頁面?
在小程序內(nèi)部打開客服界面,推給用戶的小程序卡片,用戶在點擊之后是不能直接跳轉(zhuǎn)到指定的頁面的,這個時候需要前端給button加上bindcontact屬性,然后獲取里面的路徑以及參數(shù)進(jìn)行手動跳轉(zhuǎn)就行了谨究。