首頁  >  文章  >  微信小程式  >  C#開發微信入口網站及應用程式(15)-微信選單增加掃一掃、發圖片、發地理位置功能

C#開發微信入口網站及應用程式(15)-微信選單增加掃一掃、發圖片、發地理位置功能

高洛峰
高洛峰原創
2017-02-18 09:14:561670瀏覽

前面介紹了很多篇關於使用C#開發微信門戶及應用的文章,基本上把當時微信能做的接口都封裝差不多了,微信框架也積累了不少模組和用戶,最近發現微信公眾平台增加了不少內容,特別是在自訂選單裡面增加了掃一掃、發圖片、發地理位置功能,這幾個功能模組很重要,想想以前想在微信公眾號裡面增加一個掃描二維碼的功能,都做不了,現在可以了,還可以拍照上傳等功能,本文主要介紹基於我前面的框架系列文章,進一步介紹如何整合和使用這些新增功能。

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


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


1). 掃碼推送事件


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


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


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


3). 彈出系統拍照發圖


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


4). 彈出拍照或相簿發圖


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


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


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


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


用戶點擊按鈕後,微信客戶端將調起地理位置選擇工具,完成選擇操作後,將選擇的地理位置發送給開發者的伺服器,同時收起位置選擇工具,隨後可能會收到開發者發出的訊息。

但請注意,以上新增能力,均僅支援微信iPhone5.4.1以上版本,和Android5.4以上版本的微信用戶,舊版微信用戶點擊後將沒有回應,開發者也不能正常接收到事件推送。

 

2、微信新選單功能的測試公眾號C#开发微信门户及应用(15)-微信菜单增加扫一扫、发图片、发地理位置功能

微信不僅增加了這些功能模組的支持,還考慮到我們開發人員的方便,增加了一個叫做“menutest"的公眾號,方便我們測試。我們在公眾號搜尋「menutest",然後關注它即可進行測試幾個新增功能了。

“menutest"的公眾號名稱是”自訂選單拓展測試“,我關注它並進行了測試,二維碼、圖片、地理位置都很OK,本身能夠響應這些事件,並且圖片、地理位置本身還能出現一個對應的事件,如下圖所示。 C#开发微信门户及应用(15)-微信菜单增加扫一扫、发图片、发地理位置功能 C#开发微信门户及应用(15)-微信菜单增加扫一扫、发图片、发地理位置功能 圖片發送可以分為拍照、拍照和相簿、微信相簿三類,感覺後面兩個有點類似,但有這些功能都很不錯的。

       

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

前面說了,微信提供這些功能,可以在菜單裡面進行集成,也就是菜單的類型由原來CLICK/VIEW,變為現在8種菜單的類型由原來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.php.cn/"),                
                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));
            }
        }
🎜🎜🎜🎜🎜🎜
        /// <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);
        }
🎜🎜🎜🎜🎜🎜
    /// <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; }

    }
🎜🎜🎜

当然,一般情况下我们都是在Web后台系统进行的,维护菜单都是在自己微信平台上进行菜单管理,然后一次性提交到微信服务器即可。

C#开发微信门户及应用(15)-微信菜单增加扫一扫、发图片、发地理位置功能

而在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);
        }


4、微信扫一扫功能集成 

 前面讲了,有了最新的功能,我们就可以实现扫一扫功能,从而可以扫描条形码,二维码的功能。有了条形码、二维码的快速和识别,我们就能开发一些如条码查询、商品处理等功能了。

这里我们介绍如何在我的微信开发框架里面整合这个扫一扫的功能处理操作。

前面已经增加了一些新功能的测试菜单,我们要做的就是响应这些事件处理,然后对他们进行应答处理就可以了。

下面是根据事件进行的一些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();
        }


最后我们测试扫描一个条形码,可以看到返回的结果界面操作如下所示。

C#开发微信门户及应用(15)-微信菜单增加扫一扫、发图片、发地理位置功能

 

5、新菜单功能测试发现的问题

前面介绍了一些新菜单功能模块的集成,我个人对这种扫一扫菜单功能非常赞赏,这也是微信逐步整合更多硬件资源和接口处理的趋向,不过在集成使用的时候,发现公众号偶尔出现闪退的情况,还有就是这些新功能虽然后台能够实现数据的处理和接收,但是有一些不能返回应答消息,很郁闷。也许随着版本研发的加快,这些功能很快得到完善和解决。

另外微信开放平台也投入使用了,好些认证也是300元一年,不过暂时没有其应用的场景,我只是用到了它来获取微信账号的unionid的功能,其他功能慢慢了解吧。

还有就是微信的企业号也已经出来了,而且我也已经申请认证通过,它的开发用户的API也有不少,有空继续研究并整合到微信开发框架里面吧。

 

更多C#开发微信门户及应用(15)-微信菜单增加扫一扫、发图片、发地理位置功能 相关文章请关注PHP中文网!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn