微信公众号服务 - 简单demo(C#)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Security;
using System.Collections;
using System.Xml;
using System.Xml.Linq;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;

public partial class wx : System.Web.UI.Page
{
    const string Token = "mrlenon";//你的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))
            {
                //ResponseMsg(postStr);
                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>
    /// 返回微信POST过来的结果(微信信息返回)
    /// </summary>
    /// <param name="weixinXML">微信服务器post过来的数据</param>
    private string ResponseMsg(string weixinXML)
    {
        Hashtable ht = GetXmlName(weixinXML);

        //这里写你的返回信息代码
        StringBuilder sb = new StringBuilder();
        sb.Append("<xml>");
        sb.Append("<ToUserName><![CDATA[" + ht["FromUserName"].ToString() + "]]></ToUserName>");
        sb.Append("<FromUserName><![CDATA[" + ht["ToUserName"].ToString() + "]]></FromUserName>");
        sb.Append("<CreateTime>" + ht["CreateTime"].ToString() + "</CreateTime>");

        sb.Append("<MsgType><![CDATA[" + ht["MsgType"].ToString() + "]]></MsgType>");
        sb.Append("<Content><![CDATA[" + ht["Content"].ToString() + "]]></Content>");

        //switch (ht["MsgType"].ToString())
        //{
        //    case "text":
        //        sb.Append("<MsgType><![CDATA[" + ht["MsgType"].ToString() + "]]></MsgType>");
        //        sb.Append("<Content><![CDATA[" + ht["Content"].ToString() + "]]></Content>");
        //        break;
        //    case "image":
        //        sb.Append("<MsgType><![CDATA[" + ht["MsgType"].ToString() + "]]></MsgType>");
        //        sb.Append("<Content><![CDATA[亲,目前还没有做图片消息处理的功能哦!]]></Content>");
        //        sb.Append("<Image>");
        //        sb.Append("<MediaId><![CDATA[" + ht["MediaId"].ToString() + "]]></MediaId>");
        //        sb.Append("</Image>");
        //        break;
        //    case "voice":
        //        sb.Append("<Content><![CDATA[亲,目前还没有做语音消息处理的功能哦!]]></Content>");
        //        break;
        //    case "video":
        //        sb.Append("<Content><![CDATA[亲,目前还没有做视频消息处理的功能哦!]]></Content>");
        //        break;
        //    case "location":
        //        sb.Append("<Content><![CDATA[亲,目前还没有做地理位置处理的功能哦!]]></Content>");
        //        break;
        //    case "link":
        //        sb.Append("<Content><![CDATA[亲,目前还没有做链接消息处理的功能哦!]]></Content>");
        //        break;
        //}

        sb.Append("</xml>");
        return sb.ToString();
    }

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

    /// <summary>
    /// 解析post过来的数据
    /// </summary>
    /// <param name="xmlStr"></param>
    /// <returns></returns>
    private Hashtable GetXmlName(string xmlStr)
    {
        Hashtable ht = new Hashtable(); //创建一个Hashtable实例

        XmlDocument xx = new XmlDocument();
        xx.LoadXml(xmlStr);//加载xml

        //开发者微信号
        XmlNodeList toList = xx.GetElementsByTagName("ToUserName"); //取得节点名为ToUserName的XmlNode集合
        XmlNode toNode = toList[0];
        string toName = toNode.InnerText;

        //发送方帐号(一个OpenID)
        XmlNodeList fromList = xx.GetElementsByTagName("FromUserName"); //取得节点名为FromUserName的XmlNode集合
        XmlNode fromNode = fromList[0];
        string fromName = fromNode.InnerText;

        //消息创建时间 (整型)
        XmlNodeList createTimeList = xx.GetElementsByTagName("CreateTime"); //取得节点名为CreateTime的XmlNode集合
        XmlNode createTimeNode = createTimeList[0];
        string createTimeName = createTimeNode.InnerText;

        //消息类型 text/image/voice/video/location/link
        XmlNodeList msgTypeList = xx.GetElementsByTagName("MsgType"); //取得节点名为MsgType的XmlNode集合
        XmlNode msgTypeNode = msgTypeList[0];
        string msgTypeName = msgTypeNode.InnerText;

        //文本消息内容
        XmlNodeList contentList = xx.GetElementsByTagName("Content"); //取得节点名为CreateTime的XmlNode集合
        XmlNode contentNode = contentList[0];
        string contentName = contentNode.InnerText;

        //图片链接
        XmlNodeList picUrlList = xx.GetElementsByTagName("PicUrl"); //取得节点名为PicUrl的XmlNode集合
        XmlNode picUrlNode = picUrlList[0];
        string picUrlName = picUrlNode.InnerText;

        //图片消息媒体id,可以调用多媒体文件下载接口拉取数据。
        XmlNodeList mediaIdList = xx.GetElementsByTagName("MediaId"); //取得节点名为PicUrl的XmlNode集合
        XmlNode mediaIdNode = mediaIdList[0];
        string mediaIdName = mediaIdNode.InnerText;

        //消息id,64位整型
        XmlNodeList msgIdList = xx.GetElementsByTagName("MsgId"); //取得节点名为MsgId的XmlNode集合
        XmlNode msgIdNode = msgIdList[0];
        string msgIdName = msgIdNode.InnerText;

        ht.Add("ToUserName", toName);
        ht.Add("FromUserName", fromName);
        ht.Add("CreateTime", createTimeName);
        ht.Add("MsgType", msgTypeName);
        ht.Add("Content", contentName);
        //ht.Add("PicUrl", picUrlName);
        //ht.Add("MediaId", mediaIdName);
        //ht.Add("MsgId", msgIdName);

        return ht;
    }
}

  

时间: 2024-10-05 19:36:40

微信公众号服务 - 简单demo(C#)的相关文章

微信公众号PHP简单开发流程

微信公众号开发分傻瓜模式和开发者模式两种,前者不要考虑调用某些接口,只要根据后台提示傻瓜式操作即可,适用于非专业开发人员. 开发模式当然就是懂程序开发的人员使用的. 下面简单说一下微信公众号开发的简易流程,新手看看会有帮助,高手请一笑而过. 1.配置服务器: A.首先在本机建立如下结构的文件夹(这里是我自己的习惯,仅供参考) MMPN:总目录mro message public number 微信公众号 backup:备份目录,主要用于备份php文件,每次修改时将原稿备份到里面去. images

微信公众号开发简单的网页授权登陆获取用户基本信息

由于业务需要,近期在做微信公众号开发,其中一个模块是微信用户点击个人中心访问可以得到次微信用户的头像昵称国家省份等基本信息. 但由于业务需求,这块功能暂时用不上了,但这功能的实现毕竟是自己花费几天时间搞出来的,觉得以后会用的上,暂且记录一下实现过程. 首先:获取用户信息的过程属于微信网页授权登陆,再做这一块之前请先阅读微信开发文档以熟悉基本的开发过程: https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842 微信开发文档

信用卡微信公众号或服务号解除绑定-实录

目前主流的信用卡发卡行均已推出基于微信公众号服务号的便民服务若是需要解除绑定呢 新测还是比较简单的基本的方法都是发送"解除绑定"或者类似字样到发卡行的微信公众号再根据提示就可以进行解除绑定操作了. 以下是实际操作记录供参考 招商银行 M.E 取消绑定 招商银行信用卡 您是需要选择以下哪项功能 6. 开通微信持卡人验证 7. 取消微信持卡人验证 8. 掌上生活如何关联或删除卡片 9. 掌上生活注册.绑卡攻略 10. 取消微信支付功能 11. 设置自动扣款功能 请您对本次回复做出评价感谢您

微信公众平台开发教程-关于申请微信公众号订阅号(服务号)的材料和流程

微信公众号服务号与订阅号的区别 订阅号: 1.每天可以发1次信息,每次可以发送8篇文章(信息展示在微信公众号折叠文件中) 2.不能申请微信支付功能 3.认证后才可以使用自定义菜单功能 4.订阅号适合:不需要支付功能,以为用户提供咨询信息的企业. 服务号: 1.每月可以发4次信息,每次可以发送8篇文章(信息直接展示微信聊天框中) 2.可以申请微信支付功能 3.无论是否认证都可使用自定义菜单功能 4.服务号适合:需要开通支付功能的企业. 微信公众号申请注册用户需提供以下材料: ①企业营业执照 ②对公

关于南通大学教务管理系统微信公众号的个人看法

微信公众号和网页版对比 微信公众号可以查询成绩,课表,公选课报名,比网页登录来的方便多,我们只需要关注公众号后按提示操作,而网页版比较繁琐,每次登陆都需要输入用户名密码,相比之下,微信公众号就显得便捷多了. 成绩查询方面: 微信公众号能够简单快速地查到每门课程的总评成绩:网页版的除了可以查到总评成绩之外,还可以查询到每门课程的学时,学分,课程类别,平时成绩,期末成绩.网页版更加全面系统地反应了每门课程的一个学习情况,学生能清晰的明确自己的薄弱的课程. 课表查询方面: 微信公众号和网页版目前都无法

如何让你的微信公众号成为“大V”

随着微信的迅速发展和用户普及,“内容营销”这个词被越来越多地被大家提及.很多企业也在微信公众号推广中发现,如果单纯地进行企业推广和产品销售,用户都会将账号认为是“烦人的广告”,别说去阅读了,连让添加关注都不情愿.“内容营销”的优势就在这里体现出来了,丰富有趣的生活资讯.即时迅速的热点新闻.幽默搞笑的漫画视频.原创前沿的评论见解……把这些内容中植入企业广告,企业品牌对用户的影响可谓是“润物细无声”. 然而,很多企业微信公众号的运营负责人着实觉得头痛:海量的资讯需要收集,重点的信息需要编辑,发布的结

怎样才能让你的微信公众号成为“大V”

随着微信的迅速发展和用户普及,"内容营销"这个词被越来越多地被大家提及.很多企业也在微信公众号推广中发现,如果单纯地进行企业推广和产品销售,用户都会将账号认为是"烦人的广告",别说去阅读了,连让添加关注都不情愿."内容营销"的优势就在这里体现出来了,丰富有趣的生活资讯.即时迅速的热点新闻.幽默搞笑的漫画视频.原创前沿的评论见解--把这些内容中植入企业广告,企业品牌对用户的影响可谓是"润物细无声". 然而,很多企业微信公众号的运

图书馆申请微信公众号步骤(三证合一后申请微信公众号)

现在微信公众号已经逐渐成为部门宣传.服务的重要力量,因部门需要,我现在将我申请微信公众号(服务号)的过程跟大家分享一下,希望有需要的人看到能够少走弯路.其实,申请微信公众号很简单,1.要注册一个邮箱,可以是qq邮箱或者是网易邮箱等.2.进入微信公众平台https://mp.weixin.qq.com/.3.页面的右上角有一个立即注册.4.选择需要的微信公众号的类型.分为订阅号.服务号.跟企业号,具体的分类方法与功能各位可以自己网上查一下,我在这里就不多说了.PS:我们需要的是服务号,我就在这里说

个人公众号服务端开发Demo

公众号出来很久了,也可以个人申请.知道公众号的服务端开发其实很简单,接口调用封装,数据存取,不外如是. 人一旦懒了,真的是 "无可救药" 了...现简单描述晚到的公众号HelloWorld 思路 公众号里面简单的文章展示,静态博客展示这种好像没啥特别的,就跳过了. 在聊天框输入参数, 传到云服务器处理,然后请求个三方API获取信息,封装返回.嗯,这就算个基本的Demo了 准备 1, 得申请个公众号,个人的,免费 2, 最好买一台云服务器,双十一的阿里云最低100¥/Year,heihe