升訊威微信營銷系統開發實踐:(4)源代碼結構說明 與 安裝部署說明( 完整開源於 Github)

GitHubhttps://github.com/iccb1013/Sheng.WeixinConstruction
由於我的精力時間有限,不會再對現有代碼進行更新維護,不過微信接口比較穩定,經測試至今沒有變化,功能依然所有可用,你能夠在此基礎上,二次開發,完成你的業務功能,也能夠抽取本平臺中的代碼複用在你的項目中,請遵循 MIT 開源協議保留個人版權聲明和網站連接便可。

GitHub
https://github.com/iccb1013/Sheng.WeixinConstruction.WeixinContract
微信協議包裝的項目還有一個單獨的工程,這個工程的版本稍新,我會進行必定的更新維護,如最近增長了幾個小程序開發須要使用到的接口。可是注意由於代碼結構通過優化調整,直接引用到升訊威微信平臺中,須要修改一些類的引用和名稱。

升訊威微信營銷系統開發實踐系列

升訊威微信營銷系統開發實踐:(1)功能概要與架構設計
升訊威微信營銷系統開發實踐:(2)中控服務器的詳細設計
升訊威微信營銷系統開發實踐:(3)功能介紹與此項目推廣過程的一些體會
升訊威微信營銷系統開發實踐:(4)源代碼結構說明 與 安裝部署說明


這是2015年到2016年間業餘時間寫的一個項目,最初的指望是實現一個微信雲平臺,相似於微盟,只須要商家掃碼綁定便可提供整套的營銷功能。html

個人定位是專門服務於線下商家,例如電影院、商業中心、各種線下門店等,線下商家的一些業務場景和業務流程是比較特殊的,和純現上的公衆號運營不盡相同。   這是我最初想找到的切入點,在系統初步上線後,本身也試着作了推廣,包括百度關鍵詞、線下陌拜都嘗試過,在以前的博客中我也簡單討論過一些細節。

我在以前的博客中開源了所有工程源代碼和數據庫腳本,陸續有朋友問我怎樣安裝部署,由於時間的關係我只能有一搭沒一搭的回答一些零散的問題,對不住你們。前些天幫一個小兄弟把整個系統完整的部署起來並運行成功,我想索性藉着這個機會,把這個過程整理出來,寫成博客分享,這樣你們從 Github 上拿到工程就不會不知從何開始。

前端

要了解升訊威微信營銷系統的架構設計,請參閱以前我發表的博客,幫助你快速瞭解代碼實現層面的體系結構。git

本文再也不對宏觀結構進行贅述,只從代碼細節方面介紹幾個關鍵的地方,幫助你快速瞭解代碼的具體實現。github


功能概要:

78019-20160824013824636-1389859091.png

有關架構設計,和詳細功能介紹,請參閱我以前的博客文章。
升訊威微信營銷系統開發實踐:(1)功能概要與架構設計
升訊威微信營銷系統開發實踐:(2)中控服務器的詳細設計

微信端效果:

更詳細的功能介紹請參閱:
升訊威微信營銷系統開發實踐:(3)功能介紹與此項目推廣過程的一些體會

image.png


在本文中我將分爲兩個部分,第一部分詳細介紹代碼層面的主要結構,第二部分詳細介紹安裝部署的方法。

一)代碼結構

web

從 Github 上獲取代碼後,源代碼目錄結構如圖所示:

redis

image.png

image.png

解決方案說明:

數據庫

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 以後,結構如圖:

 

image.png

Sheng.WeixinConstruction.Management.Shell

後臺站點

 

Sheng.WeixinConstruction.Client.Shell

微信端站點

  

1)Sheng.WeixinConstruction.Management.Shell


image.png

對於管理後臺,一個重要的功能是在用戶註冊帳號後,實現與微信公衆號的對接。

 

打開 Controllers 目錄下的 SettingsController.cs ,並展開「對接」region。


3.JPG

Docking 與 DockingDemo 對應着用戶對接公衆號的頁面。 DockingDemo是發起受權頁的體驗URL:用於騰訊審覈人員前往受權頁體驗,確認流程可用性。此爲騰訊要求。

 

AuthorizerEntity 表示受權公衆號的信息,代碼中有詳細的註釋,可自行查閱:


4.JPG

在用戶對接公衆號時,須要先獲取一個預受權碼,打開 Areas /Api/ Controllers 目錄下的 SettingsController.cs,找到 GetPreAuthCode 方法,此方法用於獲取預受權碼:


5.JPG

在 Docking.cshtml 這個畫面調用此接口,當成功獲取預受權碼以後,將頁面轉到騰訊要求的受權頁面,並給出一個用於完成受權的回調頁面,當公衆號全部者經過受權時,騰訊將把頁面轉到此回調頁面,並傳回受權碼:


6.JPG

打開 Controllers目錄下的 SettingsController.cs,找到 AuthorizationCallback 這個受權回調方法,在此完成公衆號的受權對接:


7.JPG

這裏留意一個細節:


8.JPG

在系統中建立公衆號受權信息,並開始維護它的 AccessToken ,並非在後臺中完成,而是調用鑑權中控服務器的接口,通知鑑權中控服務器來實現的:


9.JPG

_createAuthorizerUrl 是鑑權中控服務器的地址:


10.JPG

至此,就完成了微信第三方平臺,向公衆號提供服務的受權對接工做。

管理後臺的其它功能同其它管理系統後臺並沒有太大差異,可自行查閱代碼。



2) Sheng.WeixinConstruction.Client.Shell

 
image.png

微信端除了向所對接的公衆號提供服務外,還負責與微信官方後臺行進消息通訊,微信官方下發的消息,是發到Sheng.WeixinConstruction.Client.Shell,而不是 Sheng.WeixinConstruction.Management.Shell。

 

因此最重要的是首先要處理好微信推送過來的消息,打開 Controllers 目錄下的 ThirdPartyWeixinApiController.cs:


11.JPG

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

&timestamp=1446393828

&nonce=1291578710

&encrypt_type=aes

&msg_signature=3ed4a96dbc50d491664ec3f425eb7fc1f088ac9b

 

在接收到POST過來的消息後,第一步須要先解密,而後找到這條消息應該歸屬哪一個微信公衆號,找到它對應的公衆號上下文,把解密後的消息交給它處理。


12.JPG

ClientDomainContext 是微信端使用的公衆號上下文,有關公衆號上下文的詳細說明,請參閱:

升訊威微信營銷系統開發實踐:(2)中控服務器的設計

http://blog.shengxunwei.com/Home/Post/1acfa439-8fef-4609-8e74-7057c9f15a3b

 

在 ClientDomainContext 中,引用了一個 XMLMessageReceiverFactory 的工廠類用於處理微信推送過來的XML消息:


13.JPG

14.JPG

在這個工廠類中,_receiverList 保存了處理不一樣消息所須要的具體實現,這些消息接收器的實現,定義在Sheng.WeixinConstruction.Client.Core:


15.JPG

那麼當收到微信推送的消息時,只需找到對應公衆號的上下文對象,調用它的 Handle方法,根據消息的類型,找到對應的處理器類,交給它處理,就能夠了,這就是消息處理的過程。

 

在微信端,還有一件很是重要的工做,就是對公衆號關注者的身份獲取,OpenId和用戶信息,例如:


16.jpg

當公衆號的關注者(粉絲)訪問微信端的頁面時,須要獲取關注者的我的身份信息,OpenId和其它信息,在此基礎之上,與咱們本身後臺的信息關聯。

 

打開 Controllers 目錄下的 ClientBasalController,微信端視圖控制器類都繼承此基類:

當公衆號的關注者訪問微信端的頁面時,首先控制器基類會獲取該關注者的會員信息上下文和對應的公衆號上下文:


17.JPG

在OnActionExecuting 方法中,按微信的協議要求完成對關注者身份的網頁受權。

這裏要先了解所服務公衆號的域名解析細節,假設咱們將微信端的域名配置爲 wxc.shengxunwei.com,理論上咱們讓全部的公衆號直接使用此頁面,在URL後跟上公衆號的ID便可,可是這樣有一個重要的缺陷,若是平臺所服務的公衆號,有一個公衆號存在違規行爲,被微信查封,會致使咱們整個平臺被封,微信會直接把 wxc.shengxunwei.com 這個域名查封。因此咱們必須泛解析的方式,讓所服務的公衆號使用 appid.wxc.shengxunwei.com 這樣的域名來避免這種狀況。如何在安裝部署升訊威微信營銷系統時配置泛解析域名,請參閱安裝部署相關的詳細說明。

 

網頁受權的過程在 OnActionExecuting 方法中有詳細的註釋說明,可對照着代碼來看:


18.JPG

19.JPG

注意對關注者身份的網頁受權是跳轉到微信官方受權頁面進行的,完成受權後,會跳轉回指定的回調頁面,在 Areas/Api/Controllers 目錄下的 ThirdPartyWeixinApi/OAuthCallback,代碼中有詳細的註釋,請自行查閱:


image.png

21.JPG

至此,對關注者身份的網頁受權完成。

 

還有一個前端頁面 JS受權的方式,在微信支付時會涉及到,你能夠找到 ClientDomainContext下的GetJsApiConfig方法來查閱:

 

22.JPG

此外,微信端也實現了微信支付功能,用於會員充值或積分商品購買商品:


23.jpg

微信支付的流程簡而言之,須要先調用微信提供的統一下單接口,在微信支付端實現一個下單操做,這個下單和咱們系統自身的下單是兩個概念,完成統一下單後,生成相關信息給前端頁面,前端頁面調用微信提供的 js sdk 完成支付,支付成功後,微信服務器會向咱們指定的回調 url 地址發出支付結果的通知。詳細的流程,請查閱微信官方的開發文檔。

 

我在 Areas/Api/Controllers/PayController.cs 中實現了相關功能:


24.JPG


二)安裝部署

 

1)微信開放平臺配置說明

 

註冊申請微信開放平臺

https://open.weixin.qq.com/

 

在第三方平臺中,建立第三方平臺。建立成功後,得到所建立第三方平臺的 AppId 和 AppSecret。

微信第三方後臺配置2.png

並按提示配置好「受權登陸相關」和「受權後實現業務」中的各項參數。

關於幾個 URL 的配置,須要先了解升訊威微信營銷系統的架構,能夠參考相關博客文章和下文的站點部署說明部分。

微信第三方後臺配置.png

 

登陸受權的發起頁域名:管理端域名,如 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

 

至此,代碼結構和安裝部署說明結束,若有其它疑問,能夠與我聯繫留言。

 

 

 

相關文章
相關標籤/搜索