C#開發微信門戶及應用(15)-微信菜單增長掃一掃、發圖片、發地理位置功能

前面介紹了不少篇關於使用C#開發微信門戶及應用的文章,基本上把當時微信能作的接口都封裝差很少了,微信框架也積累了很多模塊和用戶,最近發現微信公衆平臺增長了很多內容,特別是在自定義菜單裏面增長了掃一掃、發圖片、發地理位置功能,這幾個功能模塊很重要,想一想之前想在微信公衆號裏面增長一個掃描二維碼的功能,都作不了,如今能夠了,還能夠拍照上傳等功能,本文主要介紹基於我前面的框架系列文章,進一步介紹如何集成和使用這些新增功能。html

一、微信幾個功能的官方介紹

1). 掃碼推送事件

用戶點擊按鈕後,微信客戶端將調起掃一掃工具,完成掃碼操做後顯示掃描結果(若是是URL,將進入URL),且會將掃碼的結果傳給開發者,開發者能夠下發消息。web

2). 掃碼推送事件,且彈出「消息接收中」提示框

用戶點擊按鈕後,微信客戶端將調起掃一掃工具,完成掃碼操做後,將掃碼的結果傳給開發者,同時收起掃一掃工具,而後彈出「消息接收中」提示框,隨後可能會收到開發者下發的消息。數據庫

3). 彈出系統拍照發圖

用戶點擊按鈕後,微信客戶端將調起系統相機,完成拍照操做後,將拍攝的相片發送給開發者,並推送事件給開發者,同時收起系統相機,隨後可能會收到開發者下發的消息。服務器

4). 彈出拍照或者相冊發圖

用戶點擊按鈕後,微信客戶端將彈出選擇器供用戶選擇「拍照」或者「從手機相冊選擇」。用戶選擇後即走其餘兩種流程。微信

5). 彈出微信相冊發圖器

用戶點擊按鈕後,微信客戶端將調起微信相冊,完成選擇操做後,將選擇的相片發送給開發者的服務器,並推送事件給開發者,同時收起相冊,隨後可能會收到開發者下發的消息。微信開發

6). 彈出地理位置選擇器

用戶點擊按鈕後,微信客戶端將調起地理位置選擇工具,完成選擇操做後,將選擇的地理位置發送給開發者的服務器,同時收起位置選擇工具,隨後可能會收到開發者下發的消息。
但請注意,以上新增能力,均僅支持微信iPhone5.4.1以上版本,和Android5.4以上版本的微信用戶,舊版本微信用戶點擊後將沒有迴應,開發者也不能正常接收到事件推送。微信公衆平臺

 

二、微信新菜單功能的測試公衆號

微信不只增長了這些功能模塊的支持,還考慮到咱們開發人員的方便,增長了一個叫作「menutest"的公衆號,方便咱們測試。咱們在公衆號搜索「menutest",而後關注它便可進行測試幾個新增功能了。框架

「menutest"的公衆號名稱是」自定義菜單拓展測試「,我關注它並進行了測試,二維碼、圖片、地理位置都很OK,自己可以響應這些事件,而且圖片、地理位置自身還能出現一個對應的事件,以下所示。工具

圖片發送能夠分爲拍照、拍照和相冊、微信相冊三類,感受後面兩個有點相似,但有這些功能都很不錯的。post

       

三、改進菜單對象和提交菜單

前面說了,微信提供這些功能,能夠在菜單裏面進行集成,也就是菜單的類型由原來CLICK/VIEW兩種,變爲如今8種類型,增長2個掃碼操做、3種圖片操做、1種地理位置操做。

所以把菜單的枚舉類型擴展一下,以下所示。

    /// <summary>
    /// 菜單按鈕類型
    /// </summary>
    public enum ButtonType
    {
        /// <summary>
        /// 點擊
        /// </summary>
        click,

        /// <summary>
        /// Url
        /// </summary>
        view,

        /// <summary>
        /// 掃碼推事件的事件推送
        /// </summary>
        scancode_push,

        /// <summary>
        /// 掃碼推事件且彈出「消息接收中」提示框的事件推送
        /// </summary>
        scancode_waitmsg,

        /// <summary>
        /// 彈出系統拍照發圖的事件推送
        /// </summary>
        pic_sysphoto,

        /// <summary>
        /// 彈出拍照或者相冊發圖的事件推送
        /// </summary>
        pic_photo_or_album,

        /// <summary>
        /// 彈出微信相冊發圖器的事件推送
        /// </summary>
        pic_weixin,

        /// <summary>
        /// 彈出地理位置選擇器的事件推送
        /// </summary>
        location_select
    }

