【.NET/C#】怎样开发个微信服务号应用
的有关信息介绍如下:微信上企业用户可以创建自己的服务号,来宣传介绍啥的,在开发模式里可以通过脚本来与会员互动。
注册应用,这个就不解释了,企业用户才可以使用服务号了,但是菜单什么的订阅号还是可以使用的。
平台地址:https://mp.weixin.qq.com
开发文档:http://mp.weixin.qq.com/wiki/
开启开发模式后,设置服务器URL(用来部署自己的应用),Token(用于数据校验)
初次设置有个校验
public static bool Check(string signature, string timestamp, string nonce, string token = null)
{
Logger.Info(string.Format("{0}=?{1}", signature, GetSignature(timestamp, nonce, token)));
return signature == GetSignature(timestamp, nonce, token);
}
public static string GetSignature(string timestamp, string nonce, string token = null)
{
token = token ?? Config.Token;
var arr = new List
arr.Sort();
var result = arr.Aggregate("", (current, s) => current + s);
var sha1 = new SHA1CryptoServiceProvider();
return BitConverter.ToString(sha1.ComputeHash(Encoding.Default.GetBytes(result))).Replace("-", "").ToLower();
}
应用注册成功后,微信也给了我们 AppId 和 AppSecret
定义菜单,目前自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单。一级菜单最多4个汉字,二级菜单最多7个汉字,多出来的部分将会以“...”代替。请注意,创建自定义菜单后,由于微信客户端缓存,需要24小时微信客户端才会展现出来。
文档地址:http://mp.weixin.qq.com/wiki/index.php?title=%E8%87%AA%E5%AE%9A%E4%B9%89%E8%8F%9C%E5%8D%95%E5%88%9B%E5%BB%BA%E6%8E%A5%E5%8F%A3
目前自定义菜单接口可实现两种类型按钮,
click:用户点击click类型按钮后,微信服务器会通过消息接口推送消息类型为event 的结构给开发者(参考消息接口指南),并且带上按钮中开发者填写的key值,开发者可以通过自定义的key值与用户进行交互;
view:用户点击view类型按钮后,微信客户端将会打开开发者在按钮中填写的url值 (即网页链接),达到打开网页的目的,建议与网页授权获取用户基本信息接口结合,获得用户的登入个人信息。
这里用到access_token
public static string GetAccessToken()
{
var key = Cache.Get("access_token")?? InitAccessToken();
return key+"";
}
public static string InitAccessToken()
{
var url = string.Format(Config.UrlForGetAccessToken, Config.AppId, Config.AppSecret);
var result = new ReadUrlParser(url).HttpContent;
Logger.Info(result);
var key = "";
var jss= new JavaScriptSerializer();
if(result.Contains("access_token"))
{
var rep = jss.Deserialize
key = rep.access_token;
Cache.Set("access_token",key,rep.expires_in);
}else
{
var rep = jss.Deserialize
Logger.Error(rep.errcode+rep.errmsg);
key ="";
}
return key;
}
菜单定义后用json格式Post到它的API接口就可以了。
MenuItem
[DataContract]
public class MenuItem
{
[DataMember(Name = "key")]
public string key { get; set; }
[DataMember(Name = "url")]
public string url { get; set; }
[DataMember(Name = "type")]
public string type { get; set; }
[DataMember(Name = "name")]
public string name { get; set; }
}
Button
[Serializable]
[DataContract]
public class Button:MenuItem
{
[DataMember(Name = "sub_button")]
public List
}
Menu
[DataContract]
public class Menu
{
[DataMember(Name = "button")]
public List
}
CreateMenu
public ActionResult CreateMenu()
{
var jss = new JavaScriptSerializer();
var menu=jss.Serialize(Util.Config.AppMenu);
menu = menu.Replace("\"sub_button\":null,", "");
menu = menu.Replace("\"url\":null,", "");
menu = menu.Replace("\"key\":null,", "");
var url = string.Format(Util.Config.UrlForCreateMenu, Util.Client.GetAccessToken());
var result = new Util.ClientRequest().SendHttpRequestPost(url, menu);
return Content(result);
}
消息的接收
[ActionName("Index")]
public ActionResult Post(string signature, string timestamp, string nonce, string echostr)
{
Logger.Info("START POST PARSE.");
if (!Util.Client.Check(signature, timestamp, nonce))
{
Logger.Error("参数错误");
return Content("参数错误");
}
var doc = XDocument.Load(Request.InputStream);
var requestMessage = RequestMessageFactory.GetRequestEntity(doc);
处理接收到的requestMessage ,每次都要验证信息的真实性,也就和第一步验证是一回事,
消息有几种:文本、图片、语音、视频、位置、链接
消息的发送
var strongresponseMessage = ResponseMessageBase.CreateFromRequestMessage(requestMessage, ResponseMsgType.Text) as ResponseMessageText;
strongresponseMessage.Content =(guest!=null?guest.nickname:"您")+ string.Format("刚才发送了文字信息:{0}", strongRequestMessage.Content);
responseMessage = strongresponseMessage;
var responseDoc =Helper.EntityHelper.ConvertEntityToXml(responseMessage);
return Content(responseDoc.ToString());
用xml 响应就可以了,也是文本、图片、语音、视频、音乐、图文
事件的接收,和消息接收是一样的,不过MsgType=event 包括关注、取消关注、上报地址、地定义菜单(click类型)的点击,响应也和消息的响应一样。
其余功能还没怎么使用,现在建商城还是使用手机站的页面,可以把用户信息推送到手机站