第一步,通过APPID和APPSecret获得access_token
我把自定义菜单的json内容写在了一个单独的文件里,放在项目的根目录,取名WeChatMenu
自定义菜单的设置规则和字数限制,在微信开发文档里都说的很清楚,url要写清楚能访问的asp.net项目网址,随便写的话会报错,遇到报错可以在这里查询报错代码:https://developers.weixin.qq.com/doc/offiaccount/Getting_Started/Global_Return_Code.html
下面是json内容
{
"button": [
{
"name": "doyoxia",
"sub_button": [
{
"type": "view",
"name": "doyoxia官网",
"url": "#"
},
{
"type": "view",
"name": "doyoxia小程序",
"url": "#"
}
]
},
{
"name": "APP下载",
"sub_button": [
{
"type": "view",
"name": "安卓",
"url": "#"
},
{
"type": "view",
"name": "IOS",
"url": "#"
}
]
},
{
"name": "关于我们",
"sub_button": [
{
"type": "view",
"name": "商业合作",
"url": "#"
},
{
"type": "view",
"name": "联系客服",
"url": "#"
},
{
"type": "view",
"name": "关于我们",
"url": "#"
}
]
}
]
}
然后通过代码读取文件中的内容,读取内容后获得access_token,然后通过acces_token和自己写的自定义菜单的json内容访问接口,微信就会返回设置是否成功的代码,如果全部正确只需要访问一次,新的菜单就好了,可以取关再重新关注自己的公众号来查看新的菜单。
上代码
[HttpPost]
public IHttpActionResult WechatMenu(dynamic data)
{
string path = System.Web.Hosting.HostingEnvironment.MapPath(@"~/WechatMenu.json");
//get access_token
string url = string.Format("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=*****&secret=******");
var wm = new System.Net.Http.HttpClient().GetAsync(url).Result.Content.ReadAsStringAsync().Result;
WechatModels info = JsonConvert.DeserializeObject<WechatModels>(wm);
//create menu
string turl = string.Format("https://api.weixin.qq.com/cgi-bin/menu/create?access_token={0}", info.access_token);
using (StreamReader r = new StreamReader(path))
{
string json = r.ReadToEnd();
HttpContent httpContent = new StringContent(json);
httpContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json");
var menu = new System.Net.Http.HttpClient().PostAsync(turl, httpContent).Result.Content.ReadAsStringAsync().Result;
return Json(menu);
}
}
几个关键点,首先是WebApi里面如何获取json文件读取json内容
string path = System.Web.Hosting.HostingEnvironment.MapPath(@"~/WechatMenu.json");
尝试了几次,发现用这种方式获取文档地址最稳妥也不会出错,先通过相对路径查询文件位置,再通过物理路径读取文件
这是我的笨方法,可能不是最优解
WechatModels info = JsonConvert.DeserializeObject<WechatModels>(wm);
这句代码是把获取到的access_token返回代码转为实体类
public class WechatModels
{
public string access_token { get; set; }
public string expires_in { get; set; }
}
基本上就是这些,所有这些都需要在配置好的服务器上面运行访问,才能返回想要的结果。
希望这篇文档有一定的帮助!