看了这么相关的内容,都没有比较完整的说明,只能自己拼凑凑.分享一下给大伙.代码简单易看明白.
这里我没有正式的服务号就先用测试代替一下.
在开发之前看下官方文档. (https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Receiving_standard_messages.html)
一开始看官方文档真的是有小小的懵,文档只给出 xml格式的代码,还有一些文字,没有头没尾.后来看了一些相关信息后发现是需要配置微信的环境的.上教程:
打开测试-配置信息/
这里的url是放你的项目的一个自己写的请求地址/token是为了安全验证随便写.
注:url不可以放本地地址例如192.168.0.1,这些是不可以的,需要放域名,推荐使用网址穿透进行测试,网址穿透例如花生壳这些软件等等
第一次进入提交验证
上代码:
public string ProcessRequest()
{
//这个是第一进入时需要验证一下
if (Request.HttpMethod == "GET")
{
//wx响应携带参数
string signature = Request.QueryString["signature"];
string timestamp = Request.QueryString["timestamp"];
string nonce = Request.QueryString["nonce"];
string echostr = Request.QueryString["echostr"];
//微信签名加密
if (Encryption(signature, timestamp, nonce, echostr))
{
return echostr;//原来有的拐带的参数就可以配置成功
}
}
if (Request.HttpMethod == "POST")
{
//接收响应xml转换成字符xml字符串
Stream requestStream = System.Web.HttpContext.Current.Request.InputStream;
byte[] requestByte = new byte[requestStream.Length];
requestStream.Read(requestByte, 0, (int)requestStream.Length);
string requestStr = Encoding.UTF8.GetString(requestByte);//接收到的xml字符串
string XML = "";
if (!string.IsNullOrEmpty(requestStr))//粉丝发送消息给你
{
//反序列化xml
//这里有一段处理xml字符代码,因我这处理比过于复杂就不展示了,可自行查看xml处理字符的相关资料
//[处理xml代码...]
//粉丝发送消息类型处理
switch (info.MsgType) //msgType-处理好后的得到字段
{
case "text"://文本
//粉丝发来文本消息/根据自己逻辑需要进行处理
string content = info.Content;
//回复粉丝内容/内容必须是xml格式
XML = string.Format(Message_Text, info.FromUserName, info.ToUserName, DateTime.Now.ToBinary(), "知道啦知道啦,我是超级无敌大帅哥!");
break;
case "image"://图片
break;
case "event"://事件
break;
default:
break;
}
}
Response.Write(XML);
Response.End();
}
return "验证失败";
}
/// <summary> 微信签名加密
/// </summary>
/// <returns></returns>
public static bool Encryption(string signature, string timestamp, string nonce, string echostr)
{
string token = "huangzhuoda";//跟公众号保持一致
//将token、timestamp、nonce三个参数进行字典序排序
List<string> list = new List<string>();
list.Add(token);
list.Add(timestamp);
list.Add(nonce);
list.Sort();
//将三个参数字符串拼接成一个字符串进行sha1加密
string res = string.Join("", list.ToArray());
Byte[] data1ToHash = Encoding.ASCII.GetBytes(res);
byte[] hashvalue1 = ((HashAlgorithm)CryptoConfig.CreateFromName("SHA1")).ComputeHash(data1ToHash);
StringBuilder sb = new StringBuilder();
foreach (byte b in hashvalue1)
{
sb.Append(b.ToString("x2"));
}
//string s = BitConverter.ToString(hashvalue1).Replace("-", string.Empty).ToLower();
if (signature == sb.ToString())
{
return true;
}
else
{
return false;
}
}
/// <summary>
/// 普通文本消息
/// </summary>
public static string Message_Text
{
get
{
return @"<xml>
<ToUserName><![CDATA[{0}]]></ToUserName>
<FromUserName><![CDATA[{1}]]></FromUserName>
<CreateTime>{2}</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[{3}]]></Content>
</xml>";
}
}