上一篇说道基本信息的回复《C#微信开发之旅--基本信息的回复》,当中就说到文本信息的回复,其他信息的回复,可以参考下开发文档中回复信息的格式进行修改就可以。
下面来实现下自定义菜单。据我了解 订阅号是没有这个功能的,服务号的话,也是需要去认证后才能提供这个接口!当然了,使用测试号的话,功能齐全!
我们可以看下,开发文档:
自定义菜单创建接口
可以发现,其实也是很简单的事情,就是给指定的地址发送POST请求:https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN
Access_Token是什么呢?我就不解释了,可以去看下
获取access token
就是给https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET发送get请求,其中appid和appsecret就是我们在第一篇申请测试接口出现的那2个值
根据开发文档,我们可以知道,第一步先通过appid和apsecret去获取access_token,然后通过access_token去创建菜单!
获取access_token:
/// <summary> /// 获取Token /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnGet_Click(object sender, EventArgs e) { string result = HttpHelper.GetWebRequest("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + txtAppId.Text + "&secret=" + txtAppsecret.Text, System.Text.Encoding.UTF8); TokenModel token = Newtonsoft.Json.JsonConvert.DeserializeObject<TokenModel>(result); if (token.access_token != null) txtToken.Text = token.access_token; else { ResultModel rm = Newtonsoft.Json.JsonConvert.DeserializeObject<ResultModel>(result); enumResult en = (enumResult)rm.errcode; MessageBox.Show(EnumHelper.GetEnumDesc(en)); } }
其中HttpHelper.GetWebRequest是封装好的get请求,TokenModel是保持正确结果,ResultModel是保存错误信息的,enumResult是所有错误编码。
如果请求成功就会得到我们要的access_token
/// <summary> /// 返回全局编码 /// </summary> public class ResultModel { public int errcode { get; set; } public string errmsg { get; set; } } /// <summary> /// 获取access_token返回结果 /// </summary> public class TokenModel { public string access_token { set; get; } public string expires_in { set; get; } }
枚举太长就不贴上来了,就是下面图片显示的这个样子:
我们已经有了access_token以后,就可以发送post请求去创建菜单了!根据开发文档可以看到,我们是把菜单数据转换成json传递过去就可以了。
string jsonStr = Newtonsoft.Json.JsonConvert.SerializeObject(wxMenu); string result = HttpHelper.PostWebRequest(" https://api.weixin.qq.com/cgi-bin/menu/create?access_token=" + txtToken.Text, jsonStr, System.Text.Encoding.UTF8); try { ResultModel rm = Newtonsoft.Json.JsonConvert.DeserializeObject<ResultModel>(result); enumResult en = (enumResult)rm.errcode; MessageBox.Show(EnumHelper.GetEnumDesc(en)); } catch (Exception ex) { MessageBox.Show(ex.Message); }
jsonStr就是我要创建的菜单数据,我的思路是创建类,把数据保存到类中,然后通过转换直接生成json数据的,当然了,也可以直接通过字符看去拼接。只要最后的数据是json格式就可以。
HttpHelper.PostWebRequest是封装好的post请求 ResultModel和enumResult上面都有提到,jsonStr可以用下面这个代替
{ "button":[ { "type":"click", "name":"今日歌曲", "key":"V1001_TODAY_MUSIC" }, { "name":"菜单", "sub_button":[ { "type":"view", "name":"搜索", "url":"http://www.soso.com/" }, { "type":"view", "name":"视频", "url":"http://v.qq.com/" }, { "type":"click", "name":"赞一下我们", "key":"V1001_GOOD" }] }] }
返回创建成功就可以了。如果在公众号发现菜单没变的话,可以先取消关注,再进行关注就OK了!
对了,使用这个的时候,需要关闭微信后台那个手动设置菜单的配置。测试帐号就不用管这些啦。