asp.net微信公众平台开发
http://mp.weixin.qq.com/wiki/index.php?title=%E6%B6%88%E6%81%AF%E6%8E%A5%E5%8F%A3%E6%8C%87%E5%8D%97
微信公众平台接口指南
微信公众平台的开发比较简单,首先是网址接入
公众平台用户提交信息后,微信服务器将发送GET请求到填写的URL上,并且带上四个参数:
参数 | 描述 |
---|---|
signature | 微信加密签名 |
timestamp | 时间戳 |
nonce | 随机数 |
echostr | 随机字符串 |
开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,否则接入失败。
signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
加密/校验流程:
1. 将token、timestamp、nonce三个参数进行字典序排序
2. 将三个参数字符串拼接成一个字符串进行sha1加密
3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
<pre class="csharp" name="code"> /// <summary>
/// 验证签名
/// </summary>
/// <param name="signature"></param>
/// <param name="timestamp"></param>
/// <param name="nonce"></param>
/// <returns></returns>
public static bool CheckSignature(String signature, String timestamp, String nonce)
{
String[] arr = new String[] { token, timestamp, nonce };
// 将token、timestamp、nonce三个参数进行字典序排序
Array.Sort<String>(arr);
StringBuilder content = new StringBuilder();
for (int i = 0; i < arr.Length; i++)
{
content.Append(arr[i]);
}
String tmpStr = SHA1_Encrypt(content.ToString());
// 将sha1加密后的字符串可与signature对比,标识该请求来源于微信
return tmpStr != null ? tmpStr.Equals(signature) : false;
}
/// <summary>
/// 使用缺省密钥给字符串加密
/// </summary>
/// <param name="Source_String"></param>
/// <returns></returns>
public static string SHA1_Encrypt(string Source_String)
{
byte[] StrRes = Encoding.Default.GetBytes(Source_String);
HashAlgorithm iSHA = new SHA1CryptoServiceProvider();
StrRes = iSHA.ComputeHash(StrRes);
StringBuilder EnText = new StringBuilder();
foreach (byte iByte in StrRes)
{
EnText.AppendFormat("{0:x2}", iByte);
}
return EnText.ToString();
}
接入后是消息推送当普通微信用户向公众账号发消息时,微信服务器将POST该消息到填写的URL上。
<pre class="html" name="code"> protected void Page_Load(object sender, EventArgs e)
{
if (Request.HttpMethod.ToUpper() == "GET")
{
// 微信加密签名
string signature = Request.QueryString["signature"];
// 时间戳
string timestamp = Request.QueryString["timestamp"];
// 随机数
string nonce = Request.QueryString["nonce"];
// 随机字符串
string echostr = Request.QueryString["echostr"];
if (WeixinServer.CheckSignature(signature, timestamp, nonce))
{
Response.Write(echostr);
}
}
else if (Request.HttpMethod.ToUpper() == "POST")
{
StreamReader stream = new StreamReader(Request.InputStream);
string xml = stream.ReadToEnd();
processRequest(xml);
}
}
/// <summary>
/// 处理微信发来的请求
/// </summary>
/// <param name="xml"></param>
public void processRequest(String xml)
{
try
{
// xml请求解析
Hashtable requestHT = WeixinServer.ParseXml(xml);
// 发送方帐号(open_id)
string fromUserName = (string)requestHT["FromUserName"];
// 公众帐号
string toUserName = (string)requestHT["ToUserName"];
// 消息类型
string msgType = (string)requestHT["MsgType"];
//文字消息
if (msgType == ReqMsgType.Text)
{
// Response.Write(str);
string content = (string)requestHT["Content"];
if(content=="1")
{
// Response.Write(str);
Response.Write(GetNewsMessage(toUserName, fromUserName));
return;
}
if (content == "2")
{
Response.Write(GetUserBlogMessage(toUserName, fromUserName));
return;
}
if (content == "3")
{
Response.Write(GetGroupMessage(toUserName, fromUserName));
return;
}
if (content == "4")
{
Response.Write(GetWinePartyMessage(toUserName, fromUserName));
return;
}
Response.Write(GetMainMenuMessage(toUserName, fromUserName, "你好,我是vinehoo,"));
}
else if (msgType == ReqMsgType.Event)
{
// 事件类型
String eventType = (string)requestHT["Event"];
// 订阅
if (eventType==ReqEventType.Subscribe)
{
Response.Write(GetMainMenuMessage(toUserName, fromUserName, "谢谢您的关注!,"));
}
// 取消订阅
else if (eventType==ReqEventType.Unsubscribe)
{
// TODO 取消订阅后用户再收不到公众号发送的消息,因此不需要回复消息
}
// 自定义菜单点击事件
else if (eventType==ReqEventType.CLICK)
{
// TODO 自定义菜单权没有开放,暂不处理该类消息
}
}
else if (msgType == ReqMsgType.Location)
{
}
}
catch (Exception e)
{
}
}<PRE class=csharp name="code"> protected void Page_Load(object sender, EventArgs e)
{
if (Request.HttpMethod.ToUpper() == "GET")
{
// 微信加密签名
string signature = Request.QueryString["signature"];
// 时间戳
string timestamp = Request.QueryString["timestamp"];
// 随机数
string nonce = Request.QueryString["nonce"];
// 随机字符串
string echostr = Request.QueryString["echostr"];
if (WeixinServer.CheckSignature(signature, timestamp, nonce))
{
Response.Write(echostr);
}
}
else if (Request.HttpMethod.ToUpper() == "POST")
{
StreamReader stream = new StreamReader(Request.InputStream);
string xml = stream.ReadToEnd();
processRequest(xml);
}
}
/// <summary>
/// 处理微信发来的请求
/// </summary>
/// <param name="xml"></param>
public void processRequest(String xml)
{
try
{
// xml请求解析
Hashtable requestHT = WeixinServer.ParseXml(xml);
// 发送方帐号(open_id)
string fromUserName = (string)requestHT["FromUserName"];
// 公众帐号
string toUserName = (string)requestHT["ToUserName"];
// 消息类型
string msgType = (string)requestHT["MsgType"];
//文字消息
if (msgType == ReqMsgType.Text)
{
// Response.Write(str);
string content = (string)requestHT["Content"];
if(content=="1")
{
// Response.Write(str);
Response.Write(GetNewsMessage(toUserName, fromUserName));
return;
}
if (content == "2")
{
Response.Write(GetUserBlogMessage(toUserName, fromUserName));
return;
}
if (content == "3")
{
Response.Write(GetGroupMessage(toUserName, fromUserName));
return;
}
if (content == "4")
{
Response.Write(GetWinePartyMessage(toUserName, fromUserName));
return;
}
Response.Write(GetMainMenuMessage(toUserName, fromUserName, "你好,我是vinehoo,"));
}
else if (msgType == ReqMsgType.Event)
{
// 事件类型
String eventType = (string)requestHT["Event"];
// 订阅
if (eventType==ReqEventType.Subscribe)
{
Response.Write(GetMainMenuMessage(toUserName, fromUserName, "谢谢您的关注!,"));
}
// 取消订阅
else if (eventType==ReqEventType.Unsubscribe)
{
// TODO 取消订阅后用户再收不到公众号发送的消息,因此不需要回复消息
}
// 自定义菜单点击事件
else if (eventType==ReqEventType.CLICK)
{
// TODO 自定义菜单权没有开放,暂不处理该类消息
}
}
else if (msgType == ReqMsgType.Location)
{
}
}
catch (Exception e)
{
}
}</PRE><BR>
<PRE></PRE>
<BR>
<BR>
asp.net微信公众平台开发相关推荐
- ASP.NET MVC4 微信公众平台开发测试一: 验证
ASP.NET MVC4 微信公众平台开发测试一: 验证 背景,想做一个微信公众号的自动回复系统,于是想动手写一下.记录这些,是一边写程序一边写在这里,也是记录一下自己的思路. 微信公众平台开发时,需 ...
- 转载收藏之用 - 微信公众平台开发教程(三):微信公众平台开发验证
要对接微信公众平台的"开发模式",即对接到自己的网站程序,必须在注册成功之后(见Senparc.Weixin.MP SDK 微信公众平台开发教程(一):微信公众平台注册),等待官方 ...
- 微信公众平台开发的相关问题
1.订阅号与服务号的主要区别是什么? 订阅号每天能群发一条消息,没有自定义菜单及高级接口权限;服务号有自定义菜单及高级接口权限,但每月只能群发一条消息. 2.到底该申请订阅号还是服务号? 申请哪种类型 ...
- 微信公众平台开发解惑
1.订阅号与服务号的主要区别是什么? 订阅号每天能群发一条消息,没有自定义菜单及高级接口权限;服务号有自定义菜单及高级接口权限,但每月只能群发一条消息. 2.到底该申请订阅号还是服务号? 申请哪种类型 ...
- 微信公众平台开发教程第20篇-新手解惑40则
笔者在CSDN博客频道推出微信公众平台开发教程之后,接触了许多公众平台开发爱好者,也帮助他们解决了许多实际的问题,当然这其中有很多问题都是重复的,因此,笔者将这些问题及解答整理出来,以帮助更多初学者少 ...
- 网络架构、云平台和微信公众平台开发接入
云与后端相关的技术似乎并不属于嵌入式和物联智能硬件开发工程师的范畴,但是嵌入式开发工程师有必要认识成熟的网络架构和相关的云技术,以拓展自己在系统架构方面的视野.大数据分析是物联网背后的核心价值,物联智 ...
- [044] 微信公众平台开发教程第20篇-新手解惑40则
笔者在CSDN博客频道推出微信公众平台开发教程之后,接触了许多公众平台开发爱好者,也帮助他们解决了许多实际的问题,当然这其中有很多问题都是重复的,因此,笔者将这些问题及解答整理出来,以帮助更多初学者少 ...
- 微信公众平台开发需要懂哪些技术
在学习微信公众平台开发前,您得了解一个流程,为了更直观,商侣科技整理一些网友提供的流程图. 一.从流程图中很直观可以得出,首先您得懂一门服务器语言,这个语言没有任何限制,可以是asp.net,php, ...
- Senparc.Weixin.MP SDK 微信公众平台开发教程(二十二):如何安装 Nuget(dll) 后使用项目源代码调试...
最近碰到开发者问:我使用 nuget 安装了 Senparc.Weixin SDK,但是有一些已经封装好的过程想要调试,我又不想直接附加源代码项目,这样就没有办法同步更新了,我应该怎么办? 这其实是一 ...
最新文章
- 代码体积减少80%!Taro H5转换与优化升级
- python流程控制语句-4.python流程控制语句介绍
- hc05与单片机连接图_基于proteus的51单片机开发实例(13)-LED指示那个按键被按下
- UML大战需求分析阅读笔记——02
- sysbench 1.0.6 mysql_Sysbench 测试mysql数据库性能(version:sysbench-1.1.0)
- 再谈borland与MS对BUG的不同态度~
- [SHELL]监控LINUX目录文件变化
- 如何修改Windows 7登录界面默认输入法?
- java 数组 concat_JavaScript concat() 方法
- geddy mysql_以ToDoList应用来学习Geddy
- [iOS]UIButton内、外边距设置
- 简单介绍——【汇总统计数据】工具(ArcMap)
- 计算机安全威胁防范,计算机网络安全威胁及防范措施
- 《指弹:周杰伦青花瓷》
- CTFShow web1-7——CTF秀WEB模块解题思路
- 【论文阅读|深读】RolNE: Improving the Quality of Network Embedding with Structural Role Proximity
- SpringMVC学习日志
- 批处理系统脱机使用计算机,1.2.2 脱机输入/输出和批处理系统
- 对编程有着不可磨灭影响——离散数学——图论
- 快速搭建静态网站生成器
热门文章
- Hadoop集群(第10期副刊)_常用MySQL数据库命令
- 《HTML5移动应用开发入门经典》—— 1.6 编写移动网站
- 【组件化开发】前端进阶篇之如何编写可维护可升级的代码
- Mac下搭建Cocos2d-x-3.2的开发环境详解
- Spring的事务管理难点剖析(4):多线程的困惑
- Oracle8的不安全因素及几点说明
- Java中的正则表达式 - Java Regex示例
- MSTP:多生成树实例——应用案列及配置命令(实验)
- arp协议、arp应答出现的原因、arp应答过程、豁免ARP详细解答附图(建议电脑观看)
- C# 使用TcpClient 测试网络连接是否正常