微信菜单更新,可以支持多个服务号更新C#。

微信菜单更新,可以支持多个服务号更新C#。

效果Demo页面

/// <summary>
/// 更新菜单
/// </summary>

/// <param name="sender"></param>
/// <param
name="e"></param>
protected void Button4_Click(object
sender, EventArgs e)
{

WXResponse.GetInstance().UpdateMenu(TextBox1.Text.Trim());

}

using System;
using System.Collections.Generic;
using
System.Configuration;
using System.IO;
using System.Linq;
using
System.Net;
using System.Text;
using System.Web;
using
System.Xml;
using LitJson;
using log4net;
using
Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace DemoWXUpdateMenu
{
public class WXResponse
{

/// <summary>
/// 构造方法
/// </summary>

public WXResponse()
{

}

private static WXResponse _instance;
public static
WXResponse GetInstance()
{
if (_instance == null)

{
_instance = new WXResponse();

}

return _instance;
}

private ILog _log =
log4net.LogManager.GetLogger(typeof(WXResponse));

/// <summary>
/// 加载菜单信息
///
</summary>
/// <param name="organID"></param>

/// <returns></returns>
public void
UpdateMenu(string organID)
{
string json =
GetJsonString(organID);
WXCreateMenu(json, organID);

}

public string GetJsonString(string organID)
{

string re = string.Empty;
try
{

//后期要改为从缓存中取数据,测试
OrganBankConfig menu =
GetCacheOrganConfigMenu(organID);
#region 菜单格式化
if (menu
!= null)
{
MenuConfig mc = new
MenuConfig();
List<Level1> l1List = new
List<Level1>();
for (int i = 0; i <
menu.Level1List.Count; i++)
{

Level1 l1 = new Level1();
l1.name =
menu.Level1List[i].Name;
l1.type =
menu.Level1List[i].Type;
l1.url =
menu.Level1List[i].Url;
l1.key =
menu.Level1List[i].Key;
if
(menu.Level1List[i].Level2List != null &&
menu.Level1List[i].Level2List.Count > 0)
{

List<Level2> l2List = new List<Level2>();

for (int j = 0; j <
menu.Level1List[i].Level2List.Count; j++)
{

Level2 l2 = new Level2();

l2.type = menu.Level1List[i].Level2List[j].Type;

l2.name = menu.Level1List[i].Level2List[j].Name;

l2.url = menu.Level1List[i].Level2List[j].Url;

l2.key = menu.Level1List[i].Level2List[j].Key;

if (l2 != null && l2.name != null)

{
l2List.Add(l2);

}
}

l1.sub_button = l2List;
}

if (l1 != null && l1.name != null)

{
l1List.Add(l1);

}
}

mc.button = l1List;
re = JsonMapper.ToJson(mc);

re = re.Replace("null", "\"\"");

//re=re.Replace("","\"sub_button"\"\:\"\"\"""");
string
replaceString = ",\"sub_button\":\"\"";

re = re.Replace(replaceString, "");

}
#endregion
}

catch (Exception ex)
{
_log.Error("对象转换失败,"
+ ex);
}
return re;
}

/// <summary>
/// 调用微信接口,自定义菜单token的获取 是用 下面的两个参数
获取的 不能直接用 公众平台的token
/// </summary>
public void
WXCreateMenu(string json, string organID)
{
try

{
OrganBankConfig ob =
GetCacheOrganConfigMenu(organID);
if (ob == null)

{
_log.Info("配置数据为空,请检查配置.");

}
string wXSAppId = ob.WXSAppId;
string wXSAppSecret =
ob.WXSAppSecret;
if (wXSAppId == null || wXSAppSecret ==
null)
{

_log.Info("WXSAppId,WXSAppSecret为空,不能修改菜单");
return;
}

string wXAPIUrl =
ConfigurationManager.AppSettings["WXAPIUrl"].ToString();

string weixin1 = json;

string to = GetData(wXAPIUrl +
@"cgi-bin/token?grant_type=client_credential&appid=" + wXSAppId +
"&secret=" + wXSAppSecret);
//后台 json的操作 得到的就是 token 或者
自己 获取 json的token
string token =
string.Empty;
JObject jo =
(JObject)JsonConvert.DeserializeObject(to);
if (jo != null
&& jo["access_token"] != null)
{

token = jo["access_token"].ToString().Replace("\"", "");

string re = GetPage(wXAPIUrl + @"cgi-bin/menu/create?access_token=" + token,
weixin1);
_log.Info("创建或修改菜单成功" + re);

}
else
{

_log.Info("获取token失败,请查看日志");
}
}
catch
(Exception ex)
{
_log.Error("创建或修改菜单失败," +
ex);
}
}

#region 取配置文件或从缓存中取
/// <summary>
///
根据机构号取菜单数据
/// </summary>
/// <param
name="organId"></param>
///
<returns></returns>
public OrganBankConfig
GetCacheOrganConfigMenu(string organId)
{

OrganBankConfig result = new OrganBankConfig();
result =
LoadXMLMenu(organId);
return result;
}

/// <summary>
/// 根据机构号取回复数据
///
</summary>
/// <param name="organId"></param>

/// <returns></returns>
public Dictionary<string,
ReplyInfo> GetCacheOrganConfigReply(string organId)
{

Dictionary<string, ReplyInfo> result = new Dictionary<string,
ReplyInfo>();
result = LoadXMLReply(organId);

return result;
}

/// <summary>
/// 根据缓存中所有机构号数据
///
</summary>
/// <param name="organId"></param>

/// <returns></returns>
public Dictionary<string,
string> GetCacheOrganBankIDList()
{

Dictionary<string, string> result = new Dictionary<string,
string>();
result = LoadOrganBankIDList();

return result;
}

/// <summary>
/// 查询所有的机构银行编号
///
</summary>
/// <param name="BankSysNo"></param>

/// <returns></returns>
public
Dictionary<string, string> LoadOrganBankIDList()
{

Dictionary<string, string> organIDList = new Dictionary<string,
string>();
XmlDocument xmlDoc = new XmlDocument();

xmlDoc.Load(HttpContext.Current.Server.MapPath("~/App_Data/Mis.xml"));

if (xmlDoc != null)
{
XmlNodeList
nodes = xmlDoc.SelectSingleNode("//Mis").ChildNodes;
foreach
(XmlNode node in nodes)
{
if
(node.Attributes != null && node.Attributes["OrganBankID"] != null
&& node.Attributes["OrganBankID"].Value != null)

{
string organBankID =
node.Attributes["OrganBankID"].Value;

organIDList.Add(organBankID, organBankID);
}

}
}
if (organIDList != null &&
organIDList.Count > 0)
{
return
organIDList;
}
else
{

_log.Info("配置文件中找不到OrganBankID,请检查配置");
return null;

}
}

/// <summary>
/// 加载菜单信息
/// </summary>

/// <param name="organID"></param>
///
<returns></returns>
public OrganBankConfig
LoadXMLMenu(string organID)
{
try
{

XmlDocument xmlDoc = new XmlDocument();

xmlDoc.Load(HttpContext.Current.Server.MapPath("~/App_Data/Mis.xml"));

if (xmlDoc != null)
{
XmlNode
xmlOrganBank = xmlDoc.SelectSingleNode("//Mis//OrganBank[@OrganBankID=" +
organID + "]");
OrganBankConfig menu =
XmlMapEntity.XmlToObj<OrganBankConfig>("<OrganBankConfig>" +
xmlOrganBank.InnerXml + "</OrganBankConfig>");

return menu;
}
}
catch
(Exception ex)
{

_log.Error("App_Data/Mis.xml加载失败," + ex);
}
return
null;

}

/// <summary>
/// 加载回复消息
/// </summary>

/// <param name="organID"></param>
///
<returns></returns>
public Dictionary<string,
ReplyInfo> LoadXMLReply(string organID)
{
try

{
Dictionary<string, ReplyInfo> di = new
Dictionary<string, ReplyInfo>();
XmlDocument xmlDoc =
new XmlDocument();

xmlDoc.Load(HttpContext.Current.Server.MapPath("~/App_Data/Mis.xml"));

if (xmlDoc != null)
{

XmlNodeList xnl = xmlDoc.SelectNodes("//Mis//OrganBank[@OrganBankID=" + organID
+ "]//ReplyList//ReplyInfo");
if (xnl == null)

{

_log.Info("xmlDoc.SelectNodes(//Mis//OrganBank[@OrganBankID=" + organID +
"]//ReplyList//ReplyInfo)为null");
return null;

}
foreach (XmlNode btn in xnl)

{
ReplyInfo re = new ReplyInfo();

re.Key = btn.Attributes["Key"].Value;

re.Type = int.Parse(btn.Attributes["Type"].Value);

XmlNodeList ff = btn.ChildNodes;
foreach (XmlNode xxx
in ff)
{
re.KeyInfo =
xxx.InnerXml;
}

di.Add(re.Key, re);
}
}

return di;
}
catch (Exception ex)

{
_log.Error("回复消息App_Data/Mis.xml加载失败," + ex);

}
return null;
}
#endregion

#region 公共方法
/// <summary>
/// Get请求数据
///
</summary>
/// <param name="url"></param>

/// <returns></returns>
private string GetData(string
url)
{
HttpWebRequest myRequest =
(HttpWebRequest)WebRequest.Create(url);
myRequest.Method =
"GET";
HttpWebResponse myResponse =
(HttpWebResponse)myRequest.GetResponse();
StreamReader reader =
new StreamReader(myResponse.GetResponseStream(), Encoding.UTF8);

string content = reader.ReadToEnd();

_log.Info("GetData()content:" + content);
reader.Close();

return content;
}

/// <summary>
/// 保存结果返回
/// </summary>

/// <param name="posturl"></param>
/// <param
name="postData"></param>
///
<returns></returns>
public string GetPage(string posturl,
string postData)
{
Stream outstream = null;

Stream instream = null;
StreamReader sr = null;

HttpWebResponse response = null;
HttpWebRequest request =
null;
Encoding encoding = Encoding.UTF8;
byte[]
data = encoding.GetBytes(postData);
// 准备请求...
try

{
// 设置参数
request = WebRequest.Create(posturl) as
HttpWebRequest;
CookieContainer cookieContainer = new
CookieContainer();
request.CookieContainer =
cookieContainer;
request.AllowAutoRedirect = true;

request.Method = "POST";
request.ContentType =
"application/x-www-form-urlencoded";
request.ContentLength =
data.Length;
outstream = request.GetRequestStream();

outstream.Write(data, 0, data.Length);

outstream.Close();
//发送请求并获取相应回应数据
response =
request.GetResponse() as HttpWebResponse;

//直到request.GetResponse()程序才开始向目标网页发送Post请求
instream =
response.GetResponseStream();
sr = new StreamReader(instream,
encoding);
//返回结果网页(html)代码
string content =
sr.ReadToEnd();
_log.Info("GetPage()content:" + content);

string err = string.Empty;
return content;

}
catch (Exception ex)
{

_log.Error(ex.Message);
return string.Empty;

}
}

/// <summary>
/// 发送Post数据
///
</summary>
/// <param name="para"></param>

/// <returns></returns>
private string PostData(string
para, string url)
{
Encoding encoding =
Encoding.UTF8;
byte[] data = encoding.GetBytes(para);

System.Net.HttpWebRequest req =
(System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(url);

req.Method = "POST";
//req.ContentType =
"application/x-www-form-urlencoded";
req.ContentType =
"application/json";

req.ContentLength = data.Length;

System.IO.Stream newStream = req.GetRequestStream();

//发送数据
newStream.Write(data, 0, data.Length);

newStream.Close();

System.Net.HttpWebResponse res =
(System.Net.HttpWebResponse)req.GetResponse();
StreamReader
reader = new StreamReader(res.GetResponseStream(), Encoding.UTF8);

string re = reader.ReadToEnd();
_log.Info("SendDataPost返回字符:" +
re);
return re;
}

#endregion

}

#region 菜单配置数据

/// <summary>
/// 菜单配置数据
/// </summary>

[Serializable]
public class OrganBankConfig
{
public
List<Level1Info> Level1List { get; set; }
public string WXToken
{ get; set; }
public string WXID { get; set; }

public string WXSAppId { get; set; }
public string
WXSAppSecret { get; set; }

public string MisApiBasePath { get; set; }
public string
MisAppKey { get; set; }
public string MisAppValue { get; set; }

}

#region JSON格式数据

/// <summary>
/// 自定义的菜单
/// </summary>

[Serializable]
public class MenuConfig
{
public
List<Level1> button { get; set; }
//public string name { get;
set; }

}

/// <summary>
/// 一级菜单里面的数据,属性
/// </summary>

[Serializable]
public class Level1
{
public string
name { get; set; }
public string type { get; set; }
public
string url { get; set; }
public string key { get; set; }

public List<Level2> sub_button { get; set; }
}

/// <summary>
/// 二级菜单里面的数据,属性
/// </summary>

[Serializable]
public class Level2
{
public string
type { get; set; }
public string name { get; set; }
public
string url { get; set; }
public string key { get; set; }
}

#endregion

/// <summary>
/// 一级菜单里面的数据,属性
///
</summary>
[Serializable]
public class Level1Info

{
public string Name { get; set; }
public string Type {
get; set; }
public string Url { get; set; }
public string
Key { get; set; }
public List<Level2Info> Level2List { get;
set; }
}

/// <summary>
/// 二级菜单里面的数据,属性
/// </summary>

[Serializable]
public class Level2Info
{
public string
Name { get; set; }
public string Type { get; set; }
public
string Url { get; set; }
public string Key { get; set; }
}

/// <summary>
/// 回复属性,回复菜单配置数据
/// </summary>

[Serializable]
public class ReplyInfo
{
public string
Key { get; set; }
public string KeyInfo { get; set; }

public int Type { get; set; } //0文本,1图文
}

#endregion

}

