天天看點

SAP系統和微信內建的系列教程之七:使用Redis存儲微信使用者和公衆号的對話記錄

這是Jerry 2020年的第88篇文章,也是汪子熙公衆号總共第269篇原創文章。

本系列的英文版Jerry寫作于2017年,這個教程總共包含十篇文章,發表在​​SAP社群​​上。

最近有不少朋友在微信上向我咨詢SAP系統和微信公衆号內建的問題,是以我把當時寫的英文版翻譯成中文,重新釋出在我的公衆号上。

需要注意的是,時隔三年,微信公衆号的開發流程可能有所變化,請大家自行鑒别。和微信公衆号內建的系統,我三年前選擇的是SAP Cloud for Customer.

自己營運過公衆号的朋友們都知道,粉絲和公衆号的對話消息,隻能保持5天。是以就萌生了一個需求:将粉絲和公衆号的聊天記錄持久化,比如儲存到某資料庫裡,過後可以随時讀取出來,進行進一步分析。

SAP系統和微信內建的系列教程之七:使用Redis存儲微信使用者和公衆号的對話記錄

本文會介紹,将粉絲和公衆号的對話,儲存到Redis(一個Key-Value存儲系統)的實作步驟。

Redis 是一個高性能的key-value資料庫。 redis的出現,很大程度補償了memcached這類key/value存儲的不足,在部分場合可以對關系資料庫起到很好的補充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等用戶端,使用很友善。

Redis支援主從同步。資料可以從主伺服器向任意數量的從伺服器上同步,從伺服器可以是關聯其他從伺服器的主伺服器。這使得Redis可執行單層樹複制。存盤可以有意無意的對資料進行寫操作。由于完全實作了釋出/訂閱機制,使得從資料庫在任何地方同步樹時,可訂閱一個頻道并接收主伺服器完整的消息釋出記錄。同步對讀取操作的可擴充性和資料備援很有幫助。

首先在微信app裡同微信公衆号對話:

SAP系統和微信內建的系列教程之七:使用Redis存儲微信使用者和公衆号的對話記錄

上圖展示的微信公衆号的智能回複功能,其實作方式,在本系列之前的文章:​​SAP系統和微信內建的系列教程之二:如何通過微信公衆号消費API​​ 裡做過介紹。

按照本系列第五篇文章:​​如何将SAP UI5應用嵌入到微信公衆号菜單中​​ 裡介紹的方法,給公衆号增添兩個新的菜單:Review和Delete.

SAP系統和微信內建的系列教程之七:使用Redis存儲微信使用者和公衆号的對話記錄

Review菜單負責把Redis裡存儲的聊天記錄讀取出來,展示在微信app裡;Delete菜單負責清空Redis裡的資料。

點選Review菜單之後的效果如下圖所示:

四個字段的解釋:

  • from:消息的發送方
  • to: 消息的接收方
  • question:粉絲向公衆号提出的問題
  • answer: 公衆号調用圖靈API,傳回的答複

點了Delete菜單之後的效果:聊天記錄被清空。

SAP系統和微信內建的系列教程之七:使用Redis存儲微信使用者和公衆号的對話記錄

下面是實作步驟。

很多雲平台都提供了對Redis的支援,這個系列我選擇的雲平台是Heroku.

打開HeroKu的Redis控制台,從應用清單裡選擇要啟用Redis服務的應用:wechatjerry.

SAP系統和微信內建的系列教程之七:使用Redis存儲微信使用者和公衆号的對話記錄

Heroku預設的Redis plan:Hobby Dev僅用于開發用途,完全免費。

SAP系統和微信內建的系列教程之七:使用Redis存儲微信使用者和公衆号的對話記錄

點選Provision按鈕之後,在Heroku應用的控制台裡,能看到Redis已經出現在應用wechatjerry的Addons清單裡。

SAP系統和微信內建的系列教程之七:使用Redis存儲微信使用者和公衆号的對話記錄

應用變量REDIS_URL包含了目前可用的Redis執行個體的url,我們之後的nodejs代碼裡,會使用這個url通路該Redis執行個體。

SAP系統和微信內建的系列教程之七:使用Redis存儲微信使用者和公衆号的對話記錄

調用微信API給公衆号建立兩個新的菜單,Review和Delete,使用如下的payload:

SAP系統和微信內建的系列教程之七:使用Redis存儲微信使用者和公衆号的對話記錄

然後在微信消息伺服器實作裡,在将回複通過下圖第22行的replyMessage函數推送給微信使用者之前,插入21行的conversationLogService子產品的log函數調用,将對話記錄存儲到Redis中。

SAP系統和微信內建的系列教程之七:使用Redis存儲微信使用者和公衆号的對話記錄

conversationLogService實作的完整代碼,在我的​​Github​​上。

裡面調用了nodejs版的一個開源Redis用戶端:

​​https://github.com/NodeRedis/node-redis​​

SAP系統和微信內建的系列教程之七:使用Redis存儲微信使用者和公衆号的對話記錄

最後,實作Review和Delete公衆号菜單的點選響應函數,分别調用conversationLogService的getLog和deleteLog方法,執行對應的Redis操作。

SAP系統和微信內建的系列教程之七:使用Redis存儲微信使用者和公衆号的對話記錄

本系列的下一篇文章,會介紹如何将地圖控件內建到微信公衆号中去,感謝閱讀。

更多Jerry的原創文章,盡在:"汪子熙":

SAP系統和微信內建的系列教程之七:使用Redis存儲微信使用者和公衆号的對話記錄