C#開發微信門戶及應用(11)--微信菜單的多種表現方式介紹

在前面一系列文章中,我們可以看到微信自定義菜單的重要性,可以說微信公眾號賬號中,菜單是用戶的第一印象,我們要規劃好這些菜單的內容,布局等信息。根據微信菜單的定義,我們可以看到,一般菜單主要分為兩種,一種是普通的Url菜單(類型為View的菜單),一種是事件菜單(類型為Click的菜單),一般情況下,微信的Url菜單,是無法獲得用戶的任何信息的,但微信用戶信息非常重要,因此也提供了另外一種方式(類似重定向的方式)來給我們使用,本篇主要介紹這種重新定向的方式菜單的使用,以使我們能夠盡可能和用戶進行交互。

1、微信自定義菜單的分類

微信對自定義菜單的要求:目前自定義菜單最多包括3個一級菜單,每個一級菜單最多包含5個二級菜單。一級菜單最多4個漢字,二級菜單最多7個漢字,多出來的部分將會以“...”代替。
根據菜單的分類,我們可以把它通過圖形進行分類展示:


我對各種微信公眾號進行了解,發現多數賬號采用的都是普通的View類型的菜單鏈接方式,通過它們鏈接到自己的微網站上,但也有一些做的好的,如省立中山圖書館,就能通過重定向的方式,提供一個綁定圖書館用戶和微信OpenID的入口,綁定后,用戶就可以查看借閱的書籍,然后可以通過一鍵續借功能實現圖書的快速續借功能。
對于這種重定向類型的Url菜單事件,微信的說明如下:
如果用戶在微信中(Web微信除外)訪問公眾號的第三方網頁,公眾號開發者可以通過此接口獲取當前用戶基本信息(包括昵稱、性別、城市、國家)。利用用戶信息,可以實現體驗優化、用戶來源統計、帳號綁定、用戶身份鑒權等功能。請注意,“獲取用戶基本信息接口是在用戶和公眾號產生消息交互時,才能根據用戶OpenID獲取用戶基本信息,而網頁授權的方式獲取用戶基本信息,則無需消息交互,只是用戶進入到公眾號的網頁,就可彈出請求用戶授權的界面,用戶授權后,就可獲得其基本信息(此過程甚至不需要用戶已經關注公眾號。)”

2、重定向類型菜單的URL

上面說了,重定向類型的菜單分為了兩種,其實他們也僅僅是參數Scope類型的不同,其他部分也還是一樣的。
為了展示,我們在假設用戶單擊菜單的時候,切換到http://www.iqidi.com/testwx.ashx這個頁面,并帶過來當前用戶的OpenID等參數信息
對于scope=snsapi_base方式的鏈接如下:

https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx3d81fc2886d86526&redirect_uri=http%3A%2F%2Fwww.iqidi.com%2Ftestwx.ashx&response_type=code&scope=snsapi_base&state=123#wechat_redirect

而對于scope=snsapi_userinfo方式的鏈接如下:

https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx3d81fc2886d86526&redirect_uri=http%3A%2F%2Fwww.iqidi.com%2Ftestwx.ashx&response_type=code&scope=snsapi_userinfo&state=123#wechat_redirect

不過他們給手機客戶端的體驗是不同的,第一種可以平滑切換,但是第二種會彈出一個對話框供用戶確認才能繼續。



為了演示上面兩種獲取數據的不同,我把他們傳過來的code的值,用戶換取OpenID后進行用戶信息的解析,他們兩者的結果都是一樣了。具體測試界面如下所示。



其中TestWX.ashx的頁面后臺代碼如下所示:
/// <summary>
/// TestWX 的摘要說明
/// </summary>
public class TestWX : IHttpHandler
{
    string appId = ""; //換成你的信息
    string appSecret = ""; //換成你的信息

