.net开发微信公众平台实例教程

.net开发微信公众平台实例教程,第1张

概述本文实例讲述了.net开发微信公众平台的方法。分享给大家供大家参考。具体实现方法如下:

本文实例讲述了.net开发微信公众平台的方法。分享给大家供大家参考。具体实现方法如下:

一、说明:

公众平台信息接口为开发者提供了一种新的消息处理方式,只有申请成为开发者后,你才能使用公众平台的开发功能,在这里你需要填写一个URL和一个Token,这两项信息也需要你拥有自己的服务器(外网服务器)资源,其中的Token可由开发者任意填写,URL即是接口配置信息的链接地址,在本文中我采用的是创建一个简易网站的方式,在其中的一个页面的后台程序中配置相关的接口信息,然后发布到外网服务器上,最后可以访问到这个页面的链接地址即是这里应该填写的URL。

二、接口配置过程:

1.网址接入-校验签名:

复制代码 代码如下:const string Token = "aka";//定义一个局部变量不可以被修改,这里定义的变量要与接口配置信息中填写的Token一致
protected voID Page_Load(object sender,EventArgs e)
{
        string poststr = "";
        ValID();//校验签名,当填入的信息提交之后页面有提示“你已成功成为公众平台开发者,可以使用公众平台的开发功能”这个的时候,接下来你就需要注释掉这个校验的方法,使得后面的消息回复得以正常运作
        if (Request.httpMethod.Tolower() == "post")//当普通微信用户向公众账号发消息时,微信服务器将POST该消息到填写的URL上
        {
            poststr = Postinput();
            if (string.IsNullOrEmpty(poststr) == false)
            {
                //WriteLog(poststr,Server);//计入日记
                ResponseMsg(poststr);
            }
        }
}
private voID ValID()
{
        string echoStr = Request.queryString["echoStr"].ToString();
        if (CheckSignature())
        {
            if (!string.IsNullOrEmpty(echoStr))
            {
                Response.Write(echoStr);
                Response.End();
            }
        }
}

复制代码 代码如下:/// <summary>
/// 验证微信签名
/// </summary>
/// <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");//对该字符串进行sha1加密
        tmpStr = tmpStr.Tolower();//对字符串中的字母部分进行小写转换,非字母字符不作处理
        //WriteLog(tmpStr,Server);//计入日志
        if (tmpStr == signature)//开发者获得加密后的字符串可与signature对比,标识该请求来源于微信。开发者通过检验signature对请求进行校验,若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,否则接入失败
        {
            return true;
        }
        else
            return false;
}

/// <summary>
/// 获取post返回来的数据
/// </summary>
/// <returns></returns>
private string Postinput()
{
        Stream s = System.Web.httpContext.Current.Request.inputStream;
        byte[] b = new byte[s.Length];
        s.Read(b,(int)s.Length);
        return EnCoding.UTF8.GetString(b);
}

/// <summary>
///返回微信信息结果
/// </summary>
/// <param name="weixinXML"></param>
private voID ResponseMsg(string weixinXML)
{
        try
        {
            Xmldocument doc = new Xmldocument();
            doc.LoadXml(weixinXML);//读取XML字符串
            XmlElement rootElement = doc.documentElement;

            XmlNode MsgType = rootElement.SelectSingleNode("MsgType");//获取字符串中的消息类型

            string resxml = "";
            if (MsgType.InnerText == "text")//如果消息类型为文本消息
            {
                var model = new
                {
                    ToUsername = rootElement.SelectSingleNode("ToUsername").InnerText,
                    FromUsername = rootElement.SelectSingleNode("FromUsername").InnerText,
                    CreateTime = rootElement.SelectSingleNode("CreateTime").InnerText,
                    MsgType = MsgType.InnerText,
                    Content = rootElement.SelectSingleNode("Content").InnerText,
                    Msgid = rootElement.SelectSingleNode("Msgid").InnerText
                };
                resxml += "<xml><ToUsername><![cdaTA[" + model.FromUsername + "]]></ToUsername><FromUsername><![cdaTA[" + model.ToUsername + "]]></FromUsername><CreateTime>" + ConvertDateTimeInt(DateTime.Now) + "</CreateTime>";
                if (!string.IsNullOrEmpty(model.Content))//如果接收到消息
                {
                    if (model.Content.Contains(" 你好") || model.Content.Contains(" 好") || model.Content.Contains("hi") || model.Content.Contains("hello"))// 你好
                    {
                        resxml += "<MsgType><![cdaTA[text]]></MsgType><Content><![cdaTA[你好,有事请留言,偶会及时回复你的。]]></Content><FuncFlag>0</FuncFlag></xml>";
                    }

                 }

                 else//没有接收到消息
                {
                    resxml += "<MsgType><![cdaTA[text]]></MsgType><Content><![cdaTA[亲,感谢您对我的关注,有事请留言。]]></Content><FuncFlag>0</FuncFlag></xml>";
                }

                Response.Write(resxml);
            }
            if (MsgType.InnerText == "image")//如果消息类型为图片消息
            {
                var model = new
                {
                    ToUsername = rootElement.SelectSingleNode("ToUsername").InnerText,
                    PicUrl = rootElement.SelectSingleNode("PicUrl").InnerText,
                    Msgid = rootElement.SelectSingleNode("Msgid").InnerText
                };
                resxml += "<xml><ToUsername><![cdaTA[" + model.FromUsername + "]]></ToUsername><FromUsername><![cdaTA[" + model.ToUsername + "]]></FromUsername><CreateTime>" + ConvertDateTimeInt(DateTime.Now) + "</CreateTime><MsgType><![cdaTA[news]]></MsgType><ArticleCount>1</ArticleCount><Articles><item><Title><![cdaTA[欢迎您的光临!]]></Title><Description><![cdaTA[非常感谢您的关注!]]></Description><PicUrl><![cdaTA[http://...jpg]]></PicUrl><Url><![cdaTA[http://www.baIDu.com/]]></Url></item></Articles><FuncFlag>0</FuncFlag></xml>";
                Response.Write(resxml);
            }
            else//如果是其余的消息类型
            {
                var model = new
                {
                    ToUsername = rootElement.SelectSingleNode("ToUsername").InnerText,
                };
                resxml += "<xml><ToUsername><![cdaTA[" + model.FromUsername + "]]></ToUsername><FromUsername><![cdaTA[" + model.ToUsername + "]]></FromUsername><CreateTime>" + ConvertDateTimeInt(DateTime.Now) + "</CreateTime><MsgType><![cdaTA[text]]></MsgType><Content><![cdaTA[亲,感谢您对我的关注,有事请留言,我会及时回复你的哦。]]></Content><FuncFlag>0</FuncFlag></xml>";
                Response.Write(resxml);
            }
        }
        catch (Exception ex)
        {
            throw ex;
        }
        Response.End();

}
/// <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>
public static voID WriteLog(string strMemo,httpServerUtility server)
{
        string filename = server.MapPath("/logs/log.txt");//在网站项目中建立一个文件夹命名logs(然后在文件夹中随便建立一个web页面文件,避免网站在发布到服务器之后看不到预定文件)
        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();
        }
}

希望本文所述对大家的.net程序设计有所帮助。

总结

以上是内存溢出为你收集整理的.net开发微信公众平台实例教程全部内容,希望文章能够帮你解决.net开发微信公众平台实例教程所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1260982.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-08
下一篇2022-06-08

发表评论

登录后才能评论

评论列表(0条)

    保存