微信公众平台开发小记(ASP.NET)
微信的好东西,提供了很大的平台去发挥,公司最近推出微信公众账号,也接触了一些东西, 最终决定用asp.net来开发服务端程序。
微信公众平台的API很简单,利用XML来规范格式,并且所有的数据都在CDATA中,不会担心 转换的问题,所以开发出一个简单的应用确实是很简单的,难得是结合运营把账号做大。
消息接口指南 中介绍了如何成为开发者:网址接入认证、消息推送和消息回复。
网址接入
想要成为开发者,必须要有自己的服务器,所以就需要网址验证,之后微信服务器推送的消息 都会推送到这个链接。
微信服务器会发送GET请求到你所填写的URL,并附带4个参数:
| 参数 | 描述 |
| signature | 微信加密签名 |
| timestamp | 时间戳 |
| nonce | 随机数 |
| echostr | 随机字符串 |
验证的方式为:
加密/校验流程:
1. 将token、timestamp、nonce三个参数进行字典序排序
2. 将三个参数字符串拼接成一个字符串进行sha1加密
3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
代码为:
[code lang="csharp"]
public bool CheckSign(string signature, string timestamp, string nonce)
{
string[] strs = new string[] {token, timestamp, nonce };
Array.Sort(strs);
string strNew = string.Join("", strs);
strNew = FormsAuthentication.HashPasswordForStoringInConfigFile(strNew, "SHA1");
if (signature == strNew.ToLower())
return true;
return false;
}
[/code]
消息推送
即收取微信服务器推送过来的消息,通常是用户发送、用户关注或者取消关注等,服务端程序可以进行相应的处理。消息分为几种类型,每种类型都有特定的格式,有部分节点是通用的,但都需要解析XML。
解析XML有很多种方式,这里我用的是:
[code lang="csharp"]
public Msg LoadXmlToMsg(string xml)
{
Msg msg = null;
XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
XmlElement ele = doc.DocumentElement;
XmlNode node = ele.SelectSingleNode("MsgType");
if (node != null)
{
msg = createSonMsg(node.InnerText);
msg.MsgType = node.InnerText;
}
else
{
return null;
}
msg.ToUserName = ele.SelectSingleNode("ToUserName").InnerText;
msg.FromUserName = ele.SelectSingleNode("FromUserName").InnerText;
msg.CreateTime = ele.SelectSingleNode("CreateTime").InnerText;
msg = msg.LoadXmlToMsg(ele, msg);
return msg;
}
[/code]
消息回复
目前消息回复只有三种:文本、音乐和图文。消息回复其实和XML解析类似,只是要生成对应的XML内容,然后再回复回去。
以文本类型回复为例:
[code lang="csharp"]
public override string createXmlFromMsg(Msg msg)
{
System.Text.StringBuilder sb = new System.Text.StringBuilder();
sb.Append("");
sb.Append("<!--[CDATA[{0}]]-->");
sb.Append("<!--[CDATA[{1}]]-->");
sb.Append("{2}");
sb.Append("<!--[CDATA[text]]-->");
sb.Append("<!--[CDATA[{3}]]-->");
sb.Append("0x0001");
sb.Append("");
string reStr = sb.ToString();
reStr = string.Format(reStr, new string[]{
msg.ToUserName,
msg.FromUserName,
base.ConvertDateTimeInt().ToString(),
((MsgText)msg).Content
});
return reStr;
}
[/code]
微信公众平台开发小记(ASP.NET)的更多相关文章
- Senparc.Weixin.MP SDK 微信公众平台开发教程(三):微信公众平台开发验证
要对接微信公众平台的"开发模式",即对接到自己的网站程序,必须在注册成功之后(见Senparc.Weixin.MP SDK 微信公众平台开发教程(一):微信公众平台注册),等待官方 ...
- Senparc.Weixin.MP SDK 微信公众平台开发教程(四):Hello World
============= 以下写于2013-07-20 ============= 这一篇文章其实可以写在很前面,不过我还是希望开发者们尽多地了解清楚原理之后再下手. 通过上一篇Senparc.W ...
- Senparc.Weixin.MP SDK 微信公众平台开发教程(五):使用Senparc.Weixin.MP SDK
Senparc.Weixin.MP SDK已经涵盖了微信6.x的所有公共API. 整个项目的源代码以及已经编译好的程序集可以在这个项目中获取到:https://github.com/JeffreySu ...
- 微信公众平台开发:Web App开发入门
WebApp与Native App有何区别呢?Native App:1.开发成本非常大.一般使用的开发语言为JAVA.C++.Objective-C.2.更新体验较差.同时也比较麻烦.每一次发布新的版 ...
- 转载收藏之用 - 微信公众平台开发教程(五):使用Senparc.Weixin.MP SDK
Senparc.Weixin.MP SDK已经涵盖了微信5.0的所有公共API,以及2013年10月29日升级之后大部分实用的接口. 整个项目的源代码以及已经编译好的程序集可以在这个项目中获取到:ht ...
- 转载收藏之用 - 微信公众平台开发教程(四):Hello World
这一篇文章其实可以写在很前面,不过我还是希望开发者们尽多地了解清楚原理之后再下手. 通过上一篇Senparc.Weixin.MP SDK 微信公众平台开发教程(三):微信公众平台开发验证,我们已经使微 ...
- 微信公众平台接口,asp.net实现
原文:微信公众平台接口,asp.net实现 我为自己的笑话网开发了一个微信公众平台的接口,在这里分享给大家,希望能对朋友们有帮助,如果有什么地方写的不好,好请大家指点! 首先是要进行认证,认证的时候, ...
- Senparc.Weixin.MP SDK 微信公众平台开发教程(二十二):如何安装 Nuget(dll) 后使用项目源代码调试
最近碰到开发者问:我使用 nuget 安装了 Senparc.Weixin SDK,但是有一些已经封装好的过程想要调试,我又不想直接附加源代码项目,这样就没有办法同步更新了,我应该怎么办? 这其实是一 ...
- Senparc.Weixin.MP SDK 微信公众平台开发教程(十八):Web代理功能
在Senparc.Weixin.dll v4.5.7版本开始,我们提供了Web代理功能,以方便在受限制的局域网内的应用可以顺利调用接口. 有关的修改都在Senparc.Weixin/Utilities ...
随机推荐
- Kerberos KDC not reachable
水贴..我这里出现这个问题的原因是服务器上安装的是 oracle jdk, 但是没有安装 JCE 拓展包. 解决方式有两个: 1. 换成 openJDK 2. 安装上 JCE 拓展包 java 8 ...
- PHP实现选择排序
选择排序: 选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理如下.首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小( ...
- ProgrammingProjectList-文本操作
https://github.com/jobbole/ProgrammingProjectList 逆转字符串——输入一个字符串,将其逆转并输出. package com.zrl.github; im ...
- Windows下的cd命令
http://blog.sina.com.cn/s/blog_5e971b850100rtta.html 首先先了解下什么是驱动器,什么是盘符. 驱动器是指通过系统格式化并带有一个驱动器号的存储区域, ...
- Express使用MongoDB常用操作
const MongoClient = require('mongodb').MongoClient const url = "mongodb://localhost:27017" ...
- 50 years, 50 colors HDU - 1498(最小点覆盖或者说最小顶点匹配)
On Octorber 21st, HDU 50-year-celebration, 50-color balloons floating around the campus, it's so nic ...
- JZYZOJ 1360 [usaco2011feb]人品问题 DP 树状数组 离散化
http://172.20.6.3/Problem_Show.asp?id=1360 好想好写 代码 #include<iostream> #include<cstdio&g ...
- 【MySQL笔记】触发器,存储过程和函数
一.触发器 触发器(TRIGGER):是由事件来触发某个操作.当数据库系统执行这些事件时,就会激活触发器执行相应的操作.MySQL从5.0.2版本开始支持触发器. 触发事件:INSERT语句.UPDA ...
- Python的函数参数和递归参数
位置参数 def power(x): return x*x; 默认参数 指的是在函数定义的时候,就赋予一些参数默认值,在调用这个函数的时候不必多次传入重复的参数值. 如定义一个多次输出同一个年龄阶段和 ...
- MYSQL复习笔记7-索引
Date: 20140207Auth: Jin 索引是根据表中一列或若干列按照一定顺序建立的列值与记录行之间的对应关系表. 索引的主要作用 快速存取数据 保证数据记录的唯一性 实现表与表之间的参照完整 ...