.net开发微信公众平台

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

.net开发微信公众平台 - 盛情渊 - 南宫云遥的博客

二、接口配置过程:

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

.net开发微信公众平台 - 盛情渊 - 南宫云遥的博客

    /// <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, 0, (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,                     FromUserName = rootElement.SelectSingleNode("FromUserName").InnerText,                     CreateTime = rootElement.SelectSingleNode("CreateTime").InnerText,                     MsgType = MsgType.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,                     FromUserName = rootElement.SelectSingleNode("FromUserName").InnerText,                     CreateTime = rootElement.SelectSingleNode("CreateTime").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();         }     }

转载于:https://www.cnblogs.com/xjwxjk/p/3790676.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/432507.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用客户端对象模型读取SharePoint列表数据

使用客户端对象模型读取SharePoint列表数据 客户端对象模型提供了强有力的方式&#xff0c;从远程客户端应用程序管理列表。1. 管理员身份打开VS&#xff0c;新建项目Windows窗体应用程序&#xff0c;命名ReadSPListData&#xff0c;确保选择.NET Framework 3.5。2. 添加控件。…

UE4 获得player id

获得Player ID 获得Player 位置 获得所有PlayerId

installshield 指定多个自定义路径和文件

1. 在Project Assistant的Application Files标签里面 在Script-defined Folders下面分别创建两个变量AAAA&#xff0c;BBBB。 分别在两个变量下面创建文件夹&#xff0c;A1&#xff0c;B1。 把需要安装在这两个文件夹下的文件分别添加进去。 2. 在Installation Designer标签下&…

用鼠标选择模型表面两点并连线

1.两次鼠标点击分别用两个小球标识点击的位置 2. 鼠标右键实现两个位置之间的连线&#xff0c;并在线的中心位置设置textrender来显示线的长度 3. 设置textrender的朝向始终面向摄像机&#xff0c;并作插值平滑过度 4. 设置鼠标光标可显示&#xff0c;并且关卡可以响应鼠标事件…

java ranger rest_使用REST

使用Spring MVC开发Web应用程序的主要工作就是编写Controller逻辑。在Web应用中&#xff0c;除了需要使用MVC给用户显示页面外&#xff0c;还有一类API接口&#xff0c;我们称之为REST&#xff0c;通常输入输出都是JSON&#xff0c;便于第三方调用或者使用页面JavaScript与之交…

JDK安装与环境变量配置

本文介绍JDK的安装与环境变量配置。 工具/原料 JDK1.7.0 WIN7 方法/步骤 安装JDK 选择安装目录 安装过程中会出现两次 安装提示 。第一次是安装 jdk &#xff0c;第二次是安装 jre 。建议两个都安装在同一个java文件夹中的不同文件夹中。&#xff08;不能都安装在java文件夹的…

第一人称视角获得运动方向和视角的夹角

1. GetVelocity获得速度的vector 2. 使用RotationFromXVector和速度的vector得到世界坐标系里速度向量和世界坐标系X轴的夹角 虽然&#xff0c;RotationFromXVector返回的是一个rotation&#xff0c;但实际上只有Yaw值有效&#xff0c;因为Yaw(围绕Z轴的偏转角) 即为速度vecto…

java中CardLayout的使用方法

import javax.swing.*;import java.awt.*; import java.awt.event.*;public class Card extends JFrame{/** JFrame的布局管理器是BorderLayout*/JPanel p;//位于中心区域的面板JButton b1,b2,b3,b4;//位于南部区域的四个按钮JLabel l1,l2,l3,l4;CardLayout c;//设置面板p的布局…

深入浅出UE4网络

UE4中的官方文档结构比较混乱&#xff0c;且有部分错误&#xff0c;不方便学习。笔者试图通过本文&#xff0c;整理出一篇关于UE4网络的文章&#xff0c;方便朋友们对UE4中的网络同步部分的认识&#xff0c;并有进一步理解。如有讲得不清楚明白的地方&#xff0c;还望批评指正。…

java载屁股针_以前常打的“屁股针”,为何现在很少见了?医生告诉你真实原因...

打屁股针应该是每个人的童年噩梦&#xff0c;还记得小时候到医院打针&#xff0c;医生的手还没碰到裤子&#xff0c;就感觉屁股发麻&#xff0c;忍不住拔腿就跑&#xff0c;最终还是被家长逮住&#xff0c;夹在大腿间固定住&#xff0c;防止逃跑&#xff0c;于是在哭喊声中迎来…

Windows中查找文件被何进程使用

这篇文章记录在对文件/文件夹删除、更改&#xff0c;移动时&#xff0c;Windows弹窗提示正在被某程序使用&#xff0c;但又不给出进程名的问题。 方法一、 在任务管理器中&#xff0c;切换到性能项&#xff0c;有一个资源管理器&#xff0c;如下&#xff1a; 进入资源管理器&am…

UE4 多人联机显示每个人的playid

目的&#xff1a;在多人联机模式下&#xff0c;在每个pawn的上方显示textrender&#xff0c;并且在textrender里显示每个pawn的playerid 下面以一个listen server和两个client的方式测试。 1. 创建一个带有textrender的actor&#xff0c;并且勾选其replicated开关 2. 在Chara…

TSubclassOf

在蓝图或C层面调用SpawnActor创建一个actor对象&#xff0c;或者调用SpawnActorDeferred 延迟创建一个actor对象时&#xff0c;都需要一个class类型的参数。 如果在C层面&#xff0c;对象类型是我们自己在蓝图里做的蓝图类&#xff0c;那么C层面需要得到蓝图类型。做法如下&am…

蓝图中实现人物移动1

从Character继承一个蓝图类并编写下面代码1.得到前后移动的方向向量2.得到左右移动的方向向量3. 实现前后移动事件4. 实现左右移动事件5. 实现鼠标左键改变视角和移动方向

Java写一个快速排序_java实现快速排序

以上为思路。总的来说&#xff0c;快速排序也是利用了分治法的思想。基本步骤&#xff1a;1.先选择好合适的主元pivot&#xff0c;2.然后再把比主元小的元素放到主元的左边(右边)&#xff0c;把较大的元素放到主元的右边(左边)&#xff0c;3.接着再以主元为分界点&#xff0c;把…

解密ControlRotation与ActorRotation

在实现角色移动时&#xff0c;我们是通过获取当前角色向前或者向后移动的向量来计算具体的移动步长&#xff0c;进而增量设置角色位置以达到使角色移动的目的。但是获取向前或者向后的向量得先知道当前角色在世界坐标系中旋转的角度&#xff0c;于是我们就在ControlRotation和A…

系统会自带java吗_使用eclipse自带制作帮助系统

①help的api的生成1&#xff1a;项目中的生成javadoc或右击项目的导出&#xff0c;成javadoc格式。2&#xff1a;找打jdk中的Javadoc位置。如果忘记可以同cmd窗口通过指令寻找jdk位置&#xff0c;还可以直接再我的电脑中搜索javadoc。查找Javadoc.exe路径位置&#xff0c;填入j…

UE4 左右立体参数

在编辑器的editor preferences里设置下面参数

java work set没有显示出来_eclipse里新建work set,将项目分组放在不同文件夹

想必大家的Eclipse里也会有这么多得工程......每次工作使用到的项目肯定不会太多......每次从这么大数量的工程当中找到自己要使用的,必须大规模的滚动滚动条......有点不和谐了.无意当中看到了working set自己创建了一个 workingset 并将相应的 projects 添加到 working set 当…