而後在Winform裏面調用建立菜單操做代碼以下所示:

        private void btnCreateMenu_Click(object sender, EventArgs e)
        {
            MenuJson productInfo = new MenuJson("新功能測試", new MenuJson[] { 
                new MenuJson("掃碼推事件", ButtonType.scancode_push, "scancode_push") 
                ,new MenuJson("系統拍照發圖", ButtonType.pic_sysphoto, "pic_sysphoto") 
                , new MenuJson("拍照相冊發圖", ButtonType.pic_photo_or_album, "pic_photo_or_album") 
                , new MenuJson("微信相冊發圖", ButtonType.pic_weixin, "pic_weixin") 
                , new MenuJson("地理位置選擇", ButtonType.location_select, "location_select") 
            });                                    

            MenuJson frameworkInfo = new MenuJson("框架產品", new MenuJson[] { 
                new MenuJson("Win開發框架", ButtonType.click, "win"),
                new MenuJson("WCF開發框架", ButtonType.click, "wcf"),
                new MenuJson("混合式框架", ButtonType.click, "mix"), 
                new MenuJson("Web開發框架", ButtonType.click, "web")
                ,new MenuJson("代碼生成工具", ButtonType.click, "database2sharp")
            });

            MenuJson relatedInfo = new MenuJson("相關連接", new MenuJson[] { 
                new MenuJson("公司介紹", ButtonType.click, "event_company"),
                new MenuJson("官方網站", ButtonType.view, "http://www.iqidi.com"),
                new MenuJson("聯繫咱們", ButtonType.click, "event_contact"),
                new MenuJson("應答系統", ButtonType.click, "set-1"),
                new MenuJson("人工客服", ButtonType.click, "event_customservice")
            });

            MenuListJson menuJson = new MenuListJson();
            menuJson.button.AddRange(new MenuJson[] { productInfo, frameworkInfo, relatedInfo });

            if (MessageUtil.ShowYesNoAndWarning("您確認要建立菜單嗎") == System.Windows.Forms.DialogResult.Yes)
            {
                IMenuApi menuBLL = new MenuApi();
                CommonResult result = menuBLL.CreateMenu(token, menuJson);
                Console.WriteLine("建立菜單:" + (result.Success ? "成功" : "失敗:" + result.ErrorMessage));
            }
        }

固然,通常狀況下咱們都是在Web後臺系統進行的,維護菜單都是在本身微信平臺上進行菜單管理,而後一次性提交到微信服務器便可。

而在Web後臺,只須要把數據庫的數據變化爲Json數據提交便可,操做和上面的相似。

        /// <summary>
        ///更新微信菜單
        /// </summary>
        /// <returns></returns>
        public ActionResult UpdateWeixinMenu()
        {
            string token = base.GetAccessToken();
            MenuListJson menuJson = GetWeixinMenu();

            IMenuApi menuApi = new MenuApi();
            CommonResult result = menuApi.CreateMenu(token, menuJson);
            return ToJsonContent(result);
        }

四、微信掃一掃功能集成 

 前面講了,有了最新的功能,咱們就能夠實現掃一掃功能,從而能夠掃描條形碼,二維碼的功能。有了條形碼、二維碼的快速和識別,咱們就能開發一些如條碼查詢、商品處理等功能了。

這裏咱們介紹如何在個人微信開發框架裏面整合這個掃一掃的功能處理操做。

前面已經增長了一些新功能的測試菜單,咱們要作的就是響應這些事件處理,而後對他們進行應答處理就能夠了。

下面是根據事件進行的一些API跳轉處理,咱們同時定義了幾個相關的實體類用來處理他們的信息,如RequestEventScancodePush、RequestEventScancodeWaitmsg、RequestEventPicSysphoto等等。

RequestEventScancodeWaitmsg實體類的代碼以下所示,其餘的相似處理。

    /// <summary>
    /// 掃碼推事件且彈出「消息接收中」提示框的事件推送
    /// </summary>
    [System.Xml.Serialization.XmlRoot(ElementName = "xml")]
    public class RequestEventScancodeWaitmsg : BaseEvent
    {
        public RequestEventScancodeWaitmsg()
        {
            this.MsgType = RequestMsgType.Event.ToString().ToLower();
            this.Event = RequestEvent.scancode_waitmsg.ToString();
            this.ScanCodeInfo = new ScanCodeInfo();
        }

        /// <summary>
        /// 事件KEY值,由開發者在建立菜單時設定
        /// </summary>
        public string EventKey { get; set; }

        /// <summary>
        /// 掃描信息
        /// </summary>
        public ScanCodeInfo ScanCodeInfo { get; set; }

    }
 

