【博客俠】微信SDK基本使用方法和基本原理

2021-02-13 微軟中國MSDN

今天帝都霧霾籠罩,指數爆表,這樣的日子就適合開著空氣淨化器安靜的敲碼,沒有其他!

小編重磅推薦超級博客俠一枚,@鄭熙霖_SYSU 沒錯,他就是WP禮物說的作者哦,今天他有帶來了關於 SDK 的乾貨好內容。

就喜歡這樣實幹又愛分享的Develop,好想拉過來麼麼噠!!

言歸正傳,大家要認真學習哦!

===========這是說正題的分割線============

上回講到,作為一個長期散播溫暖,散播希望的小清新無公害 WP 開發者,繼 QQ SDK 之後,又把 UWP 微信 SDK 這茬了結了,僅供學習交流。

1.安裝微信SDK for UWP

微信官方此前明確說明短時間內暫不提供 RT 版和 UWP 版的微信 SDK,但眼見 UWP 開發之勢愈烈,微信分享也必然是許多應用的標配功能,那怎麼辦呢,自己移植成 UWP 版吧。拙者提供的微信 SDK 是基於官方 silverlight 版 SDK 反編譯後重新打包封裝成 UWP 版本的,對部分內容稍加修改,命名空間、使用方法基本與官方文檔無異。

通過 nuget 下載並安裝微信 SDK,連結 https://www.nuget.org/packages/WeChatSDK/

或者在控制臺輸入PM> Install-Package WeChatSDK


注意項目會引用依賴 Google.ProtocolBuffersLite,如果安裝完成之後該依賴未自動安裝,建議您 Unload 後 Reload 一下項目,或者手動安裝該依賴

PM> Install-Package Google.ProtocolBuffersLite


另外,本項目代碼已放在 github 上,請高手幫忙改進https://github.com/zhxilin/WeChatSDK

2.申請微信開放平臺應用Id

到微信開放平臺官網 https://open.weixin.qq.com/ ,創建應用獲得 AppId 和 AppSecret 。

3.配置Package.appxmanifest文件

與 QQ SDK 不同,微信 SDK 僅使用文件關聯協議進行應用間通信,為此需要對配置文件進行配置。打開 Package.appxmanifest 文件,在節點下添加 windows.fileTypeAssociation 的聲明:

<Extensions> <uap:Extension Category="windows.fileTypeAssociation"> <uap:FileTypeAssociation Name="wechat"> <uap:SupportedFileTypes> <uap:FileType>.[YOUR APP ID]uap:FileType> uap:SupportedFileTypes> uap:FileTypeAssociation> uap:Extension> Extensions>

注意不要漏了appid前面的「.」

4.調用微信SDK進行分享

微信消息的基類是 WXBaseMessage 類,包含屬性 Title、Description 和 ThumbData ,其中 Title 的最大長度為 512B ,Description 最大長度為 1K ,ThumbData 最大長度為32K,否則會引發 WXException 錯誤。根據不同場合消息又分為8種類型,均集成自WXBaseMessage 類:

WXTextMessage,文本消息,Type = WXBaseMessage.TYPE_TEXT

WXImageMessage,圖片消息,Type = WXBaseMessage.TYPE_IMAGE

WXMusicMessage,音樂消息,Type = WXBaseMessage.TYPE_MUSIC

WXVideoMessage,視頻消息,Type = WXBaseMessage.TYPE_VIDEO

WXWebpageMessage,網頁消息,Type = WXWebpageMessage.TYPE_URL

WXFileMessage,文件消息,Type = WXWebpageMessage.TYPE_FILE

WXAppExtendMessage,App擴展消息,Type = WXWebpageMessage.TYPE_APPDATA

WXEmojiMessage,表情消息,Type = WXEmojiMessage.TYPE_EMOJI

根據常用性,這裡列舉文本、圖片和網頁三種消息的分享方法,直接列舉代碼說明。以下是消息分享均通過打包消息數據後,發送 SendMessageToWX.Req 類型的請求來呼起微信客戶端。

(1)分享文本消息

1 try 2 { 3 var scene = SendMessageToWX.Req.WXSceneTimeline; 4 var message = new WXTextMessage 5 { 6 Title = "Sharing a text title!", 7 Text = "This is text content", 8 Description = "This is a text message.這是一個文本消息。", 9 ThumbData = null 10 }; 11 SendMessageToWX.Req req = new SendMessageToWX.Req(message, scene); 12 IWXAPI api = WXAPIFactory.CreateWXAPI("[YOUR APP ID]"); 13 var isValid = await api.SendReq(req); 14 } 15 catch (WXException ex) 16 { 17 Debug.WriteLine(ex.Message); 18 }

其中scene有3種類型可以選擇:

SendMessageToWX.Req.WXSceneChooseByUser// 用戶自行選擇 SendMessageToWX.Req.WXSceneSession// 分享給好友 SendMessageToWX.Req.WXSceneTimeline// 分享到朋友圈

其中Text屬性是Text類型消息的專有屬性,最大長度640K。

(2)分享圖片消息

1 try 2 { 3 var scene = SendMessageToWX.Req.WXSceneTimeline; 4 var file = await Package.Current.InstalledLocation.GetFileAsync("1.png"); 5 using (var stream = await file.OpenReadAsync()) 6 { 7 var pic = new byte[stream.Size]; 8 await stream.AsStream().ReadAsync(pic, 0, pic.Length); 9 var message = new WXImageMessage 10 { 11 Title = "Sharing a picture!", 12 Description = "This is a image message.這是一個圖片消息", 13 ThumbData = pic, 14 ImageUrl = "http://tp3.sinaimg.cn/1882347990/180/5725518284/1" 15 }; 16 SendMessageToWX.Req req = new SendMessageToWX.Req(message, scene); 17 IWXAPI api = WXAPIFactory.CreateWXAPI("[YOUR APP ID]"); 18 var isValid = await api.SendReq(req); 19 } 20 } 21 catch (WXException ex) 22 { 23 Debug.WriteLine(ex.Message); 24 }

其中ImageUrl和ImageData只能設置一個,ImageData不能超過10M。

(3)分享網頁消息

1 try 2 { 3 var scene = SendMessageToWX.Req.WXSceneTimeline; 4 var file = await Package.Current.InstalledLocation.GetFileAsync("1.png"); 5 using (var stream = await file.OpenReadAsync()) 6 { 7 var pic = new byte[stream.Size]; 8 await stream.AsStream().ReadAsync(pic, 0, pic.Length); 9 var message = new WXWebpageMessage 10 { 11 WebpageUrl = "http://www.baidu.com", 12 Title = "Sharing a link!", 13 Description = "This is a link message.這是一個連結消息", 14 ThumbData = pic 15 }; 16 SendMessageToWX.Req req = new SendMessageToWX.Req(message, scene); 17 IWXAPI api = WXAPIFactory.CreateWXAPI("[YOUR APP ID]"); 18 var isValid = await api.SendReq(req); 19 } 20 } 21 catch (WXException ex) 22 { 23 Debug.WriteLine(ex.Message); 24 }

其中WebpageUrl不能超過10K。

(4)登錄授權

登錄授權向微信客戶端發出的請求類型是 SendAuth.Req

1 try 2 { 3 SendAuth.Req req = new SendAuth.Req("[YOUR SCOPE]", "test"); 4 IWXAPI api = WXAPIFactory.CreateWXAPI("[YOUR APP ID]"); 5 var isValid = await api.SendReq(req); 6 } 7 catch (WXException ex) 8 { 9 Debug.WriteLine(ex.Message); 10 }

其中[YOUR SCOPE]指的是在開放平臺註冊應用,開通登錄授權後的權限範圍。

(5)微信支付

SDK也提供了微信支付的請求類型SendPay.Req,由於支付權限申請比較困難,暫時沒有測試,以後有實際場景再試。

5.回調結果處理

微信 SDK 提供了 WXEntryBasePage 類,繼承自Page類,用來響應微信的回調。

如果你的頁面基類仍然是 Page,可以替換為 WXEntryBasePage 作為你的 Page 基類,直接重載各種 Response 方法即可得到回調結果;如果你已有自定義的 Page 基類,則通過另外的途徑獲取回調結果。

WXEntryBasePage 類提供 public void Handle(FileActivatedEventArgs e) 方法來處理回調,我們僅需在 App.xaml.cs 中重載 OnFileActivated 方法,將參數傳入 Hadle 方法即可進行結果解析,並將不同類型的消息結果通過不同的響應方法進行通知。

WXEntryBasePage 類包含以下 Response 方法:

1 public virtual void OnSendAuthResponse(SendAuth.Resp response) 2 { 3 } 4 5 public virtual void OnSendMessageToWXResponse(SendMessageToWX.Resp response) 6 { 7 } 8 9 public virtual void OnSendPayResponse(SendPay.Resp response) 10 { 11 }

以上三種 Response 方法分別對應登錄授權、消息分享以及支付等操作的結果。

如果你的 Page 基類已改成WXEntryBasePage,那麼直接重載對應的這三個方法即可,如:

1 public override async void OnSendMessageToWXResponse(SendMessageToWX.Resp response) 2 { 3 base.OnSendMessageToWXResponse(response); 4 var dialog = new MessageDialog(response.ErrCode == 0 ? "分享成功": "分享失敗"); 5 await dialog.ShowAsync(); 6 }

如果你的 Page 基類沒有改成 WXEntryBasePage,那麼你需要自己實現一個 Callback 類,繼承自WXEntryBasePage:

1 public class WeChatCallback : WXEntryBasePage 2 { 3 }

並在 App.xaml.cs 的 OnFileActivated 方法中,創建該對象,並調用其 Handle 方法:

