zoukankan      html  css  js  c++  java
  • 微信公众号开发系列-发展模式,创建自己的自定义菜单

    方式,通过程序来实现其定义菜单,经http要求包装类的互动微信其定义菜单界面

    1、弄AccessToken

    access_token是一个全球唯一的公共条例草案的数,这是需要使用公共号码呼叫每个接口access_token。

    在正常情况下access_token有效期为7200秒,反复获取将导致上次获取的access_token失效。因为获取access_token的api调用次数很有限,建议开发人员全局存储与更新access_token。频繁刷新access_token会导致api调用受限,影响自身业务。

    请开发人员注意。因为技术升级。公众平台的开发接口的access_token长度将增长,其存储至少要保留512个字符空间。此改动将在1个月后生效,请开发人员尽快改动兼容。

    公众号能够使用AppID和AppSecret调用本接口来获取access_token。AppID和AppSecret可在开发模式中获得(须要已经成为开发人员,且帐号没有异常状态)。

    注意调用全部微信接口时均需使用https协议。

    点击查看微信接口开发文档

    这里通过SettingHelper.cs进行操作,通过该类存储access_token,避免反复获取;

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Web;
    using System.Xml.Linq;
    
    public class SettingHelper
    {
        private readonly static string filePath = AppDomain.CurrentDomain.BaseDirectory + "Config.xml";
    
        static SettingHelper()
        {
            if (!System.IO.File.Exists(filePath))
                SetDefSetting();
        }
    
        public static void SetDefSetting()
        {
            var doc = new XDocument();
            doc.Add(new XElement("root",
                    new XElement("accesstoken", ""),
                    new XElement("expires_in", ""),
                    new XElement("get_token_time", DateTime.Now.ToString())
                ));
            doc.Save(filePath);
        }
    
        public static string GetSettingByAccessToken()
        {
            var doc = XDocument.Load(filePath);
            var token = doc.Element("root").Element("accesstoken").Value;
            var expires = doc.Element("root").Element("expires_in").Value;
            var time = Convert.ToDateTime(doc.Element("root").Element("get_token_time").Value);
            if (string.IsNullOrWhiteSpace(token) || string.IsNullOrWhiteSpace(expires))
                return string.Empty;
    
            time = time.AddSeconds(Convert.ToInt32(expires));
            if (time > DateTime.Now)
                return token;
            else
                return string.Empty;
        }
    
        public static void SaveSettingByAccessToken(string accessToken, string expiresIn)
        {
            var doc = XDocument.Load(filePath);
            doc.Element("root").Element("accesstoken").Value = accessToken;
            doc.Element("root").Element("expires_in").Value = expiresIn;
            doc.Element("root").Element("get_token_time").Value = DateTime.Now.ToString();
            doc.Save(filePath);
        }
    
    
        /// <summary>
        /// 获取accesstoken
        /// </summary>
        /// <returns></returns>
        public static string GetAccessToken()
        {
            var pm = new Paraments();
            var query = new StringBuilder();
            query.Append(pm.TokenUrl);
            query.Append(string.Format("?{0}={1}", "grant_type", "client_credential"));
            query.Append(string.Format("&{0}={1}", "appid", pm.AppKey));
            query.Append(string.Format("&{0}={1}", "secret", pm.AppSecret));
            var json = HttpHelper.Get(query.ToString());
    
            var result = JsonHelper.Deserialize(json);
            if (result.access_token == null)
                return string.Empty;
    
            SettingHelper.SaveSettingByAccessToken((string)result.access_token, (string)result.expires_in);
    
            return (string)result.access_token;
        }
    
    }


    2、通过http请求封装类交互微信自己定义菜单接口

    点击这里查看我前面讲到的前一章:微信公众号开发系列-Http请求封装基类HttPhelper.cs以下接口请求已用到。

    protected void btnCreate_Click(object sender, EventArgs e)
        {
            var accessToken = SettingHelper.GetSettingByAccessToken();
            if (string.IsNullOrWhiteSpace(accessToken))
                accessToken = SettingHelper.GetAccessToken();
    
            if (string.IsNullOrWhiteSpace(accessToken))
            {
                Response.Write(accessToken); return;
            }
    
            var data = "{"button": [{"name":"公司介绍", "sub_button": [{"type": "click","name": "公司简单介绍","key": "m_znq"},{"type": "click","name": "关于我们","key": "m_xpdz"},{"type": "click","name": "交通方式","key": "m_jmt"}]},";
            data += "{"name": "解决方式","sub_button": [{"type": "click","name": "电商解决方式","key": "电商解决方式"},{"type": "click","name": "HR人事管理解决方式","key": "人事管理解决方式"},{"type": "click","name": "物业管理方案","key": "物业管理方案"}]},";
            data += "{"name": "业务领域","sub_button": [{"type": "view","name": "业务范围","url": "http://www.haiyusoft.com"},{"type": "click","name": "联合研发中心","key": "m_about"},{"type": "click","name": "我要绑定","key": "我要绑定"}]}]}";
            var json = HttpHelper.Post("https://api.weixin.qq.com/cgi-bin/menu/create?access_token=" + accessToken, data);
            Response.Write(json);
            Response.End();
        }

    眼下自己定义菜单最多包括3个一级菜单。每一个一级菜单最多包括5个二级菜单。一级菜单最多4个汉字,二级菜单最多7个汉字,多出来的部分将会以“...”取代。请注意。创建自己定义菜单后,因为微信client缓存。须要24小时微信client才会展现出来。建议測试时能够尝试取消关注公众账号后再次关注,则能够看到创建后的效果。

    自己定义菜单接口可实现多种类型button。例如以下:点击查看微信开发文档-微信自己定义菜单创建

    1、click:点击推事件
    用户点击click类型button后,微信server会通过消息接口推送消息类型为event	的结构给开发人员(參考消息接口指南),而且带上button中开发人员填写的key值,开发人员能够通过自己定义的key值与用户进行交互。
    2、view:跳转URL
    用户点击view类型button后。微信client将会打开开发人员在button中填写的网页URL,可与网页授权获取用户基本信息接口结合,获得用户基本信息。

    3、scancode_push:扫码推事件 用户点击button后,微信client将调起扫一扫工具,完毕扫码操作后显示扫描结果(假设是URL,将进入URL),且会将扫码的结果传给开发人员。开发人员能够下发消息。 4、scancode_waitmsg:扫码推事件且弹出“消息接收中”提示框 用户点击button后。微信client将调起扫一扫工具,完毕扫码操作后,将扫码的结果传给开发人员,同一时候收起扫一扫工具,然后弹出“消息接收中”提示框。随后可能会收到开发人员下发的消息。 5、pic_sysphoto:弹出系统拍照发图 用户点击button后,微信client将调起系统相机,完毕拍照操作后,会将拍摄的相片发送给开发人员,并推送事件给开发人员。同一时候收起系统相机,随后可能会收到开发人员下发的消息。 6、pic_photo_or_album:弹出拍照或者相冊发图 用户点击button后,微信client将弹出选择器供用户选择“拍照”或者“从手机相冊选择”。

    用户选择后即走其它两种流程。 7、pic_weixin:弹出微信相冊发图器 用户点击button后,微信client将调起微信相冊,完毕选择操作后,将选择的相片发送给开发人员的server。并推送事件给开发人员,同一时候收起相冊,随后可能会收到开发人员下发的消息。

    8、location_select:弹出地理位置选择器 用户点击button后。微信client将调起地理位置选择工具。完毕选择操作后。将选择的地理位置发送给开发人员的server,同一时候收起位置选择工具,随后可能会收到开发人员下发的消息。

    请注意。3到8的全部事件,仅支持微信iPhone5.4.1以上版本号。和Android5.4以上版本号的微信用户。旧版本号微信用户点击后将没有回应。开发人员也不能正常接收到事件推送。


    本人新浪微博:http://weibo.com/i/1741159542


    版权声明:本文博主原创文章,博客,未经同意不得转载, 注意很多其他科技博客贻芳:http://blog.csdn.net/fuyifang

  • 相关阅读:
    SAP S/4HANA extensibility扩展原理介绍
    SAP CRM系统订单模型的设计与实现
    使用nodejs代码在SAP C4C里创建Individual customer
    SAP Cloud for Customer Account和individual customer的区别
    Let the Balloon Rise map一个数组
    How Many Tables 简单并查集
    Heap Operations 优先队列
    Arpa’s obvious problem and Mehrdad’s terrible solution 思维
    Passing the Message 单调栈两次
    The Suspects 并查集
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/4842832.html
Copyright © 2011-2022 走看看