原文地址:http://www.cnblogs.com/qidian10/p/3492751.html

成为开发者
string[] ArrTmp = { "token",
Request["timestamp"],
Request["nonce"] };
Array.Sort(ArrTmp); //字典排序
string tmpStr = string.Join("", ArrTmp);
tmpStr = FormsAuthentication.HashPasswordForStoringInConfigFile(tmpStr, "SHA1");
tmpStr = tmpStr.ToLower();
if (tmpStr != Request["signature"].ToLower())
{
Response.Write(Request["echostr"]);
}
关注帐号,触发消息,自动应答,事件响应

 

 

namespace ElegantWM.WebUI.Areas.WeiXin.Controllers
{
/// <summary>
/// 微信公共服务类
/// </summary>
public class RobotController : BaseController
{
/// <summary>
/// 接收微信请求接口,认证的接口
/// </summary>
/// <returns></returns>
public ContentResult Index()
{
string result = AnalyzeXmlFromWeiXin();
return Content(result);
} /// <summary>
/// 分析微信POST到本服务器的XML数据
/// </summary>
/// <param name="xmlStream"></param>
/// <returns></returns>
private string AnalyzeXmlFromWeiXin()
{
StreamReader reader = new StreamReader(Request.InputStream);
string xml = reader.ReadToEnd();
//获取MsgType
log.Info(xml);
string msgType = XmlHelper.ReadXmlStr(xml, "/xml/MsgType", "");
switch (msgType)
{
case "event"://如果是事件
return OnAttention(xml);
case "text"://如果是文本消息
return OnReceiveTextMsg(xml);
default:
return "不被支持的关键字!";
}
} /// <summary>
/// 响应文本消息
/// </summary>
/// <param name="xml"></param>
/// <returns></returns>
private string OnReceiveTextMsg(string xml)
{
WxTextMsg msg = XmlEntityExchange<WxTextMsg>.ConvertXml2Entity(xml);
//返回消息,互换收发用户
string toUser = msg.FromUserName;
msg.FromUserName = msg.ToUserName;
msg.ToUserName = toUser; switch (msg.Content.Trim())
{
case "?":
msg.Content = HelpDocument();
break;
case "?":
msg.Content = HelpDocument();
break;
case "1":
msg.Content = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
break;
case "2":
msg.Content = Tools.HttpCrossDomain.Get("http://www.weather.com.cn/data/sk/101210301.html");
break;
case "3":
msg.Content = "来吧,想唠点什么呢? [偷笑]";
break;
case "你是男的女的":
msg.Content = "姑娘一枚 [偷笑]";
break;
default:
msg.Content = "抱歉哦,我不认识您输入的命令。/害羞 /:,@-D";
break;
}
return XmlEntityExchange<WxTextMsg>.ConvertEntity2Xml(msg);
}
/// <summary>
/// 获取帮助菜单文档
/// </summary>
/// <returns></returns>
private string HelpDocument()
{
StringBuilder sb = new StringBuilder();
sb.Append("HI,请回复数字,选择服务").Append("\n\n");
sb.Append("1. 当前时间").Append("\n");
sb.Append("2. 天气信息").Append("\n");
sb.Append("3. 聊天唠嗑").Append("\n");
sb.Append("n. 更多服务开发中...").Append("\n");
sb.Append("回复【?】显示此帮助菜单");
return sb.ToString();
} /// <summary>
/// 当用户关注微信帐号的时候触发,事件响应
/// </summary>
/// <param name="xml"></param>
private string OnAttention(string xml)
{
WxEvent wxevent = XmlEntityExchange<WxEvent>.ConvertXml2Entity(xml);
WxTextMsg msg = new WxTextMsg();
msg.ToUserName = wxevent.FromUserName;
msg.FromUserName = wxevent.ToUserName;
msg.CreateTime = DateTime.Now.Ticks;
msg.MsgType = "text";
//如果是关注,则发送欢迎消息
switch (wxevent.Event)
{
case "subscribe":
msg.Content = System.Configuration.ConfigurationManager.AppSettings["DefaultWxMsg"];
break;
case "CLICK":
msg.Content = "您单击的是:" + wxevent.EventKey;
break;
default:
msg.Content = "暂未处理的事件:Event" + wxevent.Event + ";EventKey:" + wxevent.EventKey;
break;
}
string rst = XmlEntityExchange<WxTextMsg>.ConvertEntity2Xml(msg);
log.Info(rst);
return rst;
}
}
}
辅助类
//实体
public class WxEvent
{
/// <summary>
/// 接收人
/// </summary>
public string ToUserName { get; set; }
/// <summary>
/// 发送人
/// </summary>
public string FromUserName { get; set; }
/// <summary>
/// 时间
/// </summary>
public string CreateTime { get; set; }
/// <summary>
/// 类型
/// </summary>
public string MsgType { get; set; }
/// <summary>
/// 事件
/// </summary>
public string Event { get; set; } public string EventKey { get; set; }
} public class WxTextMsg
{
/// <summary>
/// 接收人
/// </summary>
public string ToUserName { get; set; }
/// <summary>
/// 发送人
/// </summary>
public string FromUserName { get; set; }
/// <summary>
/// 时间
/// </summary>
public long CreateTime { get; set; }
/// <summary>
/// 类型
/// </summary>
public string MsgType { get; set; }
/// <summary>
/// 内容
/// </summary>
public string Content { get; set; }
}
//XML和实体对象间的相互转化
namespace ElegantWM.WebUI.Areas.WeiXin
{
public class XmlEntityExchange<T> where T : new()
{
/// <summary>
/// 将XML转换为对象
/// </summary>
/// <param name="xml"></param>
/// <returns></returns>
public static T ConvertXml2Entity(string xml)
{
XmlDocument doc = new XmlDocument();
PropertyInfo[] propinfos = null;
doc.LoadXml(xml);
XmlNodeList nodelist = doc.SelectNodes("/xml");
T entity = new T();
foreach (XmlNode node in nodelist)
{
//初始化propertyinfo
if (propinfos == null)
{
Type objtype = entity.GetType();
propinfos = objtype.GetProperties();
}
//填充entity类的属性
foreach (PropertyInfo pi in propinfos)
{
XmlNode cnode = node.SelectSingleNode(pi.Name);
pi.SetValue(entity, Convert.ChangeType(cnode.InnerText, pi.PropertyType), null);
}
}
return entity;
} /// <summary>
/// 构造微信消息
/// </summary>
/// <param name="t">对象实体</param>
/// <returns>返回微信消息xml格式</returns>
public static string ConvertEntity2Xml(T t)
{
StringBuilder builder = new StringBuilder();
builder.Append("<xml>");
Type objtype = t.GetType();
//填充entity类的属性
foreach (PropertyInfo pi in objtype.GetProperties())
{
object obj = pi.GetValue(t);
string value = obj == null ? "" : obj.ToString();
if (pi.PropertyType.Name.ToLower() == "int64")
builder.Append("<" + pi.Name + ">" + value + "</" + pi.Name + ">");
else
builder.Append("<" + pi.Name + "><![CDATA[" + value + "]]></" + pi.Name + ">");
}
builder.Append("</xml>");
return builder.ToString();
}
}
}
自定义菜单创建

基础类:http请求

/* *
* Copyright © 2013 CCT All Rights Reserved
* 作者:JackChain
* 时间:2013/8/23 18:21:23
* 功能:跨域访问
* 版本:V1.0
*
* 修改人:
* 修改点:
* */ namespace ElegantWM.Tools
{
public class HttpCrossDomain
{
/// <summary>
/// 跨域访问
/// </summary>
/// <param name="url"></param>
/// <param name="param"></param>
/// <returns></returns>
public static string Post(string url, string param, int time = 60000)
{
Uri address = new Uri(url);
HttpWebRequest request = WebRequest.Create(address) as HttpWebRequest;
request.Method = "POST";
request.ContentType = "application/json;charset=utf-8"; //"application/x-www-form-urlencoded";
request.Timeout = time;
byte[] byteData = UTF8Encoding.UTF8.GetBytes(param == null ? "" : param);
request.ContentLength = byteData.Length;
using (Stream postStream = request.GetRequestStream())
{
postStream.Write(byteData, 0, byteData.Length);
}
string result = "";
using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
{
StreamReader reader = new StreamReader(response.GetResponseStream());
result = reader.ReadToEnd();
}
return (result);
} /// <summary>
/// 跨域访问
/// </summary>
/// <param name="url"></param>
/// <param name="param"></param>
/// <returns></returns>
public static string Get(string url, int time = 60000)
{
Uri address = new Uri(url);
HttpWebRequest request = WebRequest.Create(address) as HttpWebRequest;
request.Method = "GET";
request.ContentType = "application/json;charset=utf-8"; //"application/x-www-form-urlencoded";
request.Timeout = time;
string result = "";
using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
{
StreamReader reader = new StreamReader(response.GetResponseStream());
result = reader.ReadToEnd();
}
return (result);
} }
}