1 protected override void OnFileActivated(FileActivatedEventArgs args) 2 { 3 base.OnFileActivated(args); 4 try 5 { 6 var wechat = new WeChatCallback(); 7 wechat.Handle(args); 8 } 9 catch (Exception) 10 { 11 // ignored 12 } 13 }

對於消息分享的Response,參數類型是 SendMessageToWX.Resp , ErrCode == 0時表示分享成功,否則分享失敗;

對於登錄授權的 Response,參數類型是 SendAuth.Resp,其中 Code 即 OAuth 授權第一步所需的 Code,通過這個 Code,調用微信的 Open API 換取 AccessToken ,之後才能得到用戶的基本資料。微信SDK並不實現 Open API,所以需要自行實現。我還寫了一個 WeChatSDK.Extensions 類庫,提供 WeChatSns 類,封裝了部分 Open API,直接調用封裝好的接口即可完成整個 OAuth:

1 public override async void OnSendAuthResponse(SendAuth.Resp response) 2 { 3 base.OnSendAuthResponse(response); 4 if (response.ErrCode == 0) 5 { 6 if (!string.IsNullOrEmpty(response.Code)) 7 { 8 var token = await WeChatSns.GetAccessTokenAsync(response.Code); 9 if (token != null) 10 { 11 var user = await WeChatSns.GetUserInfoAsync(token.AccessToken, token.OpenId); 12 var dialog = new MessageDialog($"name:{user.Nickname}\r\nopenid:{user.OpenId}","授權成功"); 13 await dialog.ShowAsync(); 14 } 15 } 16 } 17 else 18 { 19 var dialog = new MessageDialog("授權失敗"); 20 await dialog.ShowAsync(); 21 } 22 }

WeChatSDK.Extensions 類庫源碼已貼在 Github上,歡迎補充

https://github.com/zhxilin/WeChatSDK/tree/master/UWP/WeChatSDK.Extensions

更多微信 Open API 請參考官方文檔:

https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&lang=zh_CN

6.剖析微信SDK的原理

說完微信 SDK 的用法,下面談談它的實現原理。

要理解微信 SDK 的實現原理,首先要解決一個問題,理解什麼是 Protocol Buffers 。可能很多人都注意到了微信 SDK 需要引用 Google.ProtocolBuffersLite 類庫。

Protocol Buffers 是一種輕便高效的結構化數據存儲格式,可以用於結構化數據串行化,很適合做數據存儲或 RPC 數據交換格式。它可用於通訊協議、數據存儲等領域的語言無關、平臺無關、可擴展的序列化結構數據格式。目前支持 C++、Java、Python、C# 等語言。

...

是 Google 公司內部的混合語言數據標準

使用 Protocol Buffers 比 XML 的好處在於更簡單、更快、更小,對於微信這種頻繁數據序列化和反序列化的場景來說非常實用。微信的數據交換在設計之初必須考慮實現消息的跨平臺傳輸,那麼對於平臺無關、可擴展性超高的 Protocol Buffers 技術來說,就有了很大的用武之地。

對 Protocol Buffers 有興趣的朋友可以多查閱一下相關資料

http://www.ibm.com/developerworks/cn/linux/l-cn-gpb/index.html

http://kb.cnblogs.com/page/77621/

http://www.cnblogs.com/wu-jian/archive/2011/02/22/1961104.html

簡單來說,對於服務端,只需要傳輸定義好結構的序列化文件 .proto 文件到不同平臺的客戶端,通過 Google 提供的工具,如 protoc、ProtoGen 等工具即可反序列化為對應平臺的具體對象。可以通過一張圖來理解:


.proto 文件會轉成二進位序列 protobuf 進行傳輸,客戶端接收到二進位序列後,按照指定的格式讀取到對應平臺的結構類型中就可以了。整個解析過程需要 Protocol Buffers 框架和Protobuf 編譯器生成的代碼共同完成。比如 protoc 將 .proto 文件轉成二進位文件,再通過 protogen 讀取二進位文件轉成C#代碼。

了解了以上知識之後,我們來看看微信 SDK 是怎麼做的。

比如分享消息,SDK 將每個消息的結構整理後填入 TransactionData 中,該類包含 ToProto 方法和 FromProto 方法,分別將數據結構序列化成 .proto 對象和將 .proto 對象反序列化成數據結構。ToProto 方法調用了 Goolge.ProtocolBuffersLite 類庫提供的GeneratedBuilderLite.Build() 方法完成序列化; FromProto 方法則調用了 BuildParsed() 方法,將二進位序列反序列化成數據結構。

1 internal TransactDataP ToProto() 2 { 3 TransactDataP.Builder builder = TransactDataP.CreateBuilder(); 4 // ... 將TransactData中的屬性填入builder後Build 5 return builder.Build(); 6 }

public static SendAuthResp ParseFrom(byte[] data) { return CreateBuilder().MergeFrom(data).BuildParsed(); }

我們的應用將數據打包放入一個後綴為 .wechat 的文件中,通過 Launcher 啟動這個文件,自然只有微信客戶端能識別這個文件,所以微信被呼叫起來並通過 protobuf 機制處理這個文件,完成我們的請求。

至於文件關聯協議,之前講過,在 Package.appxmanifest 中使用 AppId (如wx0123456789abcdef)填寫的聲明,就是為了保證微信在處理完分享或者完成登錄授權後,生成數據並寫入文件 .wx0123456789abcdef 中,通過 FileTypeAssociation 協議,這種後綴的文件,也只能由我們的應用來打開了,這樣就保證了互調關係的唯一性。 OnFileActivated 接收到文件之後,把文件內的數據通過 protobuf 機制反序列出來就能得到結果了。

原文地址:http://www.cnblogs.com/zhxilin/p/5005112.html

如果大家有好的技術博客,也歡迎來做一枚博客俠,分享給大家哦~

點擊「閱讀原文」 參與博客俠投稿

相關焦點

  • 機械錶的基本構造及工作原理
    店長真心推薦哦,希望各位愛表人士能看完,若想和小編一起探討頂級復刻表,請添加微信:609686898(←長按微信號可複製)。
  • 簡述喇叭擺位的基本原理與方法
    近年來許多音響前輩先進紛紛開班授課,教導各自的喇叭擺位心得與方法。我寫這篇不是為了爭勝,而是純粹分享我個人如何看待喇叭擺位的基本原則與背後原理,僅提供各位樂迷參考。 空間聲學條件完全對稱時 在談擺位前,必須先觀察擺位空間的聲學條件是否為全對稱?
  • 「數字世界」基本的工作原理
    首先回顧並評述了數據孿生概念的起源,其次回顧並評述了各大工業軟體巨頭是如何定義和使用數字孿生的,之後從「數字世界」基本的工作原理角度重新審視了數字孿生,在前述工作的基礎上給出了個人關於數字孿生的觀點,並對想進入該領域的後來者給出了本人的忠告。本系列文章的寫作,得到了e-works數位化企業網總編黃培博士的鼓勵,並給出了寶貴的意見,在此表示衷心的感謝!。
  • 量子博弈論基本原理的簡單解釋
    量子博弈論,英文Quantum Game Theory,是量子理論與博弈論相結合的一門新型理論,通過對博弈現象的認知決策過程進行建模,運用量子力學理論數學方法,研究與描述博弈現象及其對策的交叉科學。量子博弈論是在經典博弈論基礎上結合量子理論而發展起來的。為解釋量子博弈論基本原理,有必要首先得從經典博弈論及其博弈的基本概念說起。
  • 調音臺的工作原理和組成 周邊設備的正確使用方法
    調音臺1、首先我們先來了解一下調音臺的工作原理和各種混合器的組成,並通過實際操作具有每個零件混合器的功能。2、快速說明內部信號聲音站解調,信號傳輸方法和匹配的水平,通過放大器適當調整的流量,以確保無噪音在擴增或者產生,並且保證有高質量的聲音在擴增。3、通過各種調音臺的實際調試,我們已經初步掌握了一下基本的操作方法,以確保調音臺在工作的時候以最佳的狀態在工作。
  • 探魚器的基本工作原理及在筏釣上的應用
    其實探魚器是一個相對小眾的一個技術門類,國內釣魚人接觸的時間不長,相關的經銷商也缺乏相應的技術說明能力,有些問題的出現,已經不是使用方法那麼簡單,必須從基本原理上做一些說明才能更好地了解。所以這次寫文,主要是從原理和技術層面去進行闡述,只有了解一定的探魚器工作原理才能對實際使用中的問題得到理解。
  • 深度長文:飛機的工作原理和基本部件
    我們常常瞥見天空中有一架飛機,但對其中原理的了解並不多。這些笨重的機器是如何升空的?要回答這個問題,我們必須進入流體力學的世界。物理學家根據液體和氣體的流動方式將它們歸類為流體。儘管空氣、水和糖漿看起來可能是非常不同的物質,但它們都符合同一套數學關係。事實上,基本的空氣動力測試有時是在水下進行的。即使是晴朗的天空也不是空的。
  • 搜尋引擎蜘蛛的基本原理及工作流程
    搜尋引擎用來爬行和訪問頁面的程序被稱為蜘蛛(spider),也叫機器人(bot)。搜尋引擎蜘蛛訪問網站頁面時類似於普通用戶使用瀏覽器,蜘蛛程序發出頁面訪問請求後,伺服器返回HTML代碼,蜘蛛程序把收到的代碼存入原始頁面資料庫,搜尋引擎為了提高爬行和抓取的速度,都使用多個蜘蛛分布爬行。
  • 電源模塊均流的基本原理、實現方法及仿真應用
    在很多大電流輸出的場合,為了提高系統的可靠性,比較常用的一個方法就是採用熱備份——多個電源模塊並聯使用。每個電源模塊還具備在線插拔的功能。以便於拆卸和維修、維護。
  • 邦投數科:個人理財中的3個基本原理和6個方法(中)
    來源: 公眾號 邦投數科助手今天小邦又如約出現了,昨天給大家分享了《個人理財的基本原理和方法》中的第一個原理——成長原理。昨天我們說到成長原理中有兩個重要的方法:①.提高理財收益的回報率;②.利用好複利思維。不知道大家有沒有好好閱讀吸收呢!那麼,今天第二期要給大家分享的是理財的第二個原理規劃原理。
  • 矢網:反射計包含哪些關鍵部件,以及基本工作原理
    大多數射頻工程師都有接觸,但是對於其基本組成及測試原理深度探究的並不多。後面計劃寫一些文章,專門介紹矢網的基礎內容。本文主要介紹矢網的基礎組成部分——反射計(Reflectometer),包含哪些關鍵部件,以及基本工作原理。
  • 羅經的來歷及基本原理
    羅經的來歷及基本原理中天易傳人張永紅整理羅經就是羅盤,盤正中貫著的一根鐵針,始終指向正南正北,即今所說的指南針。地理堪輿家把指南針的發明歸於黃帝時神授,並講到周文王把指南針製成羅盤,用來查氣定位、觀天相地。
  • 合肥音樂噴泉設計-噴泉施工價格基本工作原理
    合肥音樂噴泉設計-噴泉施工價格基本工作原理 ,「xbv898」  江蘇水悅景觀噴泉工程有限公司是從事各類水景噴泉設計,生產製造,安裝調試、維修養護為一體的專業性公司。  合肥音樂噴泉設計-噴泉施工價格據科學統計每公斤用來刺激漂浮的人造霧的水可以溶解公斤冰!
  • 科普丨三分鐘了解XRD基本原理!
    下面小編向大家分享下X射線衍射技術的原理及應用。因此,X射線衍射分析法作為材料結構和成分分析的一種現代科學方法,已逐步在各學科研究和生產中廣泛應用。XRD的基本原理當一束單色X射線入射到晶體時,由於晶體是由原子規則排列成的晶胞組成,這些規則排列的原子間距離與入射X射線波長有相同數量級,故由不同原子散射的X射線相互幹涉,在某些特殊方向上產生強X射線衍射,衍射線在空間分布的方位和強度,與晶體結構密切相關。這就是X射線衍射的基本原理。
  • @健身小白,健身房常見器械功能、基本使用方法及英文名稱科普!
    插入一條來自@ jojowyoung 的原創攻略  《原標題:健身房常見器械功能、基本使用方法及英文名稱科普 !》  但也有很多健身小白或初入健身坑的小夥伴,對一些常見的健身器械不夠熟悉,不知道如何形容或者使用。今天就來和大家一起掃盲!為大家介紹對應的常見健身器械以及基本使用方法,一起來看看吧!  註:篇幅有限,今天只淺顯地介紹一些經典器械與用法。
  • sai的基本使用教程
    藝學繪小編收集整理了 sai的基本使用教程sai全名 「 Easy PaintTool SAI 」 是日本的一款軟體,是由日本SYSTEMAX公司銷售、SYSTEMAX Software Development開發的一款繪圖軟體。
  • 白城水泥化糞池選購基本方法
    白城水泥化糞池選購基本方法   合肥峰昊一直專注於水泥整體化糞池的生產與銷售。白城水泥化糞池,質量輕,耐腐蝕,安裝便利,歡迎新老客戶來電選購!  砌磚時牆面平直,稜角整齊,寬度一致,夾角對齊,上下錯開,內外重疊,保持井身不變形。
  • 科學家揭示了動物潛水的新基本原理
    01潛水時間取決於新陳代謝模式一個國際科學家團隊使用了迄今為止最大的數據集,研究了新陳代謝限制如何控制呼吸空氣的水生物種的潛水錶現這是一種巨大的潛水甲蟲科學家們在《英國皇家學會學報B》(Proceedings of the Royal Society B)上發表文章稱,他們的發現構成了進化生理學的一個新的基本原則
  • 第15屆馬克思主義基本原理上海論壇在華東理工大學召開
    中國社會科學網上海訊(記者 查建國 夏立 陳鍊)9月20日,上海高校馬克思主義基本原理概論教指委、華東理工大學馬克思主義學院、上海大學馬克思主義學院、華東理工大學哲學研究所共同主辦的第15屆馬克思主義基本原理上海論壇在華東理工大學召開。
  • 圓管縮口機新鄉實體商產品的基本原理
    圓管縮口機新鄉實體商產品的基本原理   圓管縮口機新鄉實體商產品的基本原理優點是取材容易,建造方便,造價低廉。圓管縮口機同時,要控制好棚內溼度,避免在不利環境下產生的病害。