在本系列隨筆的前面,主要就是介紹微信公眾號的門戶應用開發,最近把整個微信框架進行了擴展補充,增加了最新的企業號的API封裝和開發,後續主要介紹如何利用C#進行微信企業號的開發工作,本篇作為微信企業號的開發的起步篇,介紹微信企業號的配置和使用。
企業號是繼公眾號、訂閱號的另外一種微信類型,它主要是面對企業的。企業號是微信為企業客戶提供的移動應用入口。可以幫助企業建立員工、上下游供應鏈與企業 IT 系統間的連接。利用 企業號 ,企業或第三方合作伙伴可以幫助企業快速、低成本的實現高質量的移動輕應用,實現生產、管理、協作、運營的 移動化 。
個人覺得企業號最大的亮點是可以不限數量的消息發送,也就是可以在企業員工之間暢通交流。相對於公眾號和訂閱號,發送消息的謹慎程度,微信企業號可謂給人眼前一亮的感覺。不過微信企業號是需要內部建立好通訊錄,關注者需要匹配通訊錄的微信號、郵箱、電話號碼任一個通過才可以關注,也就是可以防止其他外來人員的自由關注了,另外如果為了安全考慮,還可以設置二次驗證,也就是一個審核過程。
企業號的認證和公眾號一樣,需要提供相關的企業資質文件,並且認證每年都要收取費用,否則可能有人員和功能的一些限制。覺得微信真是想著方法賺錢,目前已有的收費模式有,訂閱號、公眾號、企業號、開放平台,好像都有認證收費的了,而且微信小店也還需要收2萬的押金,一切都是錢呀。
好了,其他不多說,微信的注冊地址是:https://qy.weixin.qq.com,一個郵箱不能同時注冊微信公眾號和微信企業號。
對於企業開通企業號並開始使用需要四步
1) 企業到微信官網( http://qy.weixin.qq.com )申請開通;
2) 開通後,企業在企業號管理後台導入成員,發布二維碼;
3) 企業調用企業號 api 與企業自有系統對接開發;
4) 員工關注,收到微信信息,在微信中與企業交互
注冊好企業號,就可以通過微信掃一掃,掃描企業二維碼進行登錄了,掃描的時候,需要微信進行確認,才可以繼續輸入密碼進行登錄,操作界面如下所示(左邊是手機截圖,右邊是網頁截圖)。

登錄後我們就可以看到對應的電腦端的管理界面了。

如果開發過微信公眾號,那麼我們就知道,如果需要在微信服務器和網站服務器之間建立連接關系,實現消息的轉發和處理,那麼就應該設置一個回調模式,需要配置好相關的參數。然後在自己 網站服務器裡面建立一個處理微信服務器消息的入口。
進入配置後,我們需要修改相關的URL、Token、EncodingAESKey等參數,主要是URL,這個就是和公眾號的入口處理一樣的,需要我們發布到網站服務器上的處理入口。
Token和AESKey可以根據提示動態生成一個即可,AESKey好像必須是23位的,所以這個一般是讓它自己生成的,這個主要用來加密解密使用的。
URL、Token、EncodingAESKey三個參數說明。
1)URL是企業應用接收企業號推送請求的訪問協議和地址,支持http或https協議。
2)Token可由企業任意填寫,用於生成簽名。
3)EncodingAESKey用於消息體的加密,是AES密鑰的Base64編碼。
驗證URL、Token以及加密的詳細處理請參考後續 “接收消息時的加解密處理” 的部分。

我公司的企業號配置後的界面如下所示。

這個URL裡面指向的頁面功能,需要對數據進行解析並返回給微信服務器,因此我們需要在服務器上預先部署好這個處理功能入口。
除了上面的幾個函數,還有一個CorpID的參數需要使用,我們可以在後台主界面-設置裡面查看到。

然後我們為了方便網站後台使用,我們和公眾號的配置一樣,把它放到了Web.Config裡面,如下所示。