获取Token:

public class CommonController : Controller
{
/// <summary>
/// 获取微信凭证
/// </summary>
/// <returns></returns>
public JsonResult GetWxCredential()
{
string url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}";
url = string.Format(url, ConfigurationManager.AppSettings["AppId"], ConfigurationManager.AppSettings["AppSecret"]);
string rst = HttpCrossDomain.Get(url);
if (rst.Contains("access_token"))
{
string tokenId=rst.Replace("{\"access_token\":\"", "").Replace("\",\"expires_in\":7200}", "");
CacheHelper.CacheInsertAddMinutes("access_token",tokenId,120);
return Json(tokenId, JsonRequestBehavior.AllowGet);
}
else
return Json(rst, JsonRequestBehavior.AllowGet);
}
}

获取和更新菜单

/// <summary>
/// 获取微信菜单
/// </summary>
/// <returns></returns>
public JsonResult Get()
{
string url = "https://api.weixin.qq.com/cgi-bin/menu/get?access_token=";
if (CacheHelper.CacheValue("access_token") != null)
{
url = url + CacheHelper.CacheValue("access_token").ToString();
}
string rst = HttpCrossDomain.Get(url);
return Json(rst,JsonRequestBehavior.AllowGet);
}
/// <summary>
/// 创建Menu
/// </summary>
/// <param name="json"></param>
/// <returns></returns>
[HttpPost]
public JsonResult Create(string json)
{
string url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=";
if (CacheHelper.CacheValue("access_token") != null)
{
url = url+CacheHelper.CacheValue("access_token").ToString();
}
string rst = HttpCrossDomain.Post(url, json);
return Json(rst);
}

(转)C# .net微信开发,开发认证,关注触发消息,自动应答,事件响应,自定义菜单的更多相关文章

  1. C# .net微信开发,开发认证,关注触发消息,自动应答,事件响应,自定义菜单

    成为开发者 string[] ArrTmp = { "token", Request["timestamp"], Request["nonce&quo ...

  2. 微信公众号开发C#系列-7、消息管理-接收事件推送

    1.概述 在微信用户和公众号产生交互的过程中,用户的某些操作会使得微信服务器通过事件推送的形式通知到开发者在开发者中心处设置的服务器地址,从而开发者可以获取到该信息.其中,某些事件推送在发生后,是允许 ...

  3. 使用Java开发微信公众平台(二)——消息的接收与响应

    上一篇文章(http://www.jerehedu.com/fenxiang/171807_for_detail.htm )中,我们学习了使用Java语言开发微信公众平台的第一部分——环境搭建与开发接 ...

  4. 使用Java开发微信公众平台(四)——消息的接收与响应

    上一篇文章(http://www.jerehedu.com/fenxiang/171807_for_detail.htm )中,我们学习了使用Java语言开发微信公众平台的第一部分——环境搭建与开发接 ...

  5. node.js 微信开发2-消息回复、token获取、自定义菜单

    项目结构 >config/wechat.json 微信公众号的配置文件 >controllers/oauth.js 微信网页授权接口(下一篇再细讲讲) >controllers/we ...

  6. 微信公众号php从0开发,包括功能(自定义菜单,分享)

    之前写的一篇微信公众号文章. 工作需要,进行此次调研,并记录开发过程. 开发目的,页面授权,页面获取用户头像,用户昵称 微信id, 分享页面. 微信订阅号 无法获取用户个人信息 写在记录前,公众号也是 ...

  7. 微信公众号开发C#系列-12、微信前端开发利器:WeUI

    1.前言 通过前面系列文章的学习与讲解,相信大家已经对微信的开发有了一个全新的认识.后端基本能够基于盛派的第三方sdk搞定大部分事宜,剩下的就是前端了.关于手机端的浏览器的兼容性问题相信一直是开发者们 ...

  8. 微信程序开发系列教程(四)使用微信API创建公众号自定义菜单

    大家可能经常看到一些微信公众号具有功能强大的自定义菜单,点击之后可以访问很多有用的功能. 这篇教程就教大家如何动手做一做. 这个教程最后实现的效果是:创建一个一级菜单"UI5", ...

  9. 微信自定义菜单errcode(40016)

    最近在做微信开发,通过微信API创建自定义菜单时候出现:{"errcode":40016,"errmsg":"invalid button size ...

随机推荐

  1. Phonegap项目创建 编译 安装 运行

    一.创建 Phonegap项目 1. cd workspace 2.创建phonegap项目 cordova create 目录 识别符 显示名 例如:cordova create hello com ...

  2. CentOS6.5 下Haproxy服务的安装与配置

    参考网站: http://wenku.baidu.com/link?url=57AsCAL8TIv8NC3Vdnpd0hQ4fGNls8RFikjRWna3OaZb6qGHYTdV-4_wQPuzv8 ...

  3. jython研究笔记

    jython目前只支持python2,不支持python3. python中使用第三方包的话需要重新设置lib的地址. public void getHtmlByTxt(String path) { ...

  4. sqlnet.ora限制客户端IP访问

    实现功能: 只允许某几个IP访问数据库服务端(白名单): $ORACLE_HOME/network/admin/sqlnet.ora 添加2个主要参数 TCP.VALIDNODE_CHECKING=y ...

  5. Oracle DSI系列 01 DSI初识BBED

    DSI是Data Server Internals的缩写,是Oracle公司内部用来培训Oracle售后工程师使用的教材. 1 bbed工具使用BBED工具介绍BBED stands for Bloc ...

  6. Repeater使用技巧

    一.在ItemDataBound事件里面动态改变Repeater控件里面的html元素 如: <asp:Repeater ID="Repeater1" runat=" ...

  7. SQOOP 添加oracle 驱动

      我的ORACLE 是11G  ,找到ojdbc6.jar,放到sqoop 的lib 下面,我的是cloudera 集群,目录是 /opt/cloudera/parcels/CDH-5.10.0-1 ...

  8. J2EE Filter中修改request内容

    最近在做一个微信相关的网站,很多地方涉及到微信表情的输入,导致内容无法插入到数据库,虽然有用到一个表情过滤的工具类,但是需要过滤的地方比较多,于是想到在过滤器中过滤用户请求的内容. request这个 ...

  9. uva-10596-欧拉回路

    并不要求所有点都联通,只要出现的所有边能形成欧拉回路就行了 做成有向图的欧拉回路wa成了狗 #include <iostream> #include<memory.h> #in ...

  10. Pthreads 读写锁

    ▶ 使用读写锁来限制同一数据多线程读写.若任何线程拥有读锁,则其他任何请求写锁的线程将阻塞在其写锁函数的调用上:若任何线程拥有写锁,则其他任何请求读锁和写锁的线程将阻塞在其对应的锁函数上,相当于将读与 ...