童鞋们直接看代码吧:(我这里是ashx处理程序写的类,开发过网站的一般都知道)
<%@ WebHandler Language="C#" class="weixin" %>
using
System;
using System.Web;
using System.IO;
using System.Text;
using
System.Security.Cryptography;
using System.Security.Policy;
using
System.Collections;
using System.Xml;
public class weixin :
IHttpHandler {
protected string TOKEN = "asdasd"; //TOKEN
必须跟你在微信公众平台上写的token是一致的
public void ProcessRequest
(HttpContext context) {
//context.Response.ContentType =
"text/plain";
context.Response.Clear();
//清除所有之前生成的Response内容
Handlewinxin(context);
//进入专业微信处理程序
context.Response.End();
}
public bool IsReusable {
get
{
return
false;
}
}
/// <summary>
///
/// </summary>
/// <param
name="content"></param>
public void
Handlewinxin(HttpContext context)
{
if
(context.Request.HttpMethod.ToUpper() ==
"GET")
{
//
微信加密签名
string signature =
context.Request.QueryString["signature"];
// 时间戳
string timestamp =
context.Request.QueryString["timestamp"];
// 随机数
string nonce =
context.Request.QueryString["nonce"];
// 随机字符串
string echostr =
context.Request.QueryString["echostr"];
if (CheckSignature(signature, timestamp,
nonce))
{
context.Response.Write(echostr);
}
}
else if
(context.Request.HttpMethod.ToUpper() ==
"POST")
{
StreamReader stream = new
StreamReader(context.Request.InputStream);
string xml =
stream.ReadToEnd();
processRequest(xml, context);
}
}
///
<summary>
/// 验证签名
///
</summary>
/// <param
name="signature"></param>
/// <param
name="timestamp"></param>
/// <param
name="nonce"></param>
///
<returns></returns>
public bool
CheckSignature(String signature, String timestamp, String
nonce)
{
String[] arr = new String[] { TOKEN, timestamp, nonce
};
//
将token、timestamp、nonce三个参数进行字典序排序
Array.Sort<String>(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;
}
/// <summary>
///
使用缺省密钥给字符串加密
/// </summary>
/// <param name="Source_String"></param>
///
<returns></returns>
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();
}
///
<summary>
/// 处理微信发来的请求
///
</summary>
/// <param
name="xml"></param>
public void
processRequest(String xml,HttpContext context)
{
//待下一章节全部贴出代码
}
}