前面介紹了幾個配置項,需要在回調頁面裡面使用的,本小節繼續介紹如何實現企業號信息的回發,使之通過回調測試的操作。
由於回調測試的數據是通過Get方式發送的,因此我們的處理邏輯代碼如下所示,和公眾號的類似處理,只是實現部分不太一樣而已。
/// <summary>
/// 企業號回調信息接口。統一接收並處理信息的入口。
/// </summary>
public class corpapi : IHttpHandler
{
/// <summary>
/// 處理企業號的信息
/// </summary>
/// <param name="context"></param>
public void ProcessRequest(HttpContext context)
{
string postString = string.Empty;
if (HttpContext.Current.Request.HttpMethod.ToUpper() == "POST")
{
using (Stream stream = HttpContext.Current.Request.InputStream)
{
Byte[] postBytes = new Byte[stream.Length];
stream.Read(postBytes, 0, (Int32)stream.Length);
postString = Encoding.UTF8.GetString(postBytes);
}
if (!string.IsNullOrEmpty(postString))
{
Execute(postString);
}
}
else
{
Auth();
}
}
/// <summary>
/// 成為開發者的第一步,驗證並相應服務器的數據
/// </summary>
private void Auth()
{
#region 獲取關鍵參數
string token = ConfigurationManager.AppSettings["CorpToken"];//從配置文件獲取Token
if (string.IsNullOrEmpty(token))
{
LogTextHelper.Error(string.Format("CorpToken 配置項沒有配置!"));
}
string encodingAESKey = ConfigurationManager.AppSettings["EncodingAESKey"];//從配置文件獲取EncodingAESKey
if (string.IsNullOrEmpty(encodingAESKey))
{
LogTextHelper.Error(string.Format("EncodingAESKey 配置項沒有配置!"));
}
string corpId = ConfigurationManager.AppSettings["CorpId"];//從配置文件獲取corpId
if (string.IsNullOrEmpty(corpId))
{
LogTextHelper.Error(string.Format("CorpId 配置項沒有配置!"));
}
#endregion
string echoString = HttpContext.Current.Request.QueryString["echoStr"];
string signature = HttpContext.Current.Request.QueryString["msg_signature"];//企業號的 msg_signature
string timestamp = HttpContext.Current.Request.QueryString["timestamp"];
string nonce = HttpContext.Current.Request.QueryString["nonce"];
string decryptEchoString = "";
if (new CorpBasicApi().CheckSignature(token, signature, timestamp, nonce, corpId, encodingAESKey, echoString, ref decryptEchoString))
{
if (!string.IsNullOrEmpty(decryptEchoString))
{
HttpContext.Current.Response.Write(decryptEchoString);
HttpContext.Current.Response.End();
}
}
}
具體的處理代碼如下所示,裡面的一個加解密處理的類是微信企業號附錄裡面提供的,我使用了C#版本的SDK而已。
/// <summary>
/// 企業號基礎操作API實現
/// </summary>
public class CorpBasicApi : ICorpBasicApi
{
/// <summary>
/// 驗證企業號簽名
/// </summary>
/// <param name="token">企業號配置的Token</param>
/// <param name="signature">簽名內容</param>
/// <param name="timestamp">時間戳</param>
/// <param name="nonce">nonce參數</param>
/// <param name="corpId">企業號ID標識</param>
/// <param name="encodingAESKey">加密鍵</param>
/// <param name="echostr">內容字符串</param>
/// <param name="retEchostr">返回的字符串</param>
/// <returns></returns>
public bool CheckSignature(string token, string signature, string timestamp, string nonce, string corpId, string encodingAESKey, string echostr, ref string retEchostr)
{
WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(token, encodingAESKey, corpId);
int result = wxcpt.VerifyURL(signature, timestamp, nonce, echostr, ref retEchostr);
if (result != 0)
{
LogTextHelper.Error("ERR: VerifyURL fail, ret: " + result);
return false;
}
return true;
//ret==0表示驗證成功,retEchostr參數表示明文,用戶需要將retEchostr作為get請求的返回參數,返回給企業號。
// HttpUtils.SetResponse(retEchostr);
}
如果對這個《C#開發微信門戶及應用》系列感興趣,可以關注我的其他文章,系列隨筆如下所示:
C#開發微信門戶及應用(15)-微信菜單增加掃一掃、發圖片、發地理位置功能
C#開發微信門戶及應用(14)-在微信菜單中采用重定向獲取用戶數據
C#開發微信門戶及應用(13)-使用地理位置擴展相關應用
C#開發微信門戶及應用(12)-使用語音處理
C#開發微信門戶及應用(11)--微信菜單的多種表現方式介紹
C#開發微信門戶及應用(10)--在管理系統中同步微信用戶分組信息
C#開發微信門戶及應用(9)-微信門戶菜單管理及提交到微信服務器
C#開發微信門戶及應用(8)-微信門戶應用管理系統功能介紹
C#開發微信門戶及應用(7)-微信多客服功能及開發集成
C#開發微信門戶及應用(6)--微信門戶菜單的管理操作
C#開發微信門戶及應用(5)--用戶分組信息管理
C#開發微信門戶及應用(4)--關注用戶列表及詳細信息管理
C#開發微信門戶及應用(3)--文本消息和圖文消息的應答
C#開發微信門戶及應用(2)--微信消息的處理和應答
C#開發微信門戶及應用(1)--開始使用微信接口
&可以作為“按位與”或是“取地址”運算符
下面是作為兩種用法的介紹:
1. 按位與運算 按位與運算符"&"是雙目運算符。其功能是參與運算的兩數各對應的二進位相與。只有對應的兩個二進位均為1時,結果位才為1 ,否則為0。參與運算的數以補碼方式出現。
例如:9&5可寫算式如下: 00001001 (9的二進制補碼)&00000101 (5的二進制補碼) 00000001 (1的二進制補碼)可見9&5=1。
按位與運算通常用來對某些位清0或保留某些位。例如把a 的高八位清 0 , 保留低八位, 可作 a&255 運算 ( 255 的二進制數為0000000011111111)。
2.取地址
&作為一元運算符,結果是右操作對象的地址。
例如&x返回x的地址。
地址本身是一個抽象的概念,用於表示對象在存儲器中的邏輯位置
&可以作為“按位與”或是“取地址”運算符
下面是作為兩種用法的介紹:
1. 按位與運算 按位與運算符"&"是雙目運算符。其功能是參與運算的兩數各對應的二進位相與。只有對應的兩個二進位均為1時,結果位才為1 ,否則為0。參與運算的數以補碼方式出現。
例如:9&5可寫算式如下: 00001001 (9的二進制補碼)&00000101 (5的二進制補碼) 00000001 (1的二進制補碼)可見9&5=1。
按位與運算通常用來對某些位清0或保留某些位。例如把a 的高八位清 0 , 保留低八位, 可作 a&255 運算 ( 255 的二進制數為0000000011111111)。
2.取地址
&作為一元運算符,結果是右操作對象的地址。
例如&x返回x的地址。
地址本身是一個抽象的概念,用於表示對象在存儲器中的邏輯位置