想进行微信公众平台开发已经有一年半了,之前也想过很多种可行性案例,可迟迟没有行动起来,昨天也看到了小区物业开启了微信服务,也是我思考的案例之一,也是我觉得最有用的一个案例,可苦于没有服务器资源没有进行,最近正好有一次机会开始了微信开发之旅,虽说有点晚,但总算也是涨点姿势。
今天进行的是微信自定义菜单,菜单功能包括以下4点:
进行微信开发需要认证的订阅号或服务号,并开启开发模式,具体方法不废话,直接说自定义菜单:
查询
很简单,就不说了。
修改
微信的接口中没有修改,所以要进行删除与创建两步操作。
- 获取access_token
微信的每一步操作都是依靠这个token进行的,所以每步操作前都需要获取,有效期默认是7200秒,如果在这段时间内可以保存就不用再次获取
public static JObject access_token(int memberPKId)
{
ShpWeiXinShopAppData wxData = new ShpWeiXinShopAppSystem().GetData(memberPKId);
Uri uri = new Uri(String.Format(@"https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}", wxData.WxAppId_NULL, wxData.WxSecret_NULL));
HttpWebRequest wxReq = HttpWebRequest.Create(uri) as HttpWebRequest;
string wxJson = "";
using (HttpWebResponse wxTokenRes = wxReq.GetResponse() as HttpWebResponse)
{
StreamReader reader = new StreamReader(wxTokenRes.GetResponseStream());
wxJson = reader.ReadToEnd();
}
return JObject.Parse(wxJson);
}
- 删除菜单
JObject json = WeiXin.access_token(Int32.Parse(memberPKId));
if (json["access_token"] != null)
{
string access_token = json["access_token"].ToString();
Uri uri = new Uri(String.Format(@"https://api.weixin.qq.com/cgi-bin/menu/delete?access_token={0}", access_token));
HttpWebRequest wxMenuReq = HttpWebRequest.Create(uri) as HttpWebRequest;
using (HttpWebResponse wxDelMenuRes = wxMenuReq.GetResponse() as HttpWebResponse)
{
StreamReader reader = new StreamReader(wxDelMenuRes.GetResponseStream());
menuDel = reader.ReadToEnd();
}
json = JObject.Parse(menuDel);
- 创建菜单
创建时不仅需要传送参数,还需要传送一个json对象过去,先拼接成字符串再post,顺便吐槽一下,C#的post方法还没有jquery的post方便,怪不得那么多前端牛逼了
if(json["errcode"].ToString() == "0")
{
DataTable dt = new ShpWeixinShopMenuSystem().GetShpWeixinShopMenuListByMemberPKId(Int32.Parse(memberPKId));
DataRow[] firstMenu = dt.Select("MenuLevel = 1", "DisplayOrder");
string menu = "{\"button\":[";
foreach(DataRow dr1 in firstMenu)
{
menu += "{\"name\":\"" + dr1["MenuCaption"].ToString() + "\"";
string expression = String.Format("MenuLevel = 2 and ParentMenu = {0}", dr1["MenuItemPKId"].ToString());
DataRow[] secondMenu = dt.Select(expression, "DisplayOrder");
if(secondMenu.Length > 0)
{
menu += ",\"sub_button\":[";
foreach(DataRow dr2 in secondMenu)
{
menu += "{\"type\":\"view\",\"name\":\"" + dr2["MenuCaption"].ToString() + "\",\"url\":\"" + dr2["RelUrl"].ToString() + "\"},";
}
menu = menu.Remove(menu.Length-1, 1);
menu += "]},";
}
}
menu += "]}";
HttpWebRequest wxMenuRequest = (HttpWebRequest)WebRequest.Create("https://api.weixin.qq.com/cgi-bin/menu/create?access_token=" + access_token);
wxMenuRequest.ContentType = "text/json";
wxMenuRequest.Method = "POST";
using(StreamWriter sw = new StreamWriter(wxMenuRequest.GetRequestStream()))
{
sw.Write(menu);
sw.Flush();
sw.Close();
HttpWebResponse wxMenuResponse = (HttpWebResponse)wxMenuRequest.GetResponse();
using(StreamReader sr = new StreamReader(wxMenuResponse.GetResponseStream()))
{
menuCre = sr.ReadToEnd();
}
}
}
菜单事件推送
就是点击菜单按钮事件的通知。
写在最后
开发微信公众平台貌似不难,RESTapi调试起来也异常的方便,而且微信中没有太多的界面、用户体验之类的东西,所以整体来说开发速度比较快,难度不高,而真正需要的是想法与运营。