公众平台用户提交信息后,微信服务器将发送get请求到填写的url上,并且带上四个参数:
开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次get请求来自微信服务器,请原样返回echostr参数内容,则接入生效,否则接入失败。
signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
加密/校验流程:
- 1. 将token、timestamp、nonce三个参数进行字典序排序
- 2. 将三个参数字符串拼接成一个字符串进行sha1加密
- 3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
////// 验证签名 /// /// /// /// ///public static bool checksignature(string signature, string timestamp, string nonce) { string[] arr = new string[] { token, timestamp, nonce }; // 将token、timestamp、nonce三个参数进行字典序排序 array.sort (arr); stringbuilder content = new stringbuilder(); for (int i = 0; i < arr.length; i ) { content.append(arr[i]); } string tmpstr = sha1_encrypt(content.tostring()); // 将sha1加密后的字符串可与signature对比,标识该请求来源于微信 return tmpstr != null ? tmpstr.equals(signature) : false; } /// /// 使用缺省密钥给字符串加密 /// /// ///public static string sha1_encrypt(string source_string) { byte[] strres = encoding.default.getbytes(source_string); hashalgorithm isha = new sha1cryptoserviceprovider(); strres = isha.computehash(strres); stringbuilder entext = new stringbuilder(); foreach (byte ibyte in strres) { entext.appendformat("{0:x2}", ibyte); } return entext.tostring(); }
接入后是消息推送当普通微信用户向公众账号发消息时,微信服务器将post该消息到填写的url上。
protected void page_load(object sender, eventargs e)
{
if (request.httpmethod.toupper() == "get")
{
// 微信加密签名
string signature = request.querystring["signature"];
// 时间戳
string timestamp = request.querystring["timestamp"];
// 随机数
string nonce = request.querystring["nonce"];
// 随机字符串
string echostr = request.querystring["echostr"];
if (weixinserver.checksignature(signature, timestamp, nonce))
{
response.write(echostr);
}
}
else if (request.httpmethod.toupper() == "post")
{
streamreader stream = new streamreader(request.inputstream);
string xml = stream.readtoend();
processrequest(xml);
}
}
///
/// 处理微信发来的请求
///
///
public void processrequest(string xml)
{
try
{
// xml请求解析
hashtable requestht = weixinserver.parsexml(xml);
// 发送方帐号(open_id)
string fromusername = (string)requestht["fromusername"];
// 公众帐号
string tousername = (string)requestht["tousername"];
// 消息类型
string msgtype = (string)requestht["msgtype"];
//文字消息
if (msgtype == reqmsgtype.text)
{
// response.write(str);
string content = (string)requestht["content"];
if(content=="1")
{
// response.write(str);
response.write(getnewsmessage(tousername, fromusername));
return;
}
if (content == "2")
{
response.write(getuserblogmessage(tousername, fromusername));
return;
}
if (content == "3")
{
response.write(getgroupmessage(tousername, fromusername));
return;
}
if (content == "4")
{
response.write(getwinepartymessage(tousername, fromusername));
return;
}
response.write(getmainmenumessage(tousername, fromusername, "你好,我是vinehoo,"));
}
else if (msgtype == reqmsgtype.event)
{
// 事件类型
string eventtype = (string)requestht["event"];
// 订阅
if (eventtype==reqeventtype.subscribe)
{
response.write(getmainmenumessage(tousername, fromusername, "谢谢您的关注!,"));
}
// 取消订阅
else if (eventtype==reqeventtype.unsubscribe)
{
// todo 取消订阅后用户再收不到公众号发送的消息,因此不需要回复消息
}
// 自定义菜单点击事件
else if (eventtype==reqeventtype.click)
{
// todo 自定义菜单权没有开放,暂不处理该类消息
}
}
else if (msgtype == reqmsgtype.location)
{
}
}
catch (exception e)
{
}
} protected void page_load(object sender, eventargs e)
{
if (request.httpmethod.toupper() == "get")
{
// 微信加密签名
string signature = request.querystring["signature"];
// 时间戳
string timestamp = request.querystring["timestamp"];
// 随机数
string nonce = request.querystring["nonce"];
// 随机字符串
string echostr = request.querystring["echostr"];
if (weixinserver.checksignature(signature, timestamp, nonce))
{
response.write(echostr);
}
}
else if (request.httpmethod.toupper() == "post")
{
streamreader stream = new streamreader(request.inputstream);
string xml = stream.readtoend();
processrequest(xml);
}
}
///
/// 处理微信发来的请求
///
///
public void processrequest(string xml)
{
try
{
// xml请求解析
hashtable requestht = weixinserver.parsexml(xml);
// 发送方帐号(open_id)
string fromusername = (string)requestht["fromusername"];
// 公众帐号
string tousername = (string)requestht["tousername"];
// 消息类型
string msgtype = (string)requestht["msgtype"];
//文字消息
if (msgtype == reqmsgtype.text)
{
// response.write(str);
string content = (string)requestht["content"];
if(content=="1")
{
// response.write(str);
response.write(getnewsmessage(tousername, fromusername));
return;
}
if (content == "2")
{
response.write(getuserblogmessage(tousername, fromusername));
return;
}
if (content == "3")
{
response.write(getgroupmessage(tousername, fromusername));
return;
}
if (content == "4")
{
response.write(getwinepartymessage(tousername, fromusername));
return;
}
response.write(getmainmenumessage(tousername, fromusername, "你好,我是vinehoo,"));
}
else if (msgtype == reqmsgtype.event)
{
// 事件类型
string eventtype = (string)requestht["event"];
// 订阅
if (eventtype==reqeventtype.subscribe)
{
response.write(getmainmenumessage(tousername, fromusername, "谢谢您的关注!,"));
}
// 取消订阅
else if (eventtype==reqeventtype.unsubscribe)
{
// todo 取消订阅后用户再收不到公众号发送的消息,因此不需要回复消息
}
// 自定义菜单点击事件
else if (eventtype==reqeventtype.click)
{
// todo 自定义菜单权没有开放,暂不处理该类消息
}
}
else if (msgtype == reqmsgtype.location)
{
}
}
catch (exception e)
{
}
}
本文已被整理到了《asp.net微信开发教程汇总》,欢迎大家学习阅读。
以上就是关于asp.net微信开发接口指南的相关内容介绍,希望对大家的学习有所帮助。
在下灬醉墨