    public void ProcessRequest(HttpContext context)
    {
        context.Response.ContentType = "text/plain";
        string content = "";

        if (context.Request != null && context.Request.Url != null)
        {
            NameValueCollection list = HttpUtility.ParseQueryString(context.Request.Url.Query);
            foreach (string key in list.AllKeys)
            {
                content += string.Format("{0}:{1} \r\n", key, list[key]);
            }
        }

        string code = context.Request.QueryString["code"] ?? "";
        if (!string.IsNullOrEmpty(code))
        {
            IBasicApi api = new BasicApi();
            try
            {
                AppConfig config = new AppConfig();
                appId = config.AppConfigGet("AppId");//從配置中獲取微信程序ID
                appSecret = config.AppConfigGet("AppSecret");//從配置中獲取微信程序秘鑰

                AccessTokenResult result = api.GetAccessToken(appId, appSecret, code);
                if (result != null)
                {
                    content += string.Format("openid:{0}\r\n", result.openid);

                    string token = api.GetAccessToken(appId, appSecret);
                    IUserApi userApi = new UserApi();
                    UserJson userDetail = userApi.GetUserDetail(token, result.openid);
                    if (userDetail != null)
                    {
                        content += string.Format("nickname:{0}  sex:{1}\r\n", userDetail.nickname, userDetail.sex);
                        content += string.Format("Location:{0} {1} {2} {3}\r\n", userDetail.country, userDetail.province, userDetail.city, userDetail.language);
                        content += string.Format("HeadUrl:{0} \r\n", userDetail.headimgurl);
                        content += string.Format("subscribe:{0},{1}\r\n", (userDetail.subscribe == 1) ? "已訂閱" : "未訂閱", userDetail.subscribe_time.GetDateTime());
                    }
                }
            }
            catch { }
        }

        context.Response.Write(content);
    }

在上面的代碼中,我主要分為幾步,一個是打印當前用戶重定向過來的鏈接的參數信息,代碼如下。

NameValueCollection list = HttpUtility.ParseQueryString(context.Request.Url.Query);
foreach (string key in list.AllKeys)
{
    content += string.Format("{0}:{1} \r\n", key, list[key]);
}

然后獲取到Code參數后,通過API接口,獲取AccessTokenResult的數據,這里面有用戶的OpenID

AccessTokenResult result = api.GetAccessToken(appId, appSecret, code);

當正常調用后,我們把用戶標識的OpenID進一步進行解析,調用API獲取用戶的詳細信息,具體代碼如下所示。

UserJson userDetail = userApi.GetUserDetail(token, result.openid);

當我們把用戶的相關信息獲取到了,就可以做各種用戶信息的展示了,如下代碼所示。

if (userDetail != null)
{
    content += string.Format("nickname:{0}  sex:{1}\r\n", userDetail.nickname, userDetail.sex);
    content += string.Format("Location:{0} {1} {2} {3}\r\n", userDetail.country, userDetail.province, userDetail.city, userDetail.language);
    content += string.Format("HeadUrl:{0} \r\n", userDetail.headimgurl);
    content += string.Format("subscribe:{0},{1}\r\n", (userDetail.subscribe == 1) ? "已訂閱" : "未訂閱", userDetail.subscribe_time.GetDateTime());
}

3、重定向鏈接菜單的用途

這種菜單就是需要指定域名,在微信后臺中進行設置,重定向的鏈接必須屬于這個域名之中,否則不會轉到你希望的鏈接。

這個方式,讓我們的微信應用程序后臺可以獲得用戶的標識、用戶詳細信息等,我們就可以用來綁定和用戶相關的業務信息了,如上面提到的圖書館借閱信息,送水客戶的信息,客戶的積分信息,或者可以和后臺賬號進行關聯實現更加復雜的應用等。用戶的身份信息如此重要,如果結合到我們的CRM系統、業務管理系統,就可以發揮用戶信息應用的作用了。

以上就是我對這個類型菜單鏈接的應用了解,具體還需要進一步深化其應用,希望和大家共同探討這方面的應用場景。

如果對這個《C#開發微信門戶及應用》系列感興趣,可以關注我的其他文章.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,460評論 6 538
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,067評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,467評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,468評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,184評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,582評論 1 325
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,616評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,794評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,343評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,096評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,291評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,863評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,513評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,941評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,190評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,026評論 3 396
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,253評論 2 375

推薦閱讀更多精彩內容