下载

微信菜单更新,可以支持多个服务号更新C#。,布布扣,bubuko.com

时间: 2024-10-27 11:36:15

微信菜单更新,可以支持多个服务号更新C#。的相关文章

微信服务号、订阅号、企业号差别

1.侧重功能:(1).服务号侧重于对用户进行服务:(2).订阅号侧重于信息传播:(3).企业号侧重于生产运营管理: 2.适用范围:(1).服务号主要适用于媒体.企业.政府或其他有需求的组织:(2).订阅号主要适用于个人.媒体.企业.政府或其他有需求的组织:(3).企业号主要适用于企业.政府.事业单位或其他有需求的组织:其实还是按申请者需求来定了,没有强制说谁谁一定的使用哪种服务号 3.推送消息显示地方:(1).服务号和企业号推送的消息,直接显示在微信对话列表中:(2).订阅号推送的消息,显示在微

微信服务号、订阅号和企业号的差别(运营和开发两个角度)

一.运营的角度 1.1.概括 订阅号: 微信最初的形态是一个纯粹的社交工具,也就是人与人之间的联系工具,当中又分熟人之间的联系和陌生人之间的联系.于是就诞生了朋友圈和订阅号. 而订阅号的作用就是媒体社交.订阅号最主要是自媒体或媒体为读者用户提供优质的对他们感兴趣或有价值的内容.从而与关注者建立关系或使用户对自身品牌的认可. 服务号: 相比于订阅号.服务号要复杂的多,当微信有了朋友圈能够卖商品,订阅号能够做营销. 那么当出现人与商业之间的联系需求时.服务号便诞生了,它不仅要要做一个服务者还要做一个

