这几天开始研究微信公众平台开发!可是回复的信息乱码!哪位高手可以为我解答一下啊!急啊!
using System; using System.Collections.Generic; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Data; using System.IO; using System.Net; using System.Text; using System.Xml; using System.Web.Security; public partial class wenxinTest : System.Web.UI.Page { const string Token = "xieyang";//你的token protected void Page_Load(object sender, EventArgs e) { string postStr = ""; if (Request.HttpMethod.ToLower() == "post") { System.IO.Stream s = System.Web.HttpContext.Current.Request.InputStream; byte[] b = new byte[s.Length]; s.Read(b, 0, (int)s.Length); postStr = System.Text.Encoding.UTF8.GetString(b); if (!string.IsNullOrEmpty(postStr)) { soo56.BLL.ErrorLog.SaveError("微信测试", postStr); soo56.BLL.ErrorLog.SaveError("微信接收测试", ResponseMsg(postStr)); //ResponseMsg(postStr); //byte[] array = Encoding.UTF8.GetBytes(ResponseMsg(postStr)); //string newMes = System.Text.Encoding.UTF8.GetString(array); Response.Charset = "UTF-8"; Response.ContentType = "text/xml"; System.Web.HttpContext.Current.Response.Write(ResponseMsg(postStr)); // Response.End(); } //WriteLog("postStr:" + postStr); } else { Valid(); } } /// <summary> /// 验证微信签名 /// </summary> /// * 将token、timestamp、nonce三个参数进行字典序排序 /// * 将三个参数字符串拼接成一个字符串进行sha1加密 /// * 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信。 /// <returns></returns> 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; } } private void Valid() { string echoStr = Request.QueryString["echoStr"].ToString(); if (CheckSignature()) { if (!string.IsNullOrEmpty(echoStr)) { Response.Write(echoStr); Response.End(); } } } /// <summary> /// 返回信息结果(微信信息返回) /// </summary> /// <param name="weixinXML"></param> private string ResponseMsg(string weixinXML) { ///这里写你的返回信息代码 XmlDocument xml = new XmlDocument(); xml.LoadXml(weixinXML); XmlElement ele=xml.DocumentElement; string tousername = ele.SelectSingleNode("ToUserName").InnerText; string fromusername = ele.SelectSingleNode("FromUserName").InnerText; string content = ele.SelectSingleNode("Content").InnerText; string result = string.Format(@"<xml> <ToUserName><![CDATA[{0}]]></ToUserName> <FromUserName><![CDATA[{1}]]></FromUserName> <CreateTime>{2}</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[321hjhn你好]]></Content> <FuncFlag>0<FuncFlag> </xml>", fromusername, tousername, DateTime.Now.ToString()); return result; } /// <summary> /// unix时间转换为datetime /// </summary> /// <param name="timeStamp"></param> /// <returns></returns> private DateTime UnixTimeToTime(string timeStamp) { DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1)); long lTime = long.Parse(timeStamp + "0000000"); TimeSpan toNow = new TimeSpan(lTime); return dtStart.Add(toNow); } /// <summary> /// datetime转换为unixtime /// </summary> /// <param name="time"></param> /// <returns></returns> private int ConvertDateTimeInt(System.DateTime time) { System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1)); return (int)(time - startTime).TotalSeconds; } /// <summary> /// 写日志(用于跟踪) /// </summary> private void WriteLog(string strMemo) { string filename = Server.MapPath("/logs/log.txt"); if (!Directory.Exists(Server.MapPath("//logs//"))) Directory.CreateDirectory("//logs//"); StreamWriter sr = null; try { if (!File.Exists(filename)) { sr = File.CreateText(filename); } else { sr = File.AppendText(filename); } sr.WriteLine(strMemo); } catch { } finally { if (sr != null) sr.Close(); } } }
求大神帮忙看一下!为什么回复信息乱码啊!!!!
哪儿是乱码?回复信息是啥?
<Content><![CDATA[321hjhn你好]]></Content> 这个里面是回复信息!数字和字母都显示但是汉字乱码!显示问号什么的!这个怎么办啊?
@飞往天堂的鸭子: 你能把 ResponseMsg 方法返回的字符串贴出来吗?
@Launcher:
string result = string.Format(@"<xml> <ToUserName><![CDATA[{0}]]></ToUserName> <FromUserName><![CDATA[{1}]]></FromUserName> <CreateTime>{2}</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[321hjhn你好]]></Content> <FuncFlag>0<FuncFlag> </xml>", fromusername, tousername, DateTime.Now.ToString());
这个是返回的字符串,回传给微信平台,输出的内容应该是是‘321hjhn你好’。谢谢
@飞往天堂的鸭子: 我个人觉得 Format 后,你的 result 变量的内容应该是这个样子:
<xml><ToUserName>...</ToUserName>....</xml>
是不是?如果是,请按照我的样子把 result 的内容贴出来。
@Launcher: 没明白什么意思!得用string.Format啊!得往里面加入变量的值!
@飞往天堂的鸭子: string result = string.Format(@"<xml>
<ToUserName><![CDATA[{0}]]></ToUserName>
<FromUserName><![CDATA[{1}]]></FromUserName>
<CreateTime>{2}</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[321hjhn你好]]></Content>
<FuncFlag>0<FuncFlag>
</xml>","dsfsdf", "sdfsdf", DateTime.Now.ToString());
我执行上面的代码,得到 result 的内容是:
<xml>
<ToUserName><![CDATA[dsfsdf]]></ToUserName>
<FromUserName><![CDATA[sdfsdf]]></FromUserName>
<CreateTime>2014/3/5 11:16:31</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[321hjhn你好]]></Content>
<FuncFlag>0<FuncFlag>
</xml>
@Launcher: 是啊!在记录里面都是正常的!但是传到微信平台的时候,汉字就乱码了!都看了两天了,还是不知道哪里出了差错!您还有什么方法吗?
@飞往天堂的鸭子: 我给你讲解下,你这里的 result 是 unicode 编码的,你写入 Response 时将其修改为了 Utf-8 编码,那么客户端读取 Response Stream 后,再用 utf-8 编码转换成 string,那么内容应该是跟你的 result 是一致的。
因此,我的问题来了,你传到微信平台,微信平台是如何读取的 Stream,并如何显示出来让你看到的是乱码?
@Launcher: 那个微信平台的api文档上面就是说传输特定的xml格式的信息到微信平台上!
“对于每一个POST请求,开发者在响应包(Get)中返回特定XML结构,对该消息进行响应(现支持回复文本、图片、图文、语音、视频、音乐)。请注意,回复图片等多媒体消息时需要预先上传多媒体文件到微信服务器,只支持认证服务号。”
这些是微信回复信息的文档!有的代码我也是在网上找的!
@飞往天堂的鸭子:
string result = string.Format(@"<xml>
<ToUserName>{0}</ToUserName>
<FromUserName>{1}</FromUserName>
<CreateTime>{2}</CreateTime>
<MsgType>text</MsgType>
<Content>321hjhn你好</Content>
<FuncFlag>0<FuncFlag>
</xml>", fromusername, tousername, DateTime.Now.ToString());
@Launcher: 不好使!还是乱码啊!
@飞往天堂的鸭子: 对不起啊,我自己写了个 Asp.Net 页面,然后用 HttpWebRequest 请求,用 HttpWebResponse 接受后,读出来不是乱码。你的问题请你搞明白,你怎么知道是乱码的?
@Launcher: 就是在微信平台上申请一个测试账号,绑定了那个指定的页面,然后发送数据,回复的信息在手机上显示乱码!扫一下这个就加进去了,随便发什么回复的信息都乱码!
@飞往天堂的鸭子: 请问,你的手机用什么来显示(浏览器?)你这段 XML ?
@Launcher: 不是啊!用微信啊!您用手机微信扫一下那个二维码,进去后随便发一个信息,然后你就会看见回复的信息是乱码的了。
@飞往天堂的鸭子: 那就算了吧,我也不知道微信那边是怎么开发的,也没兴趣知道。我就知道自己写了个 Asp.Net 页面,用 UTF-8 写入你那段 XML,然后客户端通过 HttpWebResponse 接收,然后用 UTF-8 将 Stream 转换为 string 后能够正确显示。
@Launcher: 您能把您的那个代码!发给我看一下吗?谢谢
@飞往天堂的鸭子: 新建一个页面 WebForm1.aspx ,其页面内容为:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebApplication2.WebForm1" EnableSessionState="False"%>
在 WebForm1.aspx.cs 文件中:
public partial class WebForm1 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { Response.Charset = "UTF-8"; Response.ContentType = "text/xml"; Response.Write(@"<xml> <ToUserName><![CDATA[{0}]]></ToUserName> <FromUserName><![CDATA[{1}]]></FromUserName> <CreateTime>{2}</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[321hjhn你好]]></Content> <FuncFlag>0<FuncFlag> </xml>"); Response.Flush(); } }
就 OK 了,然后在客户端调用下:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://localhost:58467/WebForm1.aspx");
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader sr = new StreamReader(response.GetResponseStream(),Encoding.GetEncoding("UTF-8"));
string str = sr.ReadToEnd();
@Launcher: 谢谢了!我还是自己看看吧!
@飞往天堂的鸭子: 乱码问题解决了!在html页面上加了一句ResponseEncoding="UTF-8"