您的位置:首页 > 编程语言 > ASP

asp.net 接入微信公众平台,回复消息,解决乱码问题

2015-07-10 13:04 711 查看
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Text;
using System.Security.Cryptography;
using System.IO;
using System.Xml;
using System.Text.RegularExpressions;

namespace ServiceAndLock
{
/// <summary>
/// wxapi 的摘要说明
/// </summary>
public class wxapi : IHttpHandler
{

public void ProcessRequest(HttpContext context)
{
if (context.Request.HttpMethod.ToUpper() == "GET")
{
//string msg ="测试";
//context.Response.Write(msg);
//context.Response.End();
// 微信加密签名
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")
{
//接收消息,根据消息回复
RequestX(context);
}
}
/// <summary>
/// 将原始字串转换为格式为&#....;&#....
/// </summary>
/// <param name="srcText"></param>
/// <returns></returns>
private string StringToISO_8859_1(string srcText)
{
string dst = "";
char[] src = srcText.ToCharArray();
for (int i = 0; i < src.Length; i++)
{
string str = @"&#" + (int)src[i] + ";";
dst += str;
}
return dst;
}
/// <summary>
/// 将字串&#....;&#....;格式字串转换为原始字符串
/// </summary>
/// <param name="srcText"></param>
/// <returns></returns>
private string ISO_8859_1ToString(string srcText)
{
string dst = "";
string[] src = srcText.Split(';');

for (int i = 0; i < src.Length; i++)
{
if (src[i].Length > 0)
{
string str = ((char)int.Parse(src[i].Substring(2))).ToString();
dst += str;
}
}
return dst;
}
/// <summary>
/// 验证签名
/// </summary>
/// <param name="signature"></param>
/// <param name="timestamp"></param>
/// <param name="nonce"></param>
/// <returns></returns>
public static bool CheckSignature(String signature, String timestamp, String nonce)
{
String[] arr = new String[] { "123456", 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();
}
public bool IsReusable
{
get
{
return false;
}
}
public void RequestX(HttpContext context)
{
wxmessage wx = GetWxMessage(context);
string res = "";
//新用户添加
if (!string.IsNullOrEmpty(wx.EventName) && wx.EventName.Trim() == "subscribe")
{
string content = "";
content = "/:rose123324324欢迎关注测试帐号/:rose\n聊天请回复你好“x”\n无聊时候还可以找我聊聊天哦!";
res = sendTextMessage(wx, content);
}
else
{
bool sendJoke = false;
//看笑话
List<string> xhList = new List<string>() { "x", "笑话", "笑話" };
foreach (string item in xhList)
{
if (wx.Content.Trim().ToLower().Contains(item))
{
sendJoke = true;
break;
}
}
if (sendJoke)
{
string title = string.Format("编号{0}:{1}\n-----------------\n", "01", "测试回复");
string content = "333333测试回复内容";
if (content.Length > 300)
{
content = GetSubString(content, 300) + "\n-----------------\n点击连接阅读全文:URL";

}
res = sendTextMessage(wx, title + content);
}
//未知情况
if (res == "")
{
string content = "/:,@-D113333啊哦,你在说什么?\n你可以按照下面的格式告诉我:\n问:你说的话 答:你想让我说什么\n看笑话请直接回复“x”!";
res = sendTextMessage(wx, content);
}
}
context.Response.HeaderEncoding = System.Text.Encoding.UTF8;
context.Response.ContentEncoding = System.Text.Encoding.UTF8;
context.Response.Charset = "utf-8";
//context.Response.Write(Encoding.UTF8.GetString(Encoding.Default.GetBytes(res)));

context.Response.Write(res);
}
/// <summary>
/// 截取字符串
/// </summary>
/// <param name="content"></param>
/// <param name="length"></param>
/// <returns></returns>
private string GetSubString(string content, int length)
{
if (content.Length >= length)
{
return content.Substring(0, length);
}
else
{
return content;
}
}

/// <summary>
/// 发送文字消息
/// </summary>
/// <param name="wx">获取的收发者信息</param>
/// <param name="content">笑话内容</param>
/// <returns></returns>
private string sendTextMessage(wxmessage wx, string content)
{
StringBuilder sb = new StringBuilder();
sb.AppendFormat("<xml><ToUserName><![CDATA[{0}]]></ToUserName>", wx.FromUserName);
sb.AppendFormat("<FromUserName><![CDATA[{0}]]></FromUserName>", wx.ToUserName);
sb.AppendFormat("<CreateTime>{0}</CreateTime>", DateTime.Now);
sb.AppendFormat("<MsgType><![CDATA[text]]></MsgType>");
sb.AppendFormat("<Content><![CDATA[{0}]]></Content>", content);
sb.AppendFormat("</xml>");
return sb.ToString();
}

/// <summary>
/// 发送图文消息
/// </summary>
/// <param name="wx">获取的收发者信息</param>
/// <param name="joke">笑话信息</param>
/// <returns></returns>
private string sendPictureMessage(wxmessage wx)
{
StringBuilder sb = new StringBuilder();
sb.AppendFormat("<xml><ToUserName><![CDATA[{0}]]></ToUserName>", wx.FromUserName);
sb.AppendFormat("<FromUserName><![CDATA[{0}]]></FromUserName>", wx.ToUserName);
sb.AppendFormat("<CreateTime>{0}</CreateTime>", DateTime.Now);
sb.AppendFormat("<MsgType><![CDATA[news]]></MsgType><Content><![CDATA[]]></Content>");
sb.AppendFormat("<ArticleCount>1</ArticleCount>");
sb.AppendFormat("<Articles><item>");
sb.AppendFormat("<Title><![CDATA[{0}]]></Title>", "标题");
sb.AppendFormat("<Description><![CDATA[{0}]]></Description>", "说明文字");
sb.AppendFormat("<PicUrl><![CDATA[{0}]]></PicUrl>", "图片地址");
sb.AppendFormat("<Url><![CDATA[{0}]]></Url>", "连接地址");
sb.AppendFormat("</item></Articles><FuncFlag>0</FuncFlag></xml>");
return sb.ToString();
}

/// <summary>
/// 获取请求过来的微信信息
/// </summary>
/// <returns></returns>
private wxmessage GetWxMessage(HttpContext context)
{
wxmessage wx = new wxmessage();
StreamReader str = new StreamReader(context.Request.InputStream, System.Text.Encoding.UTF8);
XmlDocument xml = new XmlDocument();
xml.Load(str);
wx.ToUserName = xml.SelectSingleNode("xml").SelectSingleNode("ToUserName").InnerText;
wx.FromUserName = xml.SelectSingleNode("xml").SelectSingleNode("FromUserName").InnerText;
wx.MsgType = xml.SelectSingleNode("xml").SelectSingleNode("MsgType").InnerText;
if (wx.MsgType.Trim() == "text")
{
wx.Content = xml.SelectSingleNode("xml").SelectSingleNode("Content").InnerText;
}
if (wx.MsgType.Trim() == "event")
{
wx.EventName = xml.SelectSingleNode("xml").SelectSingleNode("Event").InnerText;
}
return wx;
}

}
//自定义一个微信消息实体类
class wxmessage
{
public string FromUserName { get; set; }
public string ToUserName { get; set; }
public string MsgType { get; set; }
public string EventName { get; set; }
public string Content { get; set; }
}
}

公众号开发者中心,设置的url,即以上内容,解决乱码是:

context.Response.HeaderEncoding = System.Text.Encoding.UTF8;
context.Response.ContentEncoding = System.Text.Encoding.UTF8;
context.Response.Charset = "utf-8";
接入url,走的是get方法,回复消息走的是post方法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: