Senparc.Weixin.Sample.MP源碼剖析

??Senparc.Weixin.Sample.MP是微信公眾號樣例的.NET6源碼,項目配置文件appsettings.json的修改和微信公眾號測試環境的搭建參考:微信公眾號調試與Natapp環境搭建。接下來從項目結構,項目應用和項目源碼3個角度來進行講解。

一.項目結構角度

項目代碼整體結構如下所示:425449ea8c658ea590a52f7e5eea88c9.png重點部分是MessageHandlers消息處理器部分,包括消息上下文、消息處理器和事件處理器。項目啟動起來后的界面為:194adecd940750941818ac0905a7c06b.png

二.應用角度

1.數據流的直觀過程

首先要明白微信客戶端、微信服務器和第三方網站這3者之間的數據流關系,下面通過用戶發送文字為例介紹數據流的過程:

  • 用戶通過微信客戶端發送OpenId

  • 微信服務器就把該文字發送給第三方網站。當然如果沒有第三方網站,就是說沒有對公眾號做二次開發,那么用戶得不到任何回應消息

  • 第三方網站對消息進行處理,比如獲取該用戶的OpenId等相關信息

  • 第三方網站把處理后的消息返回給微信服務器

  • 微信服務器轉發第三方網站的消息給微信客戶端

  • 這樣用戶就收到了微信客戶端回應的消息318993c2a46845299a816973d59e69ab.png微信的消息類型主要包括請求消息和響應消息,請求消息就是微信服務器發送給網站的消息,而響應消息就是網站發送給微信服務器的消息。具體請求消息和響應消息包含的類型如下所示:6c05e338de0514152ad608b0ce899860.png

2.數據流的代碼過程

(1)公眾號消息模擬器
公眾號消息模擬器輸入和輸出內容如下所示:13d4024dde301ef40fc4f9283fcb1596.png

  • URL:通過Natapp映射的域名,即http://fengling.nat300.top -> 127.0.0.1:8080。

  • Token、AppId和AESKey:參考appsettings.json文件。

  • 類型:文本、地理位置、圖片、語音、視頻、時間推送。

  • 內容:OPENID。文本消息處理器對文本進行處理。

(2)Post(PostModel postModel)方法
用戶發送消息后,微信平臺自動Post一個請求到方法public async TaskPost(PostModel postModel),并等待響應XML:617c2742bbfcf7f7e31f1c071a99e1bb.png在這個方法中通過自定義MessageHandler進行處理:

var messageHandler = new CustomMessageHandler(await Request.GetRequestMemoryStreamAsync(), postModel, maxRecordCount);

真正的微信處理過程方法是:

public async Task ExecuteAsync(CancellationToken cancellationToken)

(3)OnTextRequestAsync(RequestMessageText requestMessage)方法
5d8ed0befad556f1c93389c35f678139.png該方法可以根據輸入文本進行響應,可以是匹配關鍵字、正則表達式、不回復,或者默認響應。

三.源碼角度

1.Program.cs代碼

首先介紹下Senparc.Weixin SDK整體注冊的相關代碼:

// 使用本地緩存必須添加
builder.Services.AddMemoryCache();
// Senparc.Weixin 注冊(必須)
builder.Services.AddSenparcWeixinServices(builder.Configuration);
...
var senparcWeixinSetting = app.Services.GetService<IOptions<SenparcWeixinSetting>>()!.Value;
//啟用微信配置(必須)
var registerService = app.UseSenparcWeixin(app.Environment,null /*不為null則覆蓋appsettings中的SenpacSetting配置*/,null /*不為null則覆蓋appsettings中的SenpacWeixinSetting配置*/,register => { /*CO2NET全局配置*/ },(register, weixinSetting) =>{//注冊公眾號信息(可以執行多次,注冊多個公眾號)register.RegisterMpAccount(weixinSetting, "XXX公眾號");});  
......
// 使用公眾號的MessageHandler中間件(不再需要創建Controller)  
app.UseMessageHandlerForMp("/WeixinAsync", CustomMessageHandler.GenerateMessageHandler, options =>
{options.AccountSettingFunc = context => Senparc.Weixin.Config.SenparcWeixinSetting;
});

(1)builder.Services.AddMemoryCache()
框架支持內存緩存、Redis、Memcached等多種緩存策略。
(2)builder.Services.AddSenparcWeixinServices(builder.Configuration)
實現Senparc.Weixin的注冊。
(3)app.UseSenparcWeixin()
該方法集成了CON2ET全局注冊以及Senparc.Weixin SDK微信注冊過程。
(4)app.UseMessageHandlerForMp
使用MessageHandler配置,會默認使用異步方法messageHandler.ExecuteAsync()。

2.WeixinController.cs代碼

(1)public ActionResult Get(PostModel postModel, string echostr)
該方法主要用于微信后臺地址驗證,其它的時候用不到。
(2)public async Task<ActionResult> Post(PostModel postModel)
這個方法就是微信服務器轉發消息[XML]給網站,等待網站處理后返回消息[XML]給微信服務器的過程。
(3)messageHandler.OmitRepeatedMessage = true;

  • 當網站不能及時響應微信服務器的請求時,微信服務器會連續發送多條相同MsgId的消息到網站,以防止丟包。這種情況就需要利用MsgId對消息進行去重,否則網站就會多次執行同一個請求。

  • 需要注意的是,對于多條帶有相同MsgId的請求消息進行多次回復,客戶端也只能收到微信服務器最后一次重發所對應的這條響應消息。

(4)messageHandler.DefaultMessageHandlerAsyncEvent = DefaultMessageHandlerAsyncEvent.SelfSynicMethod;
當同步方法被重寫,且異步方法未被重寫時,嘗試調用同步方法。

3.CustomMessageContext.cs代碼

(1)CustomMessageContext
CustomMessageContext是消息的上下文,寫法基本固定,直接搬過來就可以使用了。消息上下文用于記錄單個用戶發送、接收消息的記錄,就算不同微信公眾號同時發送不同的消息,兩者之間并不會有任何的干擾,因為兩者的上下文是完全隔離的。
(2)CustomMessageContext_MessageContextRemoved
當上下文過期,被移除時觸發的時間。根據WeixinContext中的算法,這里的過期消息會在過期后下一條請求執行之前被清除。

4.CustomMessageHandler.cs代碼

CustomMessageHandler和CustomMessageHandler_Events是CustomMessageHandler類的2個部分類,前者處理非事件類型的消息,比如發送文本、圖像等,而后者處理事件類型的消息,比如點擊事件、訂閱事件(訂閱及取消訂閱)等。af2378d3abad265632d8a13424f1c192.png這里的請求消息都是普通消息:638fe63d598a32cc2c3c74b9471e628a.png

5.CustomMessageHandler_Events.cs代碼

7e6730179d780e31391b95c574378f6c.png這里的請求消息都是事件推送消息,而事件推送消息又分為3大類型:常規事件[公眾號基礎功能返回事件],菜單事件[各種類型的公眾號菜單返回事件],應用事件[應用模塊返回事件]:53e996440ca9fe372ecbbfa3e929ba6a.png

參考文獻:
[1]Senparc.Weixin.Sample.MP.sln:WeiXinMPSDK\Samples\MP\Senparc.Weixin.Sample.MP.sln
[2]Senparc.Weixin SDK源碼:https://github.com/JeffreySu/WeiXinMPSDK
[3]Senparc.Weixin.MP SDK微信公眾平臺開發教程(二十三):在.NET Core 2.0/3.0中使用MessageHandler中間件:https://www.cnblogs.com/szw/p/Wechat-MessageHandler-Middleware.html
[4]微信開發深度解析:公眾號、小程序高效開發秘籍:http://book.weixin.senparc.com/BookHelper
[5]微信公眾平臺接口調試工具:https://mp.weixin.qq.com/debug

人工智能干貨推薦661186ce9a7467fc3035342b763f4c7c.jpeg專注于人工智能領域的技術分享

游戲元宇宙ef4a78a964cd66266ba99865e01b85d3.jpeg專注于游戲領域的技術分享

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/284333.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/284333.shtml
英文地址,請注明出處:http://en.pswp.cn/news/284333.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

解決java.lang.NoClassDefFoundError: org/aopalliance/intercept/MethodInterceptor問題

hibernate整合spring當在spring配置文件中加入如下代碼 <!--2.配置事務屬性,需要事務管理器--><tx:advice id"txAdvice" transaction-manager"transactionManager"><tx:attributes><tx:method name"get*" read-only"t…

Packagist / Composer 中國全量鏡像

Packagist / Composer中國全量鏡像 本鏡像共緩存了 186695 個項目(package)、Millions 個(zip)安裝包。最后同步時間&#xff1a;2018/1/28 上午11:01:13 。Composer 最新版本&#xff1a;1.6.2 立即使用 贊助 Packagist 鏡像使用方法 還沒安裝 Composer 嗎&#xff1f;請往…

mock.js使用

一、Mock.js入門 1&#xff0e; 什么是mock.js? Mock.js &#xff08;官網http://mockjs.com/&#xff09;是一款模擬數據生成器&#xff0c;旨在幫助前端攻城獅獨立 于后端進行開發&#xff0c;幫助編寫單元測試。提供了以下模擬功能&#xff1a; 1,根據數據模板生成模擬數據…

面向對象——概念(成員變量、靜態變量、成員方法、靜態方法、垃圾回收機制、重載、包)...

靜態變量和成員變量的區別&#xff1a; 1、成員變量描述的是對象的特征&#xff0c;包含在對象之中。不同的對象成員變量彼此獨立。一個對象成員變量的改變&#xff0c;不會影響其他對象。 靜態變量獨立在對象之外&#xff0c;是所有對象共享的變量。靜態變量改變后會影響所有對…

【ArcGIS微課1000例】0042:ArcGIS自帶取色器工具的妙用

在ArcGIS中作圖時,通常要進行顏色對照填充,輸入特定的RGB值,本文介紹ArcGIS自帶取色器工具的妙用,及第三方顏色拾取工具。 文章目錄 一、ArcGIS自帶取色器二、第三方取色器工具一、ArcGIS自帶取色器 很多人可能不知道,ArcGIS中自帶取色器工具,如下圖所示。 當然了,自帶…

第一輪復習完畢,kmp走起

//代碼via:http://blog.csdn.net/v_JULY_v/article/details/6111565 //簡單思路via:http://study.163.com/course/courseLearn.htm?courseId468002#/learn/video?lessonId1024414&courseId468002 1 #include<iostream>2 #include<string>3 #include<vecto…

微信.NET SDK-Senparc資料整理

微信生態系統包括微信公眾號、小程序、微信支付、微信開放平臺、企業微信、小游戲等&#xff0c;官方提供了很多的API接口。Senparc是目前使用最廣泛的微信.NET SDK&#xff0c;同時支持支持.NET Framework 4.5/.NET Core 2.x/.NET Core 3.x/.NET 5/.NET 6。由于在微信生態開發…

7 種提升 Spring Boot 吞吐量神技

目錄 二、增加內嵌Tomcat的最大連接數 三、使用ComponentScan()定位掃包比SpringBootApplication掃包更快 四、默認tomcat容器改為Undertow&#xff08;Jboss下的服務器&#xff0c;Tomcat吞吐量5000&#xff0c;Undertow吞吐量8000&#xff09; 五、使用 BufferedWriter 進…

Atitit.ati?orm的設計and架構總結?適用于java?c#?php版

Atitit.ati orm的設計and架構總結 適用于java c# php版 1. Orm的目標 1 1.1. 動態obj 1 1.2. Hb的api(meger,save,update,del) 1 2. Orm的概念 1 3. 動態obj 2 4. 參考 4 1. Orm的目標 1.1. 動態obj 1.2. Hb的api(meger,save,update,del) 2. Orm的概念 saveOrUpdate后的對象會納…

【ArcGIS微課1000例】0043:ArcGIS縮略圖的創建及應用

縮略圖通常出現在地圖文檔中&#xff0c;便于在啟動頁面中快速打開指定的地圖文檔&#xff0c;提高效率。 文章目錄一、縮略圖預覽二、縮略圖創建一、縮略圖預覽 打開ArcMap軟件&#xff0c;彈出啟動窗口&#xff0c;在最近打開的文檔中&#xff0c;可以看到兩類&#xff0c;一…

JSP簡單登錄系統

Login登陸界面 <body> 登陸 <% session.invalidate();%> <form action"TestPW.jsp" method"post">用戶名<input type"text" name"username"> 密碼<input type"password" name"password&quo…

手動從0搭建ABP框架-ABP官方完整解決方案和手動搭建簡化解決方案實踐

本文主要講解了如何把ABP官方的在線生成解決方案運行起來&#xff0c;并說明了解決方案中項目間的依賴關系。然后手動實踐了如何從0搭建了一個簡化的解決方案。ABP官方的在線生成解決方案源碼下載參考[3]&#xff0c;手動搭建的簡化的解決方案源碼下載參考[4]。一.ABP官方在線生…

Java捕獲并處理線程失敗拋出的異常

使用 UncaughtExceptionHandler 示例代碼如下&#xff1a; Thread.UncaughtExceptionHandler handler new Thread.UncaughtExceptionHandler() { public void uncaughtException(Thread th, Throwable ex) {System.out.println("Uncaught exception: " ex);} }; Th…

【ArcGIS微課1000例】0044:ArcGIS使用山體陰影顯示DEM的3種方法

本文講解了ArcGIS使用山體陰影顯示DEM的3種方法:“影像分析”窗口、使用山體陰影效果和山體陰影效果工具的不同之處。 文章目錄 一、“影像分析”窗口二、使用山體陰影效果三、山體陰影工具一、“影像分析”窗口 使用山體陰影顯示 DEM 的方法有兩種。最簡單并且最具交互效果的…

區塊鏈每日投資指南(0129)-證監會副主席表示數字貨幣需要監管

上一周的走勢依然是工作日下跌&#xff0c;周末拉升的結局。這主要原因依然是&#xff0c;周末不上班。最終政策出爐之前&#xff0c;市場恐怕還將繼續震蕩。下周的工作日恐怕會重演下跌的節奏。但是經過了17號&#xff0c;23號&#xff0c;26號三次筑底來看&#xff0c;如果政…

藍綠發布、滾動發布、灰度發布,有什么區別?

在項目迭代的過程中&#xff0c;不可避免需要”上線“。上線對應著部署&#xff0c;或者重新部署&#xff1b;部署對應著修改&#xff1b;修改則意味著風險。目前有很多部署發布的技術, 這兒將常見的做一個總結。 上面所說難免有些抽象, 舉一個情景例子, 加入你是微博項目負責…

iOS 音頻開發

音頻基礎知識 組成 音頻文件的組成&#xff1a;文件格式(或者音頻容器) 數據格式(或者音頻編碼)。 文件格式(或音頻容器)是用于形容文件本身的格式。 我們可以通過多種不同的方法為真正的音頻數據編碼。例如CAF文件便是一種文件格式&#xff0c;它能夠包含MP3格式&#xff0c;…

【ArcGIS微課1000例】0045:ArcGIS制圖模板的自定義與使用方法

怎樣在ArcGIS中保存地圖模板以在地圖制圖與打印之前使用呢? 文章目錄 一、地圖模板簡介二、地圖模板創建1. 創建模板2. 創建縮略圖3. 保存模板三、地圖模板使用一、地圖模板簡介 使用ArcMap打開一個已有的地圖模板,【文件】→【新建】,任選一個模板,這里選擇一個傳統模板。…

api 接口開發理論 在php中調用接口以及編寫接口

如&#xff1a;http://localhost/openUser.php?actget_user_list&typejson 在這里openUser.php相當于一個接口&#xff0c;其中get_user_list 是一個API&#xff08;獲取用戶列表&#xff09;&#xff0c;講求返回的數據類型為JSON格式。 你只需要在你PHP代碼中執行這條鏈…

怎么樣的框架對于開發者是友好的?

云原生離.NET開發到底有多遠&#xff1f;云原生的概念由來不久&#xff0c;故事從“上云”開始&#xff0c;伴隨dorker、k8s等技術的推出&#xff0c;以及CNCF與各大云廠商的共同加持&#xff0c;云原生逐漸被大家所熟知。云原生不依賴具體的云&#xff0c;不管公有云還是私有云…