微信服务号开发笔记

原理 微信服务号的原理比较简单.从请求响应角度来看,逻辑是: 用户微信客户端 <—> 微信服务器 <—> 微信服务号后台程序 <—> 数据库或Web Service 也就是,用户的各种请求先经过微信的服务器,微信服务器将请求转发给微信服务号后台程序. 既然是微信服务器把用户请求数据转发给我们开发的微信服务号后台程序,那么在启用服务号的开发模式时就需要提供一个URL.另外为了安全 考虑,还需要提供一个token,用来校验请求是否来自微信服务器.校验的方法见微信开发者文档.

微信服务号、订阅号和企业号的区别(运营和开发两个角度)

博客转载自:http://blog.csdn.net/u013142781 为了以后便于查找,转载此博客,在此感谢原博主的无私分享. 一.运营的角度 1.1.概括 订阅号: 微信最初的形态是一个纯粹的社交工具,也就是人与人之间的联系工具,其中又分熟人之间的联系和陌生人之间的联系,于是就诞生了朋友圈和订阅号.而订阅号的作用就是媒体社交,订阅号最主要是自媒体或媒体为读者用户提供优质的对他们感兴趣或有价值的内容,从而与关注者建立关系或使用户对自身品牌的认可. 服务号: 相比于订阅号,服务号要复杂的多,

