asp.net微信公众号开发,测试公众号收发消息
准备:
1、学习阶段,可以申请测试账号,此账号接口权限很多,方便做测试。
2、由于微信web开发必须为外网服务器,可以将使用工具将内网穿透到外网,本人使用的是natapp,该网站有免费的隧道,可是域名每次都是随机生成的,每次开发微信功能时,都需要在测试账号界面更改服务器,验证token,较为麻烦。建议购买隧道,价格核还算公道,会很省事。注意,每次做开发时都需要打开natapp的客户端,因此需要配置config,使得每次打开natapp都可以直接穿透,不需要输入代码。
3、使用本机作为服务器,每次验证功能时需要将项目通过IIS发布到本地文件夹。
验证token
验证token的目的在于确认你所填写的url是有效的。验证位置在申请测试账号页面,我们需要做的,就是在项目的启动项的后太码里面获取服务的参数timestamp、nonce,和自己填写的token经过一个加密算法形成一个字符串,如何和请求服务器获得的signature吻合,则验证成功。验证只需要一次,在申请测试号界面token验证通过,则可以注释掉验证代码。
private void valid() {
string echoStr = Request.QueryString["echoStr"].ToString();
if (CheckSignature())
{
if (!string.IsNullOrEmpty(echoStr))
{
Response.Write(echoStr);
Response.End();
}
}
}
private bool CheckSignature()
{
string signature = Request.QueryString["signature"].ToString();
string timestamp = Request.QueryString["timestamp"].ToString();
string nonce = Request.QueryString["nonce"].ToString();
string[] ArrTmp = { Token, timestamp, nonce };
Array.Sort(ArrTmp); //字典排序
string tmpStr = string.Join("", ArrTmp);
tmpStr = FormsAuthentication.HashPasswordForStoringInConfigFile(tmpStr, "SHA1");
tmpStr = tmpStr.ToLower();
if (tmpStr == signature)
{
return true;
}
else
{
return false;
}
}
接受消息(微信服务器)
用户关注了公众号以后,可能会对公众号发送一个“你好”的消息。这个消息会先发送给微信的服务器(手机微信上面的操作,肯定是先由微信服务器处理),再通过微信服务器发送的我们填写的url上,此处即是我们本机。发送到本机的哪里呢,发送到本机IIS发布好的项目里,由项目里的默认项负责处理。
private string GetPostMsg()
{
try
{
System.IO.Stream s = Request.InputStream;
int count = 0;
byte[] buffer = new byte[s.Length];
StringBuilder builder = new StringBuilder();
while ((count = s.Read(buffer, 0, buffer.Length)) > 0)
{
builder.Append(Request.ContentEncoding.GetString(buffer, 0, count));
}
s.Flush();
s.Close();
s.Dispose();
return builder.ToString();
}
catch (Exception ex)
{
throw ex;
}
}
发送消息
微信公众号在接受了用户的消息以后,发给本机,再由本机接受数据,通过对发送的数据进行解析,明确用户的目的,再做出相应的回应,这有点类似AI,其实就是一个switch判断而已。
private void ResponseMsg(string _postStr)
{
try
{
XmlDocument document = new XmlDocument();
document.LoadXml(_postStr);
XmlNode root = document.SelectSingleNode("xml");
XmlNodeList nodeList = root.ChildNodes;
//model存储获取的数据
var model = new
{
ToUserName = nodeList.Item(0).InnerText,
FromUserName = nodeList.Item(1).InnerText,
CreateTime = nodeList.Item(2).InnerText,
MsgType = nodeList.Item(3).InnerText,
Content = nodeList.Item(4).InnerText
};
//获取当前的时间
int currentTime = AppGL.ConvertDateTimeInt(DateTime.Now);
switch(model.Content.Substring(0,2))
{
case "你好":Response.Write(你想要发送的数据(注意格式));
break;
case "图片":Response.Write(你想要发送的数据(注意格式));
break;
case "电影":Response.Write(你想要发送的数据(注意格式));
break;
default:
Response.Write(你想要发送的数据(注意格式));
break;
}
}
catch (Exception ex)
{
//错误信息,写入日志
WriteTextLog(ex.Message);
}
}
结语
本文所写是微信开发中基础中的基础,完全是针对刚入行的朋友,不喜勿喷。后续还会持续更新,欢迎交流。