2014年6月24日星期二

C#微信开发之菜单管理


想进行微信公众平台开发已经有一年半了,之前也想过很多种可行性案例,可迟迟没有行动起来,昨天也看到了小区物业开启了微信服务,也是我思考的案例之一,也是我觉得最有用的一个案例,可苦于没有服务器资源没有进行,最近正好有一次机会开始了微信开发之旅,虽说有点晚,但总算也是涨点姿势。

今天进行的是微信自定义菜单,菜单功能包括以下4点:

进行微信开发需要认证的订阅号服务号,并开启开发模式,具体方法不废话,直接说自定义菜单:

查询

很简单,就不说了。

修改

微信的接口中没有修改,所以要进行删除创建两步操作。

  1. 获取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);
}
  1. 删除菜单
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);
  1. 创建菜单
    创建时不仅需要传送参数,还需要传送一个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调试起来也异常的方便,而且微信中没有太多的界面、用户体验之类的东西,所以整体来说开发速度比较快,难度不高,而真正需要的是想法与运营。

%23%20C%23%u5FAE%u4FE1%u5F00%u53D1%u4E4B%u83DC%u5355%u7BA1%u7406%0A%0A@%28My%20Blogger%29%5BC%23%7C.NET%7C%u5F00%u53D1%7C%u5FAE%u4FE1%7C%u5FAE%u4FE1%u516C%u4F17%u5E73%u53F0%5D%0A%0A%u60F3%u8FDB%u884C%u5FAE%u4FE1%u516C%u4F17%u5E73%u53F0%u5F00%u53D1%u5DF2%u7ECF%u6709%u4E00%u5E74%u534A%u4E86%uFF0C%u4E4B%u524D%u4E5F%u60F3%u8FC7%u5F88%u591A%u79CD%u53EF%u884C%u6027%u6848%u4F8B%uFF0C%u53EF%u8FDF%u8FDF%u6CA1%u6709%u884C%u52A8%u8D77%u6765%uFF0C%u6628%u5929%u4E5F%u770B%u5230%u4E86%u5C0F%u533A%u7269%u4E1A%u5F00%u542F%u4E86%u5FAE%u4FE1%u670D%u52A1%uFF0C%u4E5F%u662F%u6211%u601D%u8003%u7684%u6848%u4F8B%u4E4B%u4E00%uFF0C%u4E5F%u662F%u6211%u89C9%u5F97%u6700%u6709%u7528%u7684%u4E00%u4E2A%u6848%u4F8B%uFF0C%u53EF%u82E6%u4E8E%u6CA1%u6709%u670D%u52A1%u5668%u8D44%u6E90%u6CA1%u6709%u8FDB%u884C%uFF0C%u6700%u8FD1%u6B63%u597D%u6709%u4E00%u6B21%u673A%u4F1A%u5F00%u59CB%u4E86%u5FAE%u4FE1%u5F00%u53D1%u4E4B%u65C5%uFF0C%u867D%u8BF4%u6709%u70B9%u665A%uFF0C%u4F46%u603B%u7B97%u4E5F%u662F%u6DA8%u70B9%u59FF%u52BF%u3002%0A%0A%u4ECA%u5929%u8FDB%u884C%u7684%u662F%u5FAE%u4FE1%u81EA%u5B9A%u4E49%u83DC%u5355%uFF0C%u83DC%u5355%u529F%u80FD%u5305%u62EC%u4EE5%u4E0B4%u70B9%uFF1A%0A-%20**%5B%u521B%u5EFA%u83DC%u5355%5D%28http%3A//mp.weixin.qq.com/wiki/index.php%3Ftitle%3D%25E8%2587%25AA%25E5%25AE%259A%25E4%25B9%2589%25E8%258F%259C%25E5%258D%2595%25E5%2588%259B%25E5%25BB%25BA%25E6%258E%25A5%25E5%258F%25A3%29**%0A-%20**%5B%u67E5%u8BE2%u83DC%u5355%5D%28http%3A//mp.weixin.qq.com/wiki/index.php%3Ftitle%3D%25E8%2587%25AA%25E5%25AE%259A%25E4%25B9%2589%25E8%258F%259C%25E5%258D%2595%25E6%259F%25A5%25E8%25AF%25A2%25E6%258E%25A5%25E5%258F%25A3%29**%0A-%20**%5B%u5220%u9664%u83DC%u5355%5D%28http%3A//mp.weixin.qq.com/wiki/index.php%3Ftitle%3D%25E8%2587%25AA%25E5%25AE%259A%25E4%25B9%2589%25E8%258F%259C%25E5%258D%2595%25E5%2588%25A0%25E9%2599%25A4%25E6%258E%25A5%25E5%258F%25A3%29**%0A-%20**%5B%u83DC%u5355%u4E8B%u4EF6%u63A8%u9001%5D%28http%3A//mp.weixin.qq.com/wiki/index.php%3Ftitle%3D%25E8%2587%25AA%25E5%25AE%259A%25E4%25B9%2589%25E8%258F%259C%25E5%258D%2595%25E4%25BA%258B%25E4%25BB%25B6%25E6%258E%25A8%25E9%2580%2581%29**%0A%0A%u8FDB%u884C%u5FAE%u4FE1%u5F00%u53D1%u9700%u8981**%u8BA4%u8BC1%u7684%u8BA2%u9605%u53F7**%u6216**%u670D%u52A1%u53F7**%uFF0C%u5E76%u5F00%u542F%u5F00%u53D1%u6A21%u5F0F%uFF0C%u5177%u4F53%u65B9%u6CD5%u4E0D%u5E9F%u8BDD%uFF0C%u76F4%u63A5%u8BF4%u81EA%u5B9A%u4E49%u83DC%u5355%uFF1A%0A%0A%23%23%23%23%u67E5%u8BE2%0A%u5F88%u7B80%u5355%uFF0C%u5C31%u4E0D%u8BF4%u4E86%u3002%0A%0A%23%23%23%23%u4FEE%u6539%0A%u5FAE%u4FE1%u7684%u63A5%u53E3%u4E2D%u6CA1%u6709%u4FEE%u6539%uFF0C%u6240%u4EE5%u8981%u8FDB%u884C**%u5220%u9664**%u4E0E**%u521B%u5EFA**%u4E24%u6B65%u64CD%u4F5C%u3002%0A1.%20%u83B7%u53D6access_token%0A%u5FAE%u4FE1%u7684%u6BCF%u4E00%u6B65%u64CD%u4F5C%u90FD%u662F%u4F9D%u9760%u8FD9%u4E2Atoken%u8FDB%u884C%u7684%uFF0C%u6240%u4EE5%u6BCF%u6B65%u64CD%u4F5C%u524D%u90FD%u9700%u8981%u83B7%u53D6%uFF0C%u6709%u6548%u671F%u9ED8%u8BA4%u662F7200%u79D2%uFF0C%u5982%u679C%u5728%u8FD9%u6BB5%u65F6%u95F4%u5185%u53EF%u4EE5%u4FDD%u5B58%u5C31%u4E0D%u7528%u518D%u6B21%u83B7%u53D6%0A%0A%60%60%60%20C%23%0Apublic%20static%20JObject%20access_token%28int%20memberPKId%29%0A%7B%0A%20%20%20%20ShpWeiXinShopAppData%20wxData%20%3D%20new%20ShpWeiXinShopAppSystem%28%29.GetData%28memberPKId%29%3B%0A%20%20%20%20Uri%20uri%20%3D%20new%20Uri%28String.Format%28@%22https%3A//api.weixin.qq.com/cgi-bin/token%3Fgrant_type%3Dclient_credential%26appid%3D%7B0%7D%26secret%3D%7B1%7D%22%2C%20wxData.WxAppId_NULL%2C%20wxData.WxSecret_NULL%29%29%3B%0A%20%20%20%20HttpWebRequest%20wxReq%20%3D%20HttpWebRequest.Create%28uri%29%20as%20HttpWebRequest%3B%0A%20%20%20%20string%20wxJson%20%3D%20%22%22%3B%0A%20%20%20%20using%20%28HttpWebResponse%20wxTokenRes%20%3D%20wxReq.GetResponse%28%29%20as%20HttpWebResponse%29%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20StreamReader%20reader%20%3D%20new%20StreamReader%28wxTokenRes.GetResponseStream%28%29%29%3B%0A%20%20%20%20%20%20%20%20wxJson%20%3D%20reader.ReadToEnd%28%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20JObject.Parse%28wxJson%29%3B%0A%7D%0A%60%60%60%0A2.%20%u5220%u9664%u83DC%u5355%0A%0A%60%60%60%20C%23%0AJObject%20json%20%3D%20WeiXin.access_token%28Int32.Parse%28memberPKId%29%29%3B%0Aif%20%28json%5B%22access_token%22%5D%20%21%3D%20null%29%0A%7B%0A%20%20%20%20string%20access_token%20%3D%20json%5B%22access_token%22%5D.ToString%28%29%3B%0A%20%20%20%20Uri%20uri%20%3D%20new%20Uri%28String.Format%28@%22https%3A//api.weixin.qq.com/cgi-bin/menu/delete%3Faccess_token%3D%7B0%7D%22%2C%20access_token%29%29%3B%0A%20%20%20%20HttpWebRequest%20wxMenuReq%20%3D%20HttpWebRequest.Create%28uri%29%20as%20HttpWebRequest%3B%0A%20%20%20%20using%20%28HttpWebResponse%20wxDelMenuRes%20%3D%20wxMenuReq.GetResponse%28%29%20as%20HttpWebResponse%29%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20StreamReader%20reader%20%3D%20new%20StreamReader%28wxDelMenuRes.GetResponseStream%28%29%29%3B%0A%20%20%20%20%20%20%20%20menuDel%20%3D%20reader.ReadToEnd%28%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20json%20%3D%20JObject.Parse%28menuDel%29%3B%0A%60%60%60%0A3.%20%u521B%u5EFA%u83DC%u5355%0A%u521B%u5EFA%u65F6%u4E0D%u4EC5%u9700%u8981%u4F20%u9001%u53C2%u6570%uFF0C%u8FD8%u9700%u8981%u4F20%u9001%u4E00%u4E2Ajson%u5BF9%u8C61%u8FC7%u53BB%uFF0C%u5148%u62FC%u63A5%u6210%u5B57%u7B26%u4E32%u518Dpost%uFF0C%u987A%u4FBF%u5410%u69FD%u4E00%u4E0B%uFF0CC%23%u7684post%u65B9%u6CD5%u8FD8%u6CA1%u6709jquery%u7684post%u65B9%u4FBF%uFF0C%u602A%u4E0D%u5F97%u90A3%u4E48%u591A%u524D%u7AEF%u725B%u903C%u4E86%0A%0A%60%60%60%20C%23%0Aif%28json%5B%22errcode%22%5D.ToString%28%29%20%3D%3D%20%220%22%29%0A%7B%0A%20%20%20%20DataTable%20dt%20%3D%20new%20ShpWeixinShopMenuSystem%28%29.GetShpWeixinShopMenuListByMemberPKId%28Int32.Parse%28memberPKId%29%29%3B%0A%20%20%20%20DataRow%5B%5D%20firstMenu%20%3D%20dt.Select%28%22MenuLevel%20%3D%201%22%2C%20%22DisplayOrder%22%29%3B%0A%20%20%20%20string%20menu%20%3D%20%22%7B%5C%22button%5C%22%3A%5B%22%3B%0A%20%20%20%20%0A%20%20%20%20foreach%28DataRow%20dr1%20in%20firstMenu%29%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20menu%20+%3D%20%22%7B%5C%22name%5C%22%3A%5C%22%22%20+%20dr1%5B%22MenuCaption%22%5D.ToString%28%29%20+%20%22%5C%22%22%3B%0A%20%20%20%20%20%20%20%20string%20expression%20%3D%20String.Format%28%22MenuLevel%20%3D%202%20and%20ParentMenu%20%3D%20%7B0%7D%22%2C%20dr1%5B%22MenuItemPKId%22%5D.ToString%28%29%29%3B%0A%20%20%20%20%20%20%20%20DataRow%5B%5D%20secondMenu%20%3D%20dt.Select%28expression%2C%20%22DisplayOrder%22%29%3B%0A%20%20%20%20%20%20%20%20if%28secondMenu.Length%20%3E%200%29%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20menu%20+%3D%20%22%2C%5C%22sub_button%5C%22%3A%5B%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20foreach%28DataRow%20dr2%20in%20secondMenu%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menu%20+%3D%20%22%7B%5C%22type%5C%22%3A%5C%22view%5C%22%2C%5C%22name%5C%22%3A%5C%22%22%20+%20dr2%5B%22MenuCaption%22%5D.ToString%28%29%20+%20%22%5C%22%2C%5C%22url%5C%22%3A%5C%22%22%20+%20dr2%5B%22RelUrl%22%5D.ToString%28%29%20+%20%22%5C%22%7D%2C%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20menu%20%3D%20menu.Remove%28menu.Length-1%2C%201%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20menu%20+%3D%20%22%5D%7D%2C%22%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20menu%20+%3D%20%22%5D%7D%22%3B%0A%0A%20%20%20%20HttpWebRequest%20wxMenuRequest%20%3D%20%28HttpWebRequest%29WebRequest.Create%28%22https%3A//api.weixin.qq.com/cgi-bin/menu/create%3Faccess_token%3D%22%20+%20access_token%29%3B%0A%20%20%20%20wxMenuRequest.ContentType%20%3D%20%22text/json%22%3B%0A%20%20%20%20wxMenuRequest.Method%20%3D%20%22POST%22%3B%0A%20%20%20%20%0A%20%20%20%20using%28StreamWriter%20sw%20%3D%20new%20StreamWriter%28wxMenuRequest.GetRequestStream%28%29%29%29%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20sw.Write%28menu%29%3B%0A%20%20%20%20%20%20%20%20sw.Flush%28%29%3B%0A%20%20%20%20%20%20%20%20sw.Close%28%29%3B%0A%20%20%20%20%20%20%20%20HttpWebResponse%20wxMenuResponse%20%3D%20%28HttpWebResponse%29wxMenuRequest.GetResponse%28%29%3B%0A%20%20%20%20%20%20%20%20using%28StreamReader%20sr%20%3D%20new%20StreamReader%28wxMenuResponse.GetResponseStream%28%29%29%29%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20menuCre%20%3D%20sr.ReadToEnd%28%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%7D%0A%60%60%60%0A%0A%23%23%23%23%20%u83DC%u5355%u4E8B%u4EF6%u63A8%u9001%0A%u8FD9%u4E2A%u63A5%u53E3%u662F%u65B0%u52A0%u7684%uFF0C%u4E4B%u524D%u6CA1%u6709%u770B%u5230%uFF0C%u6682%u65F6%u6CA1%u6709%u7528%u5230%uFF0C%u5DF2%u52A0%u5165%u5F00%u53D1%u8BA1%u5212%uFF0C%u4EE5%u540E%u5199%u597D%u4E86%u518D%u6765%u66F4%u65B0%u3002%0A%0A----------------------------%0A%0A%23%23%23%23%u5199%u5728%u6700%u540E%0A%u5F00%u53D1%u5FAE%u4FE1%u516C%u4F17%u5E73%u53F0%u8C8C%u4F3C%u4E0D%u96BE%uFF0CRESTapi%u8C03%u8BD5%u8D77%u6765%u4E5F%u5F02%u5E38%u7684%u65B9%u4FBF%uFF0C%u800C%u4E14%u5FAE%u4FE1%u4E2D%u6CA1%u6709%u592A%u591A%u7684%u754C%u9762%u3001%u7528%u6237%u4F53%u9A8C%u4E4B%u7C7B%u7684%u4E1C%u897F%uFF0C%u6240%u4EE5%u6574%u4F53%u6765%u8BF4%u5F00%u53D1%u901F%u5EA6%u6BD4%u8F83%u5FEB%uFF0C%u96BE%u5EA6%u4E0D%u9AD8%uFF0C%u800C%u771F%u6B63%u9700%u8981%u7684%u662F%u60F3%u6CD5%u4E0E%u8FD0%u8425%u3002%0A%0A

没有评论:

发表评论