而根據實體類強類型的處理接口流轉操做以下所示。

                               case RequestEvent.scancode_push:
                                {
                                    //掃碼推事件的事件推送
                                    RequestEventScancodePush info = XmlConvertor.XmlToObject(postStr, typeof(RequestEventScancodePush)) as RequestEventScancodePush;
                                    if (info != null)
                                    {
                                        responseContent = actionBLL.HandleEventScancodePush(info);
                                    }
                                }
                                break;

                            case RequestEvent.scancode_waitmsg:
                                {
                                    //掃碼推事件且彈出「消息接收中」提示框的事件推送
                                    RequestEventScancodeWaitmsg info = XmlConvertor.XmlToObject(postStr, typeof(RequestEventScancodeWaitmsg)) as RequestEventScancodeWaitmsg;
                                    if (info != null)
                                    {
                                        responseContent = actionBLL.HandleEventScancodeWaitmsg(info);
                                    }
                                }
                                break;

                            case RequestEvent.pic_sysphoto:
                                {
                                    //彈出系統拍照發圖的事件推送
                                    RequestEventPicSysphoto info = XmlConvertor.XmlToObject(postStr, typeof(RequestEventPicSysphoto)) as RequestEventPicSysphoto;
                                    if (info != null)
                                    {
                                        responseContent = actionBLL.HandleEventPicSysphoto(info);
                                    }
                                }
                                break;
..................

處理掃描結果並返回的最終代碼以下所示。

        /// <summary>
        /// 掃碼推事件且彈出「消息接收中」提示框的事件推送的處理
        /// </summary>
        /// <param name="info">掃描信息</param>
        /// <returns></returns>
        public string HandleEventScancodeWaitmsg(RequestEventScancodeWaitmsg info)
        {
            ResponseText response = new ResponseText(info);
            response.Content = string.Format("您的信息爲:{0},能夠結合後臺進行數據查詢。", info.ScanCodeInfo.ScanResult);
            return response.ToXml();
        }

最後咱們測試掃描一個條形碼,能夠看到返回的結果界面操做以下所示。

 

五、新菜單功能測試發現的問題

前面介紹了一些新菜單功能模塊的集成,我我的對這種掃一掃菜單功能很是讚揚,這也是微信逐步整合更多硬件資源和接口處理的趨向,不過在集成使用的時候,發現公衆號偶爾出現閃退的狀況,還有就是這些新功能雖而後臺可以實現數據的處理和接收,可是有一些不能返回應答消息,很鬱悶。也許隨着版本研發的加快,這些功能很快獲得完善和解決。

另外微信開放平臺也投入使用了,好些認證也是300元一年,不過暫時沒有其應用的場景,我只是用到了它來獲取微信帳號的unionid的功能,其餘功能慢慢了解吧。

還有就是微信的企業號也已經出來了,並且我也已經申請認證經過,它的開發用戶的API也有很多,有空繼續研究並整合到微信開發框架裏面吧。

 

若是對這個《C#開發微信門戶及應用》系列感興趣,能夠關注個人其餘文章,系列隨筆以下所示:

C#開發微信門戶及應用(25)-微信企業號的客戶端管理功能

C#開發微信門戶及應用(24)-微信小店貨架信息管理

C#開發微信門戶及應用(23)-微信小店商品管理接口的封裝和測試

C#開發微信門戶及應用(22)-微信小店的開發和使用

C#開發微信門戶及應用(21)-微信企業號的消息和事件的接收處理及解密 

C#開發微信門戶及應用(20)-微信企業號的菜單管理

C#開發微信門戶及應用(19)-微信企業號的消息發送(文本、圖片、文件、語音、視頻、圖文消息等)

C#開發微信門戶及應用(18)-微信企業號的通信錄管理開發之成員管理

C#開發微信門戶及應用(17)-微信企業號的通信錄管理開發之部門管理

C#開發微信門戶及應用(16)-微信企業號的配置和使用

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)--開始使用微信接口

相關文章
相關標籤/搜索