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 = ;
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[];
}
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;

序列化菜单方法和使用

微信公众平台开发视频教程-03-获取Access Token和获取微信服务器IP,添加微信菜单的更多相关文章

  1. 微信公众号开发笔记1-获取Access Token

    获取你的Access Token a)可以采用网址的形式: 用appid和appsecert获得access token,接口为https://api.weixin.qq.com/cgi-bin/to ...

  2. 微信公众平台开发教程--方培工作室,PHP语言版本

    准备工作 微信公众平台的注册 介绍如何注册一个微信公众账号. 入门教程 微信公众平台开发入门教程 内容:1.申请SAE作为服务器; 2.启用开发模式; 3.微信公众平台PHP SDK; 4.接收发送消 ...

  3. PHP实现微信公众平台开发—基础篇

    PHP实现微信公众平台开发—基础篇 2 1课程介绍 2 2. 微信公众号账号介绍的申请流程详解 2 2.1微信三角色关系 2 2.2信息流的过程 2 2.4微信公众账号的认证 3 2.5订阅号的申请流 ...

  4. Senparc.Weixin.MP SDK 微信公众平台开发教程(十七):个性化菜单接口说明

    前不久微信上线了个性化菜单接口,Senparc.Weixin SDK也已经同步更新. 本次更新升级Senparc.Weixin.MP版本到v13.5.2,依赖Senparc.Weixin版本4.5.4 ...

  5. Senparc.Weixin.MP SDK 微信公众平台开发教程(五):使用Senparc.Weixin.MP SDK

    Senparc.Weixin.MP SDK已经涵盖了微信6.x的所有公共API. 整个项目的源代码以及已经编译好的程序集可以在这个项目中获取到:https://github.com/JeffreySu ...

  6. Senparc.Weixin.MP SDK 微信公众平台开发教程(七):解决用户上下文(Session)问题

    从这篇文章中我们已经了解了微信公众平台消息传递的方式,这种方式有一个先天的缺陷:不同用户的请求都来自同一个微信服务器,这使得常规的Session无法使用(始终面对同一个请求对象,况且还有对方服务器Co ...

  7. Senparc.Weixin.MP SDK 微信公众平台开发教程(八):通用接口说明

    一.基础说明 这里说的“通用接口(CommonAPIs)”是使用微信公众账号一系列高级功能的必备验证功能(应用于开发模式). 我们通过微信后台唯一的凭证,向通用接口发出请求,得到访问令牌(Access ...

  8. Senparc.Weixin.MP SDK 微信公众平台开发教程(九):自定义菜单接口说明

    上一篇<Senparc.Weixin.MP SDK 微信公众平台开发教程(八):通用接口说明>介绍了如何通过通用接口获取AccessToken,有了AccessToken,我们就可以来操作 ...

  9. Senparc.Weixin.MP SDK 微信公众平台开发教程(十一):高级接口说明

    这里所说的高级接口是指面向通过认证的服务号开通的高级功能. 高级功能大致可以分类为: 用户接口 分组接口 客服接口(有别于之前介绍的多客服) 群发接口 多媒体接口 二维码接口 模板消息接口(不是所有账 ...

随机推荐

  1. ifram,framset 互相调用JS

    window.parent.frames["Indexbanner3"].aa(); http://blog.163.com/wenchangqing_live/blog/stat ...

  2. HDU 5024 Wang Xifeng's Little Plot (DP)

    题意:给定一个n*m的矩阵,#表示不能走,.表示能走,让你求出最长的一条路,并且最多拐弯一次且为90度. 析:DP,dp[i][j][k][d] 表示当前在(i, j)位置,第 k 个方向,转了 d ...

  3. Webpack使用教程三(webpack-dev-server)

    Webpack给本地开发提供了一个可选的服务器webpack-dev-server.webpack-dev-server是一个很小的express应用,使用前需要用npm安装,它根据webpack.c ...

  4. 数据库知识整理<二>

    又继续写的博客,希望自己能坚持每天写博客.分享自己的点滴,对自己成长有帮助.今天下午高强度打了三个小时篮球,小腿都抽筋了.很爽,失落的心情似乎变得开明了一些.想到了一句话:“像SB式的坚持总会有好的收 ...

  5. 轻量级模块化开发框架 Hasor 核心模块 v0.0.2 发布

    首先引用Wiki的介绍一下Hasor:     “Hasor是一款开源框架.它是为了解决企业模块化开发中复杂性而创建的.Hasor遵循简单的依赖.单一职责,在开发多模块企业项目中更加有调理.然 而Ha ...

  6. SQL语句汇总(终篇)—— 表联接与联接查询

    上一篇博文说到相关子查询效率低下,那我们怎么能将不同表的信息一起查询出来呢?这就需要用到表联接. 和之前的UNION组合查询不同,UNION是将不同的表组合起来,也就是纵向联接,说白了就是竖着拼起来. ...

  7. Linux 下zip包的压缩与解压

    linux zip 命令详解 功能说明:压缩文件. 语 法:zip [-AcdDfFghjJKlLmoqrSTuvVwXyz$][-b <工作目录>][-ll][-n <字尾字符串& ...

  8. 用c#开发微信 (17) 微活动 3 投票活动 (文本投票)

    前面介绍了微活动<大转盘> 和 <刮刮卡>,这次介绍下微投票,微投票分二种,一种是文本投票, 一种是图片投票.   下面介绍文本投票的详细步骤: 1. 新建文本投票活动     ...

  9. 重新理解JS的6种继承方式

    写在前面 一直不喜欢JS的OOP,在学习阶段好像也用不到,总觉得JS的OOP不伦不类的,可能是因为先接触了Java,所以对JS的OO部分有些抵触. 偏见归偏见,既然面试官问到了JS的OOP,那么说明这 ...

  10. 让ASP.NET Web API支持text/plain内容协商

    ASP.NET Web API的内容协商(Content Negotiation)机制的理想情况是这样的:客户端在请求头的Accept字段中指定什么样的MIME类型,Web API服务端就返回对应的M ...