微信開發系列----04:消息機制,瞭解自定義文本響應

来源:http://www.cnblogs.com/netxiaohui/archive/2016/08/03/5733095.html
-Advertisement-
Play Games

放暑假了,生活基本穩定下來,項目的剩餘部分也要開始慢慢的研究了。 項目GitHub地址: https://github.com/Andyahui/xgyxsh_WeiXin SDK的GitHub地址:https://github.com/JeffreySu/WeiXinMPSDK/ SDK官方介紹博 ...


放暑假了,生活基本穩定下來,項目的剩餘部分也要開始慢慢的研究了。

項目GitHub地址:  https://github.com/Andyahui/xgyxsh_WeiXin

SDK的GitHub地址https://github.com/JeffreySu/WeiXinMPSDK/

SDK官方介紹博客http://www.cnblogs.com/szw/archive/2013/05/14/weixin-course-index.html

一:關於SDK中的消息處理機制說明

    之前的一篇博文中有兩個關於消息的方法,現在就讓我們真正的瞭解它,因為微信伺服器是轉發客戶端的消息繼而發送給網站伺服器,那這就存在弊端,它每一次只能發送一個,而且是每一個用戶發送一個。這樣伺服器端的session就沒有辦法保存使用,這樣我們就沒有辦法取到用戶的個人信息。

1:瞭解Session和Cookie

    SDK幫我們封裝了所有用戶的上下文實體的容器(全局上下文)WeixinContext<TM>,保存的是所以請求對象的信息,這樣我們就可以在同一個應用中創建多個上下文實體。既然都有全局上下文信息了,那麼想必單個用戶的信息也就可以創建了,MessageContext就是用於保存單個用戶的上下文信息(Wike),可以在這裡獲取用戶的個人信息。保存在WeixinContent的MessageCollection及MessageQueus對象中。

二:xx學院官方微信的分析

    我們學校的官方微信是白老大(博客)開發的,當時參加了市裡面的比賽還得了獎,我們在老大的帶領下也做了很多關於微信的項目,這幾天就想好好的學習下微信,就一直在分析裡面的代碼,有了自己的一些想法。

    現在伺服器端可以進行簡單的響應了,其實老大的微信開發前期也就是實現了用戶在客戶端發送消息,服務端響應等功能,只是他在後臺管理裡面添加文本素材,圖文素材,功能管理,這些功能,其實意思就是想通過我們管理人員將我們自己需要響應的東西手動進行添加,明確需要回覆哪些東西。

image

     這裡的這些管理就是我們經常做的CRUD的功能,主要是想讓管理員在後臺中可以進行配置,也方便管理。其實這裡主要的內容是在功能設置裡面,比如現有功能有查詢成績,查詢課表,查詢圖書信息等,很是實用,他在這裡面是將我們的各種外部的東西都進行的封裝,比如查詢成績,是利用爬蟲將學生管理系統中的成績拉下來的,之後只要用戶在客戶端發送任何有關於成績的字元就進行一次爬取;這樣保證了數據的實時性,其實我覺得這裡可以利用時間來將成績保存在資料庫中,這樣我們不用每次接收到請求就去爬取數據,因為成績的更新是有時間的,主要是在期末等幾個時間段來添加成績,其餘時間的成績是不變的。很多都是這樣的,對於老大當時的技術做到這樣已經很牛逼了;之後我們在一起開發別的項目的時候基本上在SDK的幫助下把微信80%的功能都實現了,也不得不說SDK的強大。

