直接上代码:如有问题请留言。
View Code
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;
using System.Xml.Linq;
using System.Linq;

public partial class WeiXin : System.Web.UI.Page
{
    /// <summary>
    /// 微信的Token
    /// </summary>
    const string Token = "token";
    protected void Page_Load(object sender, EventArgs e)
    {
        string postStr = "";
        
        Valid();
        if (Request.HttpMethod.ToLower() == "post")
        {
            postStr = PostInput();
            if (false == string.IsNullOrWhiteSpace(postStr))
            {
                ResponseMsg(postStr);
            }
        }
    }

    /// <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 void ResponseMsg(string weixinXML)
    {
        //回复消息的部分:你的代码写在这里
        //根据关键词 自定义回复

        try
        {
            var xDoc = XDocument.Parse(weixinXML);
            var q = (from c in xDoc.Elements() select c).ToList();

            var msgType = q.Elements("MsgType").First().Value; // 获取信息内容的类型
            var _tmpContent = "";

            #region =============== 处理MsgType:text =====================
            if (0 == string.Compare("text", msgType, true))
            {
                var model = new
                {
                    ToUserName = q.Elements("ToUserName").First().Value,
                    FromUserName = q.Elements("FromUserName").First().Value,
                    CreateTime = q.Elements("CreateTime").First().Value,

                    MsgType = q.Elements("MsgType").First().Value,
                    Content = ("" + q.Elements("Content").First().Value).Trim(),
                    MsgId = q.Elements("MsgId").First().Value
                };

                if (false == string.IsNullOrWhiteSpace(model.Content))
                {
                    switch (model.Content.ToLower())
                    {
                        case "帮助":
                        case "help":
                        case "hello2bizuser": //被关注时自动回复
                            _tmpContent = "使用帮助说明:\r\n------------------------\r\n"
                                + "常用命令:\r\n"
                                + "1、查看案例;\r\n"
                                + "2、联系方式;\r\n"
                                + "3、帮助或help;\r\n"
                                + "------------------------\r\n如果喜欢就推荐给您的朋友,\r\n我们的微信号:gzjinri";
                            break;

                        case "查看案例":
                            _tmpContent = "查看案例:\r\n------------------------\r\n";
                            break;

                        case "联系方式":
                            _tmpContent = "联系方式:\r\n------------------------\r\n";
                            break;

                        default: // 默认不做任务处理
                            break;
                    }


                    if (false == string.IsNullOrWhiteSpace(_tmpContent))
                    {
                        var textTpl = "<xml>"
                                    + "<ToUserName><![CDATA[{0}]]></ToUserName>"
                                    + "<FromUserName><![CDATA[{1}]]></FromUserName>"
                                    + "<CreateTime>{2}</CreateTime>"
                                    + "<MsgType><![CDATA[{3}]]></MsgType>"
                                    + "<Content><![CDATA[{4}]]></Content>"
                                    + "<FuncFlag>{5}</FuncFlag>"
                                    + "</xml>";

                        Response.Write(string.Format(textTpl, model.FromUserName, model.ToUserName, ConvertDateTimeInt(DateTime.Now), "text", _tmpContent));
                    }

                }
            }
            #endregion

        }
        catch (Exception ex)
        {
            WriteLog(ex.ToString());
        }

        Response.End();
    }

    /// <summary>
    /// 获取POST返回来的数据
    /// </summary>
    /// <returns></returns>
    private string PostInput()
    {
        try
        {
            System.IO.Stream s = Request.InputStream;
            int count = 0;
            byte[] buffer = new byte[s.Length];
            StringBuilder builder = new StringBuilder();
            while ((count = s.Read(buffer, 0, buffer.Length)) > 0)
            {
                builder.Append(Request.ContentEncoding.GetString(buffer, 0, count));
            }
            s.Flush();
            s.Close();
            s.Dispose();
            return builder.ToString();
        }
        catch (Exception ex)
        { throw ex; }
    }

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

 

posted on 2013-01-25 15:02  广州金日科技  阅读(1320)  评论(3编辑  收藏  举报