• 微信公众平台开发视频教程-03-获取Access Token和获取微信服务器IP,添加微信菜单


    1 获取access token

    此token是以后每次调用微信接口都会带上的票据,token是公众号全局唯一票据,在调用其他接口之前都需要先得到token,taoken长度至少512个字符,通常用string保存即可,有效时间2小时,重复获取后,前一次的token会失效

    调用获取access token接口
    http请求方式: GET
    https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
    参数     是否必须     说明
    grant_type     是     获取access_token填写client_credential
    appid     是     第三方用户唯一凭证
    secret     是     第三方用户唯一凭证密钥,即appsecret

           private Access_token_info GetTokenInfo()
            {
                string url = string.Format(urlFormat, appID, appSecret);
                string json = Tool.HttpGet(url);
                Access_token_info obj = Tool.DeserializeJson(json);
                return obj;
            }

    成功返回时候,返回如下:
    {"access_token":"ACCESS_TOKEN","expires_in":7200}
    失败的时候返回如下
    {"errcode":40013,"errmsg":"invalid appid"}
    各字段说明
    access_token     获取到的凭证
    expires_in     凭证有效时间,单位:秒
    errcode   错误编号
    errmsg 错误信息说明

    主要代码:

    private const string urlFormat = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}";
    string url = string.Format(urlFormat, appID, appSecret);
    string json = Tool.GetHtml(url);
    Access_token_info obj = Tool.ReadJson<Access_token_info>(json);

    以上方法就是获取accesstoken,因为是get方法获取,需要我们封装了一个HTTPGET的方法,方法如下:

            public static String HttpGet(String Url)
            {
                string sException = null;
                string sRslt = null;
                WebResponse oWebRps = null;
                WebRequest oWebRqst = WebRequest.Create(Url);
                oWebRqst.Timeout = 50000;
                try
                {
                    oWebRps = oWebRqst.GetResponse();
                }
                catch (WebException e)
                {
                    sException = e.Message.ToString();
                }
                catch (Exception e)
                {
                    sException = e.ToString();
                }
                finally
                {
                    if (oWebRps != null)
                    {
                        StreamReader oStreamRd = new StreamReader(oWebRps.GetResponseStream(), Encoding.GetEncoding("UTF-8"));
                        sRslt = oStreamRd.ReadToEnd();
                        oStreamRd.Close();
                        oWebRps.Close();
                    }
                }
                return sRslt;
            }

    2 JSON字符串反序列化

    因为微信很多交互都是通过json来,所以我们很有必要封装一些方法来,对json进行序列化和反序列化

    微信服务器返回数据大部分都是json格式的,所以为了方便我们使用,我们需要封装一个反序列化json的方法
    我们使用Newtonsoft.Json 这个第三方组件,版本是.NET 2.0的
    封装方法如下:

           public static T ReadJson(string jsonText)
            {
                return JavaScriptConvert.DeserializeObject(jsonText);
            }

    微信开发

    微信开发

    3 基类Page

    因为我们的aspx页面很多东西都是公用一个的
    比如appid apps等这些
    所以我们可以封装一个基类page
    如图
    添加一个返回实体
    Access_token_info 属性包含成功信息和错误信息
    属性名称保留一样的 否则无法反序列化

    微信开发

    4 获取微信服务器IP

    有些时候,我们需要获取微信服务器的IP地址列表
    这样的作用是开发者可以处于安全考虑,通过IP来判断是否是他人伪造数据
    接口:https://api.weixin.qq.com/cgi-bin/getcallbackip?access_token=ACCESS_TOKEN
    参数只需要一个:公众号的access_token
    成功返回:
    {
        "ip_list":["127.0.0.1","127.0.0.1"]
    }
    失败返回:{"errcode":40013,"errmsg":"invalid appid"}

                try
                {
                    Access_token_info obj = GetTokenInfo();//先获取token信息
                    if (string.IsNullOrEmpty(obj.errcode))
                    {
                        string url = string.Format("https://api.weixin.qq.com/cgi-bin/getcallbackip?access_token={0}", obj.access_token);
                        string json = Tool.HttpGet(url);
                        Ip_listInfo listInfo = Tool.DeserializeJson(json);//获取ip列表
                        this.labelRes.Text = "Ip个数:" + listInfo.ip_list.Count() + " 第一个:" + listInfo.ip_list[0];
                    }
                    else
                    {
                        this.labelRes.Text = obj.errcode + " " + obj.errmsg;
                    }
                }
                catch (Exception ex)
                {
                    this.labelRes.Text = ex.Message;
                }

    获取IP列表的实现

    5 添加自定义菜单,就是在公众号的地步添加菜单

    自定义菜单最多包含3个一级菜单
    每个一级菜单最多包含5个二级菜单
    一级菜单最多4个汉字,二级菜单则最多7个汉字多出来的会用“...”代替
    创建自定义菜单后,如果发现上一次拉取菜单的请求在5分钟以前,就会拉取一下菜单,如果菜单有更新,就会刷新客户端的菜单。测试时可以尝试取消关注公众账号后再次关注,则可以看到创建后的效果。
    自定义菜单类型如下:

    上面的这些类型有特殊的
    添加View和Click 类型按钮
    Post数据到下面接口
    https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN 注意是https
    因为需要推送到,post数据到微信接口,所以我们需要序列化json文本到微信接口
    我们看一下菜单json文本
    在序列化菜单对象成json的
    时候,我们可以使用匿名

    代码实现

                Infos.Menu m = new Infos.Menu();
                //添加第一个菜单
                m.button.Add(new { type = "click", name = "今日歌曲", key = "V1001_TODAY_MUSIC" });
                //添加第二个菜单-包含子菜单
                ArrayList sub = new ArrayList();
                sub.Add(new { name = "搜索", type = "view", url = "http://www.soso.com/" });
                sub.Add(new { name = "视频", type = "view", url = "http://v.qq.com/" });
                sub.Add(new { name = "赞一d", type = "click", key = "V1001_GOOD" });
                m.button.Add(new { name = "菜单", sub_button = sub });
                //序列化成json文本
                string json = Tool.SerializeJson(m);
    
                Access_token_info obj = GetTokenInfo();//先获取token信息
                string url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=" + obj.access_token;
    
                string textResponse = Tool.PostJson(json, url);
    
                //反序列化饭回来的结果
                MenuCreateResultInfo menuResObj = Tool.DeserializeJson(textResponse);
    
                this.labelRes.Text = textResponse;

    http://www.bamn.cn/Upload/Editor/imgfile/2016/10/31/161031095050JP486DD080BRNBJ.png

    序列化菜单方法和使用

  • 相关阅读:
    【51nod】2590 持续讨伐
    【51nod】2589 快速讨伐
    【51nod】2606 Secondary Substring
    【LOJ】#3098. 「SNOI2019」纸牌
    【洛谷】P4202 [NOI2008]奥运物流
    【LOJ】#3103. 「JSOI2019」节日庆典
    【LOJ】#3102. 「JSOI2019」神经网络
    【洛谷】P5348 密码解锁
    【洛谷】P4883 mzf的考验
    【LOJ】#3101. 「JSOI2019」精准预测
  • 原文地址:https://www.cnblogs.com/maijin/p/6084483.html
Copyright © 2020-2023  润新知