三:本地存儲一些回覆內容

      --->想法是將回覆給用戶的內容可以在我們的管理系統中實現後臺可配置,這樣就方便編輯人員發佈內容。

     其實就是按照微信官方的文檔內容來編寫我們的實體。這樣做的好處就是我們要是需要回覆直接取資料庫中的內容就OK。

    就拿一個文本回覆看就好了。這裡有請求和響應兩個類(請求只有一個,響應很多,對應微信的響應)

  • 請求RequestMessage
 /// <summary>
    /// 請求消息基類
    /// </summary>
    public class RequestMessage : BaseEntity
    {
        /// <summary>
        /// 用戶發來的關鍵字
        /// </summary>
        public virtual string KeyWord { get; set; }
        /// <summary>
        /// 消息類型
        /// </summary>
        public virtual RequestMsgType MsgType { get; set; }
        /// <summary>
        /// 響應消息的類型
        /// </summary>
        public virtual ResponseMsgType ResponseMsgType { get; set; }
        /// <summary>
        /// 響應文本消息的ID
        /// </summary>
        public virtual Guid ResponseTextMessageId { get; set; }
        /// <summary>
        /// 響應文本消息
        /// </summary>
        public virtual ResponseTextMessage ResponseTextMessage { get; set; }
        /// <summary>
        /// 響應圖文消息ID
        /// </summary>
        public virtual Guid ResponseNewsMessageId { get; set; }
        /// <summary>
        /// 響應圖文消息
        /// </summary>
        public virtual ResponseNewsMessage ResponseNewsMessage { get; set; }
        /// <summary>
        /// 響應方法消息ID
        /// </summary>
        public virtual Guid ResponseMethodId { get; set; }
        /// <summary>
        /// 響應方法消息
        /// </summary>
        public virtual ResponseMethodMessage ResponseMethodMessage { get; set; }
    }
  • 響應ResponseTextMessage
 /// <summary>
    /// 響應的文本消息
    /// </summary>
    public class ResponseTextMessage : BaseEntity
    {
        public ResponseTextMessage()
        {
           // this.RequestMessage = new Collection<RequestMessage>();
        }
        /// <summary>
        /// 文本內容
        /// </summary>
        public virtual string Content { get; set; }
        /// <summary>
        /// 響應消息分類
        /// </summary>
        public virtual ResponseMsgType ResponseMsgType { get; set; }
        /// <summary>
        /// 一對多屬性配置----相當於導航屬性
        /// </summary>
        public virtual ICollection<RequestMessage> RequestMessage { get; set; }
    }
  • 一些公用的枚舉值
    /// <summary>
    /// 用戶的Request類型
    /// </summary>
    public enum RequestMsgType : int
    {
        /// <summary>
        /// 用戶發來文字時
        /// </summary>
        Text = 0,//文本
        Voice = 1,//語音
        Image = 2,//圖片
        Menu = 3,//點擊菜單
        Subscription = 4,//訂閱
        NoMatch = 5,//沒有匹配時
    }
    /// <summary>
    /// 響應消息類型
    /// </summary>
    public enum ResponseMsgType : int
    {
        Text = 0,
        News = 1,
        Music = 2,
        Image = 3,
        Method = 4
    } 

   通過上面的代碼可以發現RequestMessage和ResponseTextMessage之間存在著一對多的關係,也就是一個響應對應於多個請求。這隻是裡面的一個,還有圖文消息,圖片消息,地址位置消息,Music消息等,都可以進行這樣的設置,只要我們將其保存到資料庫中就OK了。

此時應該設置其Text的CRUD了,這樣就可以保存到資料庫中了。最終實現這樣的效果就可以進行下一步自定義響應了。

01

四:自定義文本響應

     我們現在已經在資料庫中添加了文本的內容,但是要實現自定義回覆,就需要考慮一些邏輯,我們試想一下:用戶為什麼需要自定義回覆,肯定是想要知道一些內容,方便,快捷,比如我們假設用戶發送你好,那麼我們就回覆你好,這樣就行了。還有就是對於學生成績,課表的查詢,也是通過這樣的方式來實現的,用戶發送特定的文字,我們在後端得到用戶發送的文字查看裡面的內容,要是含有成績或者課表那麼就調用相應的方法,將其得到的成績或者課表打包成html發送給微信伺服器,接著發送給用戶客戶端。那麼這裡的邏輯在哪裡寫呢,之前我們重寫了很多sdk中的基類,就在那裡面。

        /// <summary>
        ///1: 處理用戶發送過來的文字消息。重寫OnTextRequest方法。    
        /// </summary>
        /// <param name="requestMessage">請求消息</param>
        /// <returns></returns>
        public override IResponseMessageBase OnTextRequest(RequestMessageText requestMessage)
        {
            //CreateResponseMessage<類型>根據當前的RequestMessage創建指定類型的ResponseMessage;創建相應消息.
            var responseMessage = base.CreateResponseMessage<ResponseMessageText>();
            if (requestMessage.Content=="客服")
            {
                //多客服功能。
                return this.CreateResponseMessage<ResponseMessageTransfer_Customer_Service>();
            }
            else
            {                
                //普通文本功能。
                responseMessage.Content = "您的OpenID是:" + requestMessage.FromUserName + "。\r\t您發送了文字信息:" +
                                      requestMessage.Content + "註意了,我是張輝";
                return responseMessage;                
            }                        
        } 

這裡只是簡單的利用if…else來實現兩種識別。和前面說的原理一樣,先是查看請求中內容是否包含需要辨別的文字,接著調用對應的方法,從資料庫中取出對應的數據,這樣就可以實現我們的可配置。要是之後我們需要回覆的內容多,那就需要使用switch語句來進行分支的多選擇,這樣就很方便了。

---------------------------期待之後的完整版自定義回覆吧------------------------


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 簡介: .Net中Process類功能十分強大。它可以接受程式路徑啟動程式,接受文件路徑使用預設程式打開文件,接受超鏈接自動使用預設瀏覽器打開鏈接,或者打開指定文件夾等等功能。 想要使用Process類之前,需要先引用using System.Diagnostics; Process類用法1: Pr ...
  • 一、前言 最近忙於公司的線上升級項目,一個人要負責公司四大產品的線上升級,這四個產品是在Revit中以插件形式存在的,目前基於WCF來實現。等客戶總量突破5萬了,再重新用socket實現。 由於有伺服器併發操作,所以要好好研究WCF的InstanceContext與ConCurrencyMode,找 ...
  • 前言 Protocol Buffers (下麵簡稱PB)是一種輕便高效的結構化數據存儲格式,可以用於結構化數據串列化,很適合做數據存儲或 RPC 數據交換格式。它可用於通訊協議、數據存儲等領域的語言無關、平臺無關、可擴展的序列化結構數據格式。它支持多種語言,比如C++,Java,C ,Python, ...
  • 喜迎Win10周年版更新,湖南衛視旗下唯一官方視頻平臺《芒果TV》近日向Win10商店提交了芒果TV UWP V3.1.0版,這次不僅在上一版(V3.0.0)的基礎上完善了用戶呼聲最高的手機版視頻離線下載功能,而且為追劇達人帶來了跳過片頭片尾的貼心福利。 ...
  • 概述 XDT是Asp.net 4.0中的一個新特性,可以讓使用者在Web項目中在不同的生成類型下,快速切換配置文件(如在debug場景下使用測試配置資料庫,在Release場景下使用正式配置資料庫)。 但在非web項目中,VS並未提供如此方便的功能。這時如果我們同樣想使用xdt transforms ...
  • 今天編碼時遇到了一個問題,大致描述就是去讀取excel中的某列,如圖: 這些是文件名,類似一個對應關係表,然後代碼去查找對應的文件。 斷點調試出來的內容也是正常,但是都匹配不到(文件真實存在),在打出log時發現了端倪: 有些空格變成了問號。難道是我的打開方式不對麽。。。? 嘗試了幾種不同編碼打開, ...
  • 一、 通過AccountManagement 程式集(System.DirectoryServices.AccountManagement) acountManagement 包含有: 1. UserPrincipals 2. GroupPrincipal 3.ComputerPrincipals ...
  • 最近學習xamarin。剛好 手上有一個lumia 930.所以試一試把uwp app部署到手機上,並真機調試一把。 目前環境: 1.開發pc電腦是win10,版本1607.加入了insider,所以版本比較高。 2.手機是 lumia 930.版本 1511,手機未加入insider,所以是穩定版 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...