这篇文章还不错,使用 .net , 对微信用户的想公众号发送的文字进行回复。比较简单,自己可以修改更复杂的回复。
微信公众号开发笔记(C#)
原文地址
需求分析
根据用户在微信上发送至价值中国公众号的消息,查询与该消息相关的内容返回给用户。
例如,用户发送【美国经济】后收到包含【美国经济】的内容,点击可查看全文。若没有查询到相关内容,则返回默认消息。
运行环境
.NET
准备工作
1.在微信公众平台申请开发者。
2.功能页面完成后上传至自己的网站并能正常访问该URL(以下统称:目标接口)
3.在微信公众平台开启开发模式。
开发流程
1.验证签名,微信服务器会发一个GET请求到目标接口,接收参数后开始验证。
2.首先接收微信服务器发送的请求,然后进行处理,请求为xml格式,携带公众号、发送方微信号、消息类型,消息内容等结点。
3.根据消息类型,从数据库读取相关预设内容返回,要求响应时间在5秒内,返回格式同样是xml格式。
备注
输出内容一定要使用UTF-8的编码方式,否则中文会产生乱码。
如果消息中需要换行,使用\r\n来换行。
支持html的a标签,但是如果是换行是紧邻关系的话可能无法识别换行。
完整代码
using System;
using System.IO;
using System.Text;
using System.Web;
using System.Web.Security;
using System.Xml;
public class WeChat : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
weixin wx = new weixin();
String postStr = String.Empty;
if (HttpContext.Current.Request.HttpMethod.ToUpper() == "POST")
{
Stream s = HttpContext.Current.Request.InputStream;
Byte[] b = new Byte[s.Length];
s.Read(b, 0, (Int32)s.Length);
postStr = Encoding.UTF8.GetString(b);
if (!String.IsNullOrEmpty(postStr))
{
wx.Handle(postStr);
}
}
else
{
wx.Auth();
}
}
public bool IsReusable
{
get
{
return false;
}
}
}
public class weixin
{
private String Token = "改写为自己的Token";
private String DefaultResponseContent = "欢迎关注价值中国\r\n价值中国是中国领先的财经商业领域社会化媒体";
public void Auth()
{
String echoStr = HttpContext.Current.Request.QueryString["echoStr"];
if (CheckSignature())
{
if (!String.IsNullOrEmpty(echoStr))
{
HttpContext.Current.Response.Write(echoStr);
HttpContext.Current.Response.End();
}
}
}
public void Handle(String postStr)
{
XmlDocument doc = new XmlDocument();
doc.LoadXml(postStr);
XmlElement rootElement = doc.DocumentElement;
XmlNode MsgType = rootElement.SelectSingleNode("MsgType");
RequestXML requestXML = new RequestXML();
requestXML.ToUserName = rootElement.SelectSingleNode("ToUserName").InnerText;
requestXML.FromUserName = rootElement.SelectSingleNode("FromUserName").InnerText;
requestXML.CreateTime = rootElement.SelectSingleNode("CreateTime").InnerText;
requestXML.MsgType = MsgType.InnerText;
if (requestXML.MsgType == "text")
{
requestXML.Content = rootElement.SelectSingleNode("Content").InnerText;
}
else if (requestXML.MsgType == "location")
{
requestXML.Location_X = rootElement.SelectSingleNode("Location_X").InnerText;
requestXML.Location_Y = rootElement.SelectSingleNode("Location_Y").InnerText;
requestXML.Scale = rootElement.SelectSingleNode("Scale").InnerText;
requestXML.MapInfo = rootElement.SelectSingleNode("Label").InnerText;
}
else if (requestXML.MsgType == "image")
{
requestXML.PicUrl = rootElement.SelectSingleNode("PicUrl").InnerText;
}
ResponseMsg(requestXML);
}
/// 验证微信签名
private bool CheckSignature()
{
String signature = HttpContext.Current.Request.QueryString["signature"];
String timestamp = HttpContext.Current.Request.QueryString["timestamp"];
String nonce = HttpContext.Current.Request.QueryString["nonce"];
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;
}
}
/// <summary>
/// 回复消息
/// </summary>
/// <param name="weixinXML"></param>
private void ResponseMsg(RequestXML requestXML)
{
String responseContent = String.Empty;
if (requestXML.MsgType == "text")
{
responseContent = FormatTextXML(requestXML.FromUserName, requestXML.ToUserName, "从数据库读取的内容");
}
HttpContext.Current.Response.ContentEncoding = Encoding.UTF8;
HttpContext.Current.Response.Write(responseContent);
}
/// 返回格式化文本XML内容
private String FormatTextXML(String fromUserName, String toUserName, String content)
{
return "<xml><ToUserName><![CDATA[" + fromUserName + "]]></ToUserName><FromUserName><![CDATA[" + toUserName + "]]></FromUserName><CreateTime>" + ConvertDateTimeInt(DateTime.Now) + "</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[" + content + "]]></Content><FuncFlag>1</FuncFlag></xml>";
}
private int ConvertDateTimeInt(System.DateTime time)
{
System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1));
return (int)(time - startTime).TotalSeconds;
}
}
//微信请求类
public class RequestXML
{
private String toUserName = String.Empty;
/// <summary>
/// 公众号
/// </summary>
public String ToUserName
{
get { return toUserName; }
set { toUserName = value; }
}
private String fromUserName = "";
/// <summary>
/// 发送方微信号
/// </summary>
public String FromUserName
{
get { return fromUserName; }
set { fromUserName = value; }
}
private String createTime = String.Empty;
/// <summary>
/// 创建时间
/// </summary>
public String CreateTime
{
get { return createTime; }
set { createTime = value; }
}
private String msgType = String.Empty;
/// <summary>
/// 信息类型 地理位置:location,文本消息:text,消息类型:image
/// </summary>
public String MsgType
{
get { return msgType; }
set { msgType = value; }
}
private String content = String.Empty;
/// <summary>
/// 信息内容
/// </summary>
public String Content
{
get { return content; }
set { content = value; }
}
private String location_X = String.Empty;
/// <summary>
/// 地理位置纬度
/// </summary>
public String Location_X
{
get { return location_X; }
set { location_X = value; }
}
private String location_Y = String.Empty;
/// <summary>
/// 地理位置经度
/// </summary>
public String Location_Y
{
get { return location_Y; }
set { location_Y = value; }
}
private String scale = String.Empty;
/// <summary>
/// 地图缩放大小
/// </summary>
public String Scale
{
get { return scale; }
set { scale = value; }
}
private String mapInfo = String.Empty;
/// <summary>
/// 地理位置信息
/// </summary>
public String MapInfo
{
get { return mapInfo; }
set { mapInfo = value; }
}
private String picUrl = String.Empty;
/// <summary>
/// 图片链接
/// </summary>
public String PicUrl
{
get { return picUrl; }
set { picUrl = value; }
}
}
台州人在杭州 IT交流群 |
416194041 |
欢迎在杭州的台州老乡加入交流!
|
- 微信公众号开发笔记1(nodejs开发的)
本篇记录了微信公众号开发的一些笔记 一.微信服务器与我们服务器的交流 微信开发者拥有自己的服务器,在我们服务器上可以与微信服务器进行交流.既然可以交流,那就必定需要前提条件(微信认证),也就是说,只有 ...
- 微信公众号开发笔记1(nodejs开发)
本篇记录了微信公众号开发的一些笔记 一.微信服务器与我们服务器的交流 微信开发者拥有自己的服务器,在我们服务器上可以与微信服务器进行交流.既然可以交流,那就必定需要前提条件(微信认证),也就是说,只有 ...
- 微信公众号开发笔记-验证token
开发 话不多说我们直接进入主题 我们先去微信公众号申请一个公众号: 申请完成之后我们找到开发下的基本配置 然后找到进行基本配置,我们需要一个url地址来验证,这里的地址必需要是外网,Token是我们任 ...
- 微信公众号开发笔记2(nodejs)
本篇主要记录调用微信各种api和功能实现 一.始于access_token 无论调用微信的什么api,都需要一个查询参数,就是我们每隔1小时或者2小时获取的access_token,笔记1中已经保证了 ...
- 集智robot微信公众号开发笔记
开发流程 公众号基本配置(首先得有公众平台账号) 在开发菜单的基本配置中填写好基本配置项 首先配置服务器地址.Token.和消息加密密钥(地址为开发者为微信验证留的接口.token可以随便填写,只要在 ...
- 微信公众号开发笔记3-sdk接入(nodejs)
另一个2小时 access_token是需要2小时更新一次,在这里,又引入了一个2小时获取一次的字段,这个字段是: jsapi_ticket,这个字段是接入sdk的前提.与access_token类似 ...
- 微信公众号开发笔记1-获取Access Token
获取你的Access Token a)可以采用网址的形式: 用appid和appsecert获得access token,接口为https://api.weixin.qq.com/cgi-bin/to ...
- 微信公众号开发--.net core接入
.net进行微信公众号开发的例子好像比较少,这里做个笔记 首先,我们需要让微信能访问到我们的项目,所以要么需要有一个可以部署项目的连接到公网下的服务器,要么可以通过端口转发将请求转发到我们的项目,总之 ...
- 微信公众号开发(一)--验证服务器地址的Java实现
现在主流上都用php写微信公众号后台,其实作为后端语言之一的java也可以实现. 这篇文章将对验证服务器地址这一步做出实现. 参考资料:1.慕课网-<初识java微信公众号开发>,2.微信 ...
随机推荐
- PHP访问REST API上传文件的解决方案
最近写的一个小功能需要通过rest方式上传文件,因此就在网上找了一些解决方案.接下来说明以下我采用的解决方案:我是利用curl来实现的,其中CURLOPT_POST的值为TRUE代表的是请求类型为PO ...
- [图论]Floyd 算法小结
Floyd 算法小结 By Wine93 2013.11 1. Floyd算法简介 Floyd算法利用动态规划思想可以求出任意2点间的最短路径,时间复杂度为O(n^3),对于稠密图, 效率要高于执行 ...
- ios开发环境 分支语句 、 循环结构(for) 、 循环结构
1 完成命令解析程序 1.1 问题 有命令解析程序,该程序提供三个功能选项供用户选择,用户选择某功能后,程序在界面上输出用户所选择的功能名称.程序的交互效果如图-1所示: 图-1 由上图可以看出,程序 ...
- ci总结
1.创建模型,在模型中加载$this->load->database();2.在模型中写入想实现的功能方法3.在控制器中加载辅助函数和模型,$this->load->model ...
- 计算机硕士工资一览表 08年最新各大IT公司薪水行
编号:1017时间:2016年6月13日11:26:20功能:计算机硕士工资一览表 08年最新各大IT公司薪水行 URL :http://blog.csdn.net/icerock2000/artic ...
- 【avalon】parseData
<div data-a="true" data-b="false" data-d="5" data-e="null" ...
- wddm 部署问题解决
在把wddm部署到一台老的服务上的 windows server 2003 上时遇到了问题,之前也在 windows server 2003 上装过,但是并没有遇到问题,估计和服务器比较老有关系. 问 ...
- Java中生成随机字符的方法总结
package learnExercise; public class RandomCharacter { public static char getRandomCharacter(char ch1 ...
- 使用 Spring Security 保护 Web 应用的安全
安全一直是 Web 应用开发中非常重要的一个方面.从安全的角度来说,需要考虑用户认证和授权两个方面.为 Web 应用增加安全方面的能力并非一件简单的事情,需要考虑不同的认证和授权机制.Spring S ...
- Java继承_接口练习题
1.创建一个名称为StaticDemo的类,并声明一个静态变量和一个普通变量.对变量分别赋予10和5的初始值.在main()方法中输出变量值. 编写代码如下: package org.hanqi.pr ...