GitHub:https://github.com/iccb1013/Sheng.WeixinConstruction
因為個人精力時間有限,不會再對現有代碼進行更新維護,不過微信接口比較穩定,經測試至今沒有變化,功能依然全部可用,你可以在此基礎上,二次開發,完成你的業務功能,也可以抽取本平台中的代碼復用在你的項目中,請遵循 MIT 開源協議保留我的版權聲明和網站鏈接即可。
GitHub:https://github.com/iccb1013/Sheng.WeixinConstruction.WeixinContract
微信協議包裝的項目還有一個單獨的工程,這個工程的版本稍新,我會進行一定的更新維護,如最近增加了幾個小程序開發需要使用到的接口。但是注意因為代碼結構經過優化調整,直接引用到升訊威微信平台中,需要修改一些類的引用和名稱。
升訊威微信營銷系統開發實踐系列
升訊威微信營銷系統開發實踐:(1)功能概要與架構設計
升訊威微信營銷系統開發實踐:(2)中控服務器的詳細設計
升訊威微信營銷系統開發實踐:(3)功能介紹與此項目推廣過程的一些體會
升訊威微信營銷系統開發實踐:(4)源代碼結構說明 與 安裝部署說明
這是2015年到2016年間業余時間寫的一個項目,最初的期望是實現一個微信雲平台,類似於微盟,只需要商家掃碼綁定即可提供整套的營銷功能。
我的定位是專門服務於線下商家,例如電影院、商業中心、各類線下門店等,線下商家的一些業務場景和業務流程是比較特殊的,和純現上的公眾號運營不盡相同。 這是我最初想找到的切入點,在系統初步上線后,自己也試着做了推廣,包括百度關鍵詞、線下陌拜都嘗試過,在之前的博客中我也簡單討論過一些細節。
我在之前的博客中開源了全部工程源代碼和數據庫腳本,陸續有朋友問我怎樣安裝部署,因為時間的關系我只能有一搭沒一搭的回答一些零散的問題,對不住大家。前些天幫一個小兄弟把整個系統完整的部署起來並運行成功,我想索性借着這個機會,把這個過程整理出來,寫成博客分享,這樣大家從 Github 上拿到工程就不會不知從何開始。
要了解升訊威微信營銷系統的架構設計,請參閱之前我發表的博客,幫助你快速了解代碼實現層面的體系結構。
本文不再對宏觀結構進行贅述,只從代碼細節方面介紹幾個關鍵的地方,幫助你快速了解代碼的具體實現。
功能概要:
有關架構設計,和詳細功能介紹,請參閱我之前的博客文章。
升訊威微信營銷系統開發實踐:(1)功能概要與架構設計
升訊威微信營銷系統開發實踐:(2)中控服務器的詳細設計
微信端效果:
更詳細的功能介紹請參閱:
升訊威微信營銷系統開發實踐:(3)功能介紹與此項目推廣過程的一些體會
在本文中我將分為兩個部分,第一部分詳細介紹代碼層面的主要結構,第二部分詳細介紹安裝部署的方法。
一)代碼結構
從 Github 上獲取代碼后,源代碼目錄結構如圖所示:
解決方案說明:
Sheng.WeixinConstruction.Admin.sln
超級管理員、系統運維人員使用的超級管理后台。
此部分功能開發並未完成,目前只有基本框架和微主頁模版的簡單管理功能。
Sheng.WeixinConstruction.Container.sln
鑒權中控服務服務。
負責管理和維護第三方平台自己的 AccessToken 和對接過來的所有公眾號的 AccessToken。
Sheng.WeixinConstruction.FileService.sln
文件服務器。
提供獨立文件存儲服務,並提供了部分與微信公眾號素材管理的功能。
可以部署多個不同的文件服務器實例,可以部署CDN內容分發。
Sheng.WeixinConstruction.sln
管理后台和微信端。
管理后台用於向升訊威微信管理系統的一般用戶提供服務,在此注冊賬戶,對接自己的公眾號,並使用升訊威微信營銷系統的一系列功能。
微信端用於向所對接的公眾號提供服務,在微信公眾號上訪問的站點。
Sheng.WeixinConstruction.WindowsService.sln
Windows 服務
主要用來執行一些定時服務。
下面主要對解決方案 Sheng.WeixinConstruction.sln 和 Sheng.WeixinConstruction.Container.sln 進行說明,其它幾個解決方案都比較簡單,不作贅述。
打開 Sheng.WeixinConstruction.sln 之后,結構如圖:
Sheng.WeixinConstruction.Management.Shell
后台站點
Sheng.WeixinConstruction.Client.Shell
微信端站點
1)Sheng.WeixinConstruction.Management.Shell
對於管理后台,一個重要的功能是在用戶注冊賬號后,實現與微信公眾號的對接。
打開 Controllers 目錄下的 SettingsController.cs ,並展開“對接”region。
Docking 與 DockingDemo 對應着用戶對接公眾號的頁面。 DockingDemo是發起授權頁的體驗URL:用於騰訊審核人員前往授權頁體驗,確認流程可用性。此為騰訊要求。
AuthorizerEntity 表示授權公眾號的信息,代碼中有詳細的注釋,可自行查閱:
在用戶對接公眾號時,需要先獲取一個預授權碼,打開 Areas /Api/ Controllers 目錄下的 SettingsController.cs,找到 GetPreAuthCode 方法,此方法用於獲取預授權碼:
在 Docking.cshtml 這個畫面調用此接口,當成功獲取預授權碼之后,將頁面轉到騰訊要求的授權頁面,並給出一個用於完成授權的回調頁面,當公眾號所有者通過授權時,騰訊將把頁面轉到此回調頁面,並傳回授權碼:
打開 Controllers目錄下的 SettingsController.cs,找到 AuthorizationCallback 這個授權回調方法,在此完成公眾號的授權對接:
這里留意一個細節:
在系統中創建公眾號授權信息,並開始維護它的 AccessToken ,並不是在后台中完成,而是調用鑒權中控服務器的接口,通知鑒權中控服務器來實現的:
_createAuthorizerUrl 是鑒權中控服務器的地址:
至此,就完成了微信第三方平台,向公眾號提供服務的授權對接工作。
管理后台的其它功能同其它管理系統后台並無太大差別,可自行查閱代碼。
2) Sheng.WeixinConstruction.Client.Shell
微信端除了向所對接的公眾號提供服務外,還負責與微信官方后台行進消息通信,微信官方下發的消息,是發到Sheng.WeixinConstruction.Client.Shell,而不是 Sheng.WeixinConstruction.Management.Shell。
所以最重要的是首先要處理好微信推送過來的消息,打開 Controllers 目錄下的 ThirdPartyWeixinApiController.cs:
Handler 接口用於接收公眾號消息與事件推送。
當普通微信用戶向公眾賬號發消息時,微信服務器將POST消息的XML數據包到此接口。
在微信用戶和公眾號產生交互的過程中,用戶的某些操作會使得微信服務器通過事件推送的形式通知,在開發者中心處設置的服務器地址,從而開發者可以獲取到該信息。其中,某些事件推送在發生后,是允許開發者回復用戶的,某些則不允許。作為第三方平台運營時,AppId 會作為URL的一部分帶過來,如:
http://wxc.shengxunwei.com/ThirdPartyWeixinApi/Handler/$APPID$
其中$APPID$在實際推送時會替換成所屬的已授權公眾號的appid。
推送消息過來時,URL如下格式:
http://wxc.shengxunwei.com/WeixinApi/Handler/F6AAD430-CA1F-4AFD-B2B0-6E0D2FABB622
?signature=84001ea92e2f369642e861d557b9f4c6781db1ca
×tamp=1446393828
&nonce=1291578710
&encrypt_type=aes
&msg_signature=3ed4a96dbc50d491664ec3f425eb7fc1f088ac9b
在接收到POST過來的消息后,第一步需要先解密,然后找到這條消息應該歸屬哪個微信公眾號,找到它對應的公眾號上下文,把解密后的消息交給它處理。
ClientDomainContext 是微信端使用的公眾號上下文,有關公眾號上下文的詳細說明,請參閱:
升訊威微信營銷系統開發實踐:(2)中控服務器的設計
http://blog.shengxunwei.com/Home/Post/1acfa439-8fef-4609-8e74-7057c9f15a3b
在 ClientDomainContext 中,引用了一個 XMLMessageReceiverFactory 的工廠類用於處理微信推送過來的XML消息:
在這個工廠類中,_receiverList 保存了處理不同消息所需要的具體實現,這些消息接收器的實現,定義在Sheng.WeixinConstruction.Client.Core:
那么當收到微信推送的消息時,只需找到對應公眾號的上下文對象,調用它的 Handle方法,根據消息的類型,找到對應的處理器類,交給它處理,就可以了,這就是消息處理的過程。
在微信端,還有一件非常重要的工作,就是對公眾號關注者的身份獲取,OpenId和用戶信息,例如:
當公眾號的關注者(粉絲)訪問微信端的頁面時,需要獲取關注者的個人身份信息,OpenId和其它信息,在此基礎之上,與我們自己后台的信息關聯。
打開 Controllers 目錄下的 ClientBasalController,微信端視圖控制器類都繼承此基類:
當公眾號的關注者訪問微信端的頁面時,首先控制器基類會獲取該關注者的會員信息上下文和對應的公眾號上下文:
在OnActionExecuting 方法中,按微信的協議要求完成對關注者身份的網頁授權。
這里要先了解所服務公眾號的域名解析細節,假設我們將微信端的域名配置為 wxc.shengxunwei.com,理論上我們讓所有的公眾號直接使用此頁面,在URL后跟上公眾號的ID即可,但是這樣有一個重要的缺陷,如果平台所服務的公眾號,有一個公眾號存在違規行為,被微信查封,會導致我們整個平台被封,微信會直接把 wxc.shengxunwei.com 這個域名查封。所以我們必須泛解析的方式,讓所服務的公眾號使用 appid.wxc.shengxunwei.com 這樣的域名來避免這種情況。如何在安裝部署升訊威微信營銷系統時配置泛解析域名,請參閱安裝部署相關的詳細說明。
網頁授權的過程在 OnActionExecuting 方法中有詳細的注釋說明,可對照着代碼來看:
注意對關注者身份的網頁授權是跳轉到微信官方授權頁面進行的,完成授權后,會跳轉回指定的回調頁面,在 Areas/Api/Controllers 目錄下的 ThirdPartyWeixinApi/OAuthCallback,代碼中有詳細的注釋,請自行查閱:
至此,對關注者身份的網頁授權完成。
還有一個前端頁面 JS授權的方式,在微信支付時會涉及到,你可以找到 ClientDomainContext下的GetJsApiConfig方法來查閱:
此外,微信端也實現了微信支付功能,用於會員充值或積分商品購買商品:
微信支付的流程簡而言之,需要先調用微信提供的統一下單接口,在微信支付端實現一個下單操作,這個下單和我們系統自身的下單是兩個概念,完成統一下單后,生成相關信息給前端頁面,前端頁面調用微信提供的 js sdk 完成支付,支付成功后,微信服務器會向我們指定的回調 url 地址發出支付結果的通知。詳細的流程,請查閱微信官方的開發文檔。
我在 Areas/Api/Controllers/PayController.cs 中實現了相關功能:
二)安裝部署
1)微信開放平台配置說明
注冊申請微信開放平台
在第三方平台中,創建第三方平台。創建成功后,獲得所創建第三方平台的 AppId 和 AppSecret。
並按提示配置好“授權登錄相關”和“授權后實現業務”中的各項參數。
關於幾個 URL 的配置,需要先了解升訊威微信營銷系統的架構,可以參考相關博客文章和下文的站點部署說明部分。
登錄授權的發起頁域名:管理端域名,如 wxcm.shengxunwei.com,不需要填寫協議部分 http 或 https。
授權事件接收URL:http://鑒權中控服務域名/ThirdPartyAuth/Handler
消息與事件接收URL:http://微信端域名/ThirdPartyWeixinApi/Handler/$APPID$
公眾號開發域名:管理端域名和微信端域名,如 wxcm.shengxunwei.com;wxc.shengxunwei.com
白名單IP地址列表填寫你的服務器IP地址。
2)安裝Redis
可以准備一台 Linux 服務器安裝:
https://redis.io/download
也可以下載 Windows 版本安裝在 Windows 服務器:
https://github.com/MicrosoftArchive/redis
3)站點部署說明
Sheng.WeixinConstruction.Client.Shell
微信端
解決方案:Sheng.WeixinConstruction.sln
所對接過來的公眾號所使用的站點。
微信端在部署時使用的域名,必須在你的域名服務端后台開啟泛解析,因為對接過來的公眾號,會使用 appid 開始的二級或三級域名過時行訪問。
假設你的微信端域名是 wxc.shengxunwei.com ,那么對接過來的公眾號將使用 $APPID$.wxc.shengxunwei.com 作為域名。這樣避免因某個公眾號出現違規內容被封,影響到其它公眾號甚至整個平台。
IIS綁定參考:
類型 |
主機名 |
端口 |
IP地址 |
http |
wxc.shengxunwei.com |
80 |
* |
http |
80 |
* |
注意,要添加一個不指定主機名的綁定,並使用80端口,與泛解析對應。
WebConfig的配置:
connectionStrings節點下:
DefaultConnection配置主數據庫 WxConstruction 的連接串,LoggingConnection 配置日志庫 WxLogging 的連接串。
appSettings節點下:
debug:false,正常運行發布模式,如果設置為true,則開始調試模式,不走微信鑒權,直接模擬一個訪問者身份,方便本地開發調試。
FileService:文件服務器的地址,如:http://wxcfile1.shengxunwei.com/
ContainerService:鑒權中控服務的地址,可以使用內網地址,只要項目能訪問到即可,如:http://localhost:8013/
ClientAddress:微信端的地址,注意必須加上 $APPID$,如:http://$APPID$.wxc.shengxunwei.com/
IntranetIp:微信端自身的內網IP 地址,用於其它服務發起回調使用,使用公網地址也可以,只要能被其它服務,如文件服務訪問到即可,如:127.0.0.1
Sheng.WeixinConstruction.Container
鑒權中控服務
解決方案:Sheng.WeixinConstruction.Container.sln
鑒權中控服務的中提供的 API分為兩部分,一部分開放給微信第三方平台調用,另一部分為升訊威微信營銷系統自己使用,對於后者,我們使用內網IP地址加端口號的方式訪問即可,同時在webconfig 中,配置上允許調用的IP地址白名單,防止未經許可的調用。
IIS綁定參考:
類型 |
主機名 |
端口 |
IP地址 |
http |
8013 |
* |
|
http |
wxauth.你的域名 |
80 |
* |
WebConfig的配置:
connectionStrings節點下:
DefaultConnection配置主數據庫 WxConstruction 的連接串,LoggingConnection 配置日志庫 WxLogging 的連接串。
appSettings節點下:
Redis:Redis服務的地址和端口號。
AllowedIPList:IP地址白名單,逗號分隔,只有從這些IP 地址發起的請求,才被允許訪問中控服務器的全部接口。
ContainerService:鑒權中控服務的地址,可以使用內網地址,只要項目能訪問到即可,如:http://localhost:8013/
Management.Shell
管理端
解決方案:Sheng.WeixinConstruction.sln
升訊威微信營銷系統的后台,用戶在此注冊賬戶后,對接到自己的公眾號並使用相關功能。
IIS綁定參考:
類型 |
主機名 |
端口 |
IP地址 |
http |
wxcm.shengxunwei.com |
80 |
* |
WebConfig的配置:
connectionStrings節點下:
DefaultConnection配置主數據庫 WxConstruction 的連接串,LoggingConnection 配置日志庫 WxLogging 的連接串。
appSettings節點下:
debug:false,正常運行發布模式,如果設置為true,則開始調試模式。
FileService:文件服務器的地址,用戶從后台上傳的文件,將被上傳到文件服務器中進行存儲,如:http://wxcfile1.shengxunwei.com/
ContainerService:鑒權中控服務的地址,可以使用內網地址,只要項目能訪問到即可,如:http://localhost:8013/
ClientAddress:微信端公眾號所使用的域名地址,如http://$APPID$.wxc.shengxunwei.com/
emailPassword:發郵件功能中郵件服務器的密碼。
Redis:Redis服務的地址和端口號。
FileService
文件服務器
解決方案:Sheng.WeixinConstruction.FileService.sln
升訊威微信營銷系統的文件服務器,可以部署多個實例,后台上傳的文件將被存儲在這里。同時,它還兼具與微信后台中的素材管理接口一部分互通和功能實現。
IIS綁定參考:
類型 |
主機名 |
端口 |
IP地址 |
http |
wxcfile1.shengxunwei.com |
80 |
* |
WebConfig的配置:
connectionStrings節點下:
DefaultConnection配置主數據庫 WxConstruction 的連接串,LoggingConnection 配置日志庫 WxLogging 的連接串,FileConnection配置文件數據庫WxConstruction_File的連接串。
appSettings節點下:
ContainerService:鑒權中控服務的地址,可以使用內網地址,只要項目能訪問到即可,如:http://localhost:8013/
ServerPath:部署的實際物理路徑地址,如:D:\wwwroot\WeixinConstruction\FileService\
Redis:Redis服務的地址和端口號。
文件服務的 MIME類型需要添加:
.mp4 - video/mpeg4
至此,代碼結構和安裝部署說明結束,如有其它疑問,可以與我聯系留言。