微信硬件平台(二) 企业服务号号设备注册和绑定

该教程目的:在教程1里,完成了微信服务器向自己的服务器转发公众号收到的数据.但是缺少用户认证,设备注册,设备绑定等功能.这里使用调试助手模拟一个实际的设备(空调,灯),直接向微信硬件云注册和授权,绑定个人的微信账号.这里暂时没有用的自己的服务器. 微信教程 网友调试过程    微信硬件平台下设备与微信通信 需要: 1 申请一个服务号(必须有企业组织代码,法人等信息). 没有公司的开通一个测试账号.这里使用的是一个公司注册后的服务号. 2 在公众号-设备功能-添加几个设备 (图标随便上传的) 因为

微信企业号、订阅号、服务号之间有什么区别和不同

微信企业号.订阅号.服务号之间有什么区别和不同 随着微信推出企业号后,很多人开始对微信公众平台的订阅号.服务号和企业号犯迷糊,搞不清楚这三个号的区别了: 订阅号: 面向人群: 面向媒体和个人提供一种信息传播方式. 消息显示方式: 折叠在订阅号目录中. 消息次数限制: 每天群发一条. 验证关注者身份: 任何微信用户扫码即可关注. 消息保密: 消息可转发.分享. 高级接口权限: 不支持 定制应用: 不支持,新增服务号需要重新关注. 服务号: 面向人群: 面向企业,政府或组织,用以对用户进行服务. 消

微信开发 没有认证过的服务号怎么办?微信提供了测试号(开通了认证过的服务号的功能)

使用微信提供的测试号(开通了服务号的功能),微信提供给开发者开发测试使用. http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login

订阅号与服务号的主要区别是什么?

1.订阅号与服务号的主要区别是什么? 订阅号每天能群发一条消息,没有自定义菜单及高级接口权限:服务号有自定义菜单及高级接口权限,但每月只能群发一条消息. 2.到底该申请订阅号还是服务号? 申请哪种类型的公众账号,主要取决于账号的用途.服务号主要面向企业和组织,旨在为用户提供服务:订阅号主要面向媒体和个人,旨在为用户提供信息和资讯. 3.订阅号是否支持编程开发? 不管是订阅号,还是服务号,在高级功能中都有编辑模式和开发模式,订阅号也支持编程开发,同样也能与企业系统对接. 4.为什么申请的公众账号没

微信服务号如何用编辑模式设置自定义菜单

1.登录该微信服务号,点击高级功能,选择编辑模式. 2.开启编辑模式. 3.设置自定义菜单,菜单管理—添加.排序.设置动作. 4.添加一级菜单(最多3个).二级菜单(一级菜单下最多5个二级菜单),比如我可以添加百度经验,在百度经验下面我可以设置经验1,经验2. 5.设置菜单内容:点击你选择的菜单,设置点击该菜单后的动作(发送消息.跳转网页). a)发送消息:编辑你要发送的文章.图片.语音.视频.图文消息. b)跳转到网页:你有WAP站的话,直接就跳转到你的手机网站了.