首页 新闻 会员 周边

.net开发微信的乱码问题

0
悬赏园豆:5 [已解决问题] 解决于 2014-03-10 15:53

这几天开始研究微信公众平台开发!可是回复的信息乱码!哪位高手可以为我解答一下啊!急啊!

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();

        }

    }
}

求大神帮忙看一下!为什么回复信息乱码啊!!!!

DrMundo的主页 DrMundo | 初学一级 | 园豆:123
提问于:2014-03-05 10:40
< >
分享
最佳答案
0

哪儿是乱码?回复信息是啥?

收获园豆:5
Launcher | 高人七级 |园豆:45045 | 2014-03-05 10:58

<Content><![CDATA[321hjhn你好]]></Content>   这个里面是回复信息!数字和字母都显示但是汉字乱码!显示问号什么的!这个怎么办啊?

DrMundo | 园豆:123 (初学一级) | 2014-03-05 11:01

@飞往天堂的鸭子: 你能把 ResponseMsg 方法返回的字符串贴出来吗?

Launcher | 园豆:45045 (高人七级) | 2014-03-05 11:03

@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你好’。谢谢

DrMundo | 园豆:123 (初学一级) | 2014-03-05 11:07

@飞往天堂的鸭子: 我个人觉得 Format 后,你的 result 变量的内容应该是这个样子:

<xml><ToUserName>...</ToUserName>....</xml>

是不是?如果是,请按照我的样子把 result 的内容贴出来。

Launcher | 园豆:45045 (高人七级) | 2014-03-05 11:09

@Launcher: 没明白什么意思!得用string.Format啊!得往里面加入变量的值!

DrMundo | 园豆:123 (初学一级) | 2014-03-05 11:13

@飞往天堂的鸭子: 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 | 园豆:45045 (高人七级) | 2014-03-05 11:16

@Launcher: 是啊!在记录里面都是正常的!但是传到微信平台的时候,汉字就乱码了!都看了两天了,还是不知道哪里出了差错!您还有什么方法吗?

DrMundo | 园豆:123 (初学一级) | 2014-03-05 11:19

@飞往天堂的鸭子: 我给你讲解下,你这里的 result 是 unicode 编码的,你写入 Response 时将其修改为了 Utf-8 编码,那么客户端读取 Response Stream 后,再用 utf-8 编码转换成 string,那么内容应该是跟你的 result 是一致的。

因此,我的问题来了,你传到微信平台,微信平台是如何读取的 Stream,并如何显示出来让你看到的是乱码?

Launcher | 园豆:45045 (高人七级) | 2014-03-05 11:23

@Launcher: 那个微信平台的api文档上面就是说传输特定的xml格式的信息到微信平台上!

“对于每一个POST请求,开发者在响应包(Get)中返回特定XML结构,对该消息进行响应(现支持回复文本、图片、图文、语音、视频、音乐)。请注意,回复图片等多媒体消息时需要预先上传多媒体文件到微信服务器,只支持认证服务号。”

 

 

 

这些是微信回复信息的文档!有的代码我也是在网上找的!

DrMundo | 园豆:123 (初学一级) | 2014-03-05 11:32

@飞往天堂的鸭子: 

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 | 园豆:45045 (高人七级) | 2014-03-05 11:41

@Launcher: 不好使!还是乱码啊!

DrMundo | 园豆:123 (初学一级) | 2014-03-05 11:48

@飞往天堂的鸭子: 对不起啊,我自己写了个 Asp.Net 页面,然后用 HttpWebRequest 请求,用 HttpWebResponse 接受后,读出来不是乱码。你的问题请你搞明白,你怎么知道是乱码的?

Launcher | 园豆:45045 (高人七级) | 2014-03-05 13:12

@Launcher: 就是在微信平台上申请一个测试账号,绑定了那个指定的页面,然后发送数据,回复的信息在手机上显示乱码!扫一下这个就加进去了,随便发什么回复的信息都乱码!

DrMundo | 园豆:123 (初学一级) | 2014-03-05 13:51

@飞往天堂的鸭子: 请问,你的手机用什么来显示(浏览器?)你这段 XML ?

Launcher | 园豆:45045 (高人七级) | 2014-03-05 13:56

@Launcher: 不是啊!用微信啊!您用手机微信扫一下那个二维码,进去后随便发一个信息,然后你就会看见回复的信息是乱码的了。

DrMundo | 园豆:123 (初学一级) | 2014-03-05 14:00

@飞往天堂的鸭子: 那就算了吧,我也不知道微信那边是怎么开发的,也没兴趣知道。我就知道自己写了个 Asp.Net 页面,用 UTF-8 写入你那段 XML,然后客户端通过 HttpWebResponse 接收,然后用 UTF-8 将 Stream 转换为 string 后能够正确显示。

Launcher | 园豆:45045 (高人七级) | 2014-03-05 14:10

@Launcher: 您能把您的那个代码!发给我看一下吗?谢谢

DrMundo | 园豆:123 (初学一级) | 2014-03-05 14:14

@飞往天堂的鸭子: 新建一个页面 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 | 园豆:45045 (高人七级) | 2014-03-05 14:33

@Launcher: 谢谢了!我还是自己看看吧!

DrMundo | 园豆:123 (初学一级) | 2014-03-05 15:03

@飞往天堂的鸭子: 乱码问题解决了!在html页面上加了一句ResponseEncoding="UTF-8"

DrMundo | 园豆:123 (初学一级) | 2014-03-10 15:50
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册