C#微信公众号的开发——服务配置
最近因为需要用C#开发微信公众号的一些功能,记录一下开发公众号的一些坑。。。。。
首先先介绍一下,微信公众号的官方文档。虽然这个文档我感觉比较糙,但是还是可以借鉴一下让我们摸着石头过河的。
首先我们得注册一个公众号,配置一下公众号的基本配置。就是将公众号设置成开发者模式,如下图:

下面的服务器配置就是,微信连接你的服务器的地址。比如说:用户发送一个消息,微信会转发到这个服务器地址,以方便开发者监听用户的一些信息做对应的处理。
要配置这个服务器地址,我们先来参考一下公众号的开发文档看看:

根据这个流程图,我们可以知道这个服务需要先验证一下。以下代码是一个包括了处理用户消息以及验证的一个一般处理程序
public void ProcessRequest(HttpContext context)
{
Response.ContentType = "text/plain";
if (Request.HttpMethod.ToLower() == "post")
{//消息处理
using (StreamReader streamReader = new StreamReader(Request.InputStream, Encoding.UTF8))
{
var postString = streamReader.ReadToEnd();
MessageHelper messageHelper = new MessageHelper();
var responseContent = messageHelper.ResponseContent(postString);
Response.ContentEncoding = Encoding.UTF8;
Response.Write(responseContent);
}
}
else
{//验证服务
var signature = Request.QueryString["signature"];
var timestamp = Request.QueryString["timestamp"];
var nonce = Request.QueryString["nonce"];
var echostr = Request.QueryString["echostr"];
var res = WeChatHelper.Check(signature, timestamp, nonce) ? echostr : "Verification passed";
Response.Write(res);
Response.End();
}
}
var res = WeChatHelper.Check(signature, timestamp, nonce) ? echostr : "Verification passed";这一段就是按照微信的文档给出我们处理他的字符串并且返回一个他所需验证的字符串,具体验证代码如下:
/// <summary>
/// 校验signature
/// </summary>
/// <param name="signature"></param>
/// <param name="token"></param>
/// <param name="timestamp"></param>
/// <param name="nonce"></param>
/// <returns></returns>
public static bool Check(string signature, string timestamp, string nonce)
{
string token = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
var sha1 = GetSHA1(String.Join("", new[] { token, timestamp, nonce }.OrderBy(d => d).ToArray()));//.OrderBy(d => d)字典序
return sha1 == signature;
}
这边的token就是你配置服务上面的Token,就是将微信服务所传过来的字符串进行排序之后拼接起来后进行SHA1加密,然后与他传过来的signature进行比较如果相等的话就表示验证通过,否则你配置服务的时候也会报错的。所以配置服务的时候,需要你的服务器地址(比如发布程序后我的一般处理程序的地址),以及Token(就是这边的咱们代码里面的token,这个最好写在配置文件里),随机选一个消息加解密密钥,最后选择一个比较简单的消息加解密方式-明文方式。这时候,咱们的服务器就会与微信服务器之间有个桥梁了,用户的关注,取关,按钮等事件,发消息等都会从微信服务器发送到咱们服务器来,然后我们需要作出对应的返回,就可以抓取用户的一些信息了。先上代码。
/// <summary>
/// 微信消息回复类
/// </summary>
public class MessageHelper
{
/// <summary>
/// 返回消息模板
/// </summary>
private string Message_Text { get { return @"<xml>
<ToUserName><![CDATA[{0}]]></ToUserName>
<FromUserName><![CDATA[{1}]]></FromUserName>
<CreateTime>{2}</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[{3}]]></Content>
</xml>"; } } /// <summary>
/// 多客服回复消息
/// </summary>
private string Message_Customer { get { return @"<xml>
<ToUserName><![CDATA[{0}]]></ToUserName>
<FromUserName><![CDATA[{1}]]></FromUserName>
<CreateTime>{2}</CreateTime>
<MsgType><![CDATA[transfer_customer_service]]></MsgType>
</xml>"; } } public string ResponseContent(string postStr)
{
XmlDocument xdoc = new XmlDocument();
xdoc.LoadXml(postStr);
var responseContent = "success";
XmlNode MsgType = xdoc.SelectSingleNode("/xml/MsgType");
if (MsgType != null)
{
switch (MsgType.InnerText)
{
case "event":
responseContent = EventHandle(xdoc);//事件处理
break;
case "text":
responseContent = TextHandle(xdoc);//接受文本消息处理
break;
default:
break;
}
}
return responseContent;
} private string EventHandle(XmlDocument xdoc) //事件
{
var toUserName = xdoc.SelectNodes("/xml/ToUserName")[0].InnerText;//开发者微信公众号
var openID = xdoc.SelectNodes("/xml/FromUserName")[0].InnerText;//微信用户唯一ID
var eventType = xdoc.SelectNodes("/xml/Event")[0].InnerText;//事件
var eventKey = xdoc.SelectNodes("/xml/EventKey")[0].InnerText;//事件Key
var result = "";
switch (eventType)
{
case "subscribe"://关注事件
string welcomeContent = @"感谢您的关注!绑定xxx账号立刻获取现金!~~~ 如果您已经注册过xxx,请点击<a href='http://www.baidu.com'>快速绑定</a>;如果您还不是我们的会员请点击<a href='http://www.baidu.com'>立即注册</a>。";
result = string.Format(Message_Text, openID, toUserName, ConvertDateTimeInt(DateTime.Now).ToString(), welcomeContent);
break;
case "click"://自定义点击事件
switch (eventKey)
{
case "LianXiKF":
if (DateTime.Now.Hour > 17 || DateTime.Now.Hour < 9)
{
string msg = "您好,感谢您的咨询,人工客服工作时间为 09:00 至 18:00。";
result = string.Format(Message_Text, openID, toUserName, ConvertDateTimeInt(DateTime.Now), msg);
}
else {
result = string.Format(Message_Customer, openID, toUserName, ConvertDateTimeInt(DateTime.Now));
}
break;
default: break;
}
break;
default: break;
}
return result;
} private string TextHandle(XmlDocument xdoc) //文本信息
{
var res = "success";
var content = xdoc.SelectNodes("/xml/Content")[0];
var toUserName = xdoc.SelectNodes("/xml/ToUserName")[0].InnerText;//开发者微信公众号
var openID = xdoc.SelectNodes("/xml/FromUserName")[0].InnerText;//微信用户唯一ID
if (content != null)
{
if (content.InnerText.Contains("您_好"))
{
res = string.Format(Message_Text, openID, toUserName, ConvertDateTimeInt(DateTime.Now), "嗨,您好!");
}
}
return res;
} /// <summary>
/// 将时间转化为Unix时间戳
/// </summary>
/// <param name="time"></param>
/// <returns></returns>
private int ConvertDateTimeInt(DateTime time)
{
DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1));
return (int)(time - startTime).TotalSeconds;
}
}
这段代码是楼主当初初识微信公众所写的代码,里面只包含了关注、点击事件,以及文本消息的自动回复等。但是微信里面还有好多事件,好多语音,图片,视频等消息的处理,咱们可以参考一下文档:

所有的消息发送,事件都遵循着微信的流程图:

以上是微信公众号绑定咱们服务器之间的通信过程,接下来我会把我自己所用到的一些微信公众号的知识来记录下来以便以后少走点弯路。
C#微信公众号的开发——服务配置的更多相关文章
- 微信公众号支付开发全过程 --JAVA
		
按照惯例,开头总得写点感想 ------------------------------------------------------------------ 业务流程 这个微信官网说的还是很详细的 ...
 - 到处是坑的微信公众号支付开发(java)
		
之前公司项目开发中支付是用阿里的支付做的,那叫一个简单,随意:悲催的是,现在公司开发了微信公众号,所以我步入了全是坑的微信支付开发中... ------------------------------ ...
 - C#/ASP.NET MVC微信公众号接口开发之从零开发(四) 微信自定义菜单(附源码)
		
C#/ASP.NET MVC微信接口开发文章目录: 1.C#/ASP.NET MVC微信公众号接口开发之从零开发(一) 接入微信公众平台 2.C#/ASP.NET MVC微信公众号接口开发之从零开发( ...
 - JAVA微信公众号网页开发 —— 用户授权获取openid
		
官方文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842 HttpClientUtil.java packa ...
 - C#微信公众号接口开发,灵活利用网页授权、带参数二维码、模板消息,提升用户体验之完成用户绑定个人微信及验证码获取
		
一.前言 当下微信公众号几乎已经是每个公司必备的,但是大部分微信公众账号用户体验都欠佳,特别是涉及到用户绑定等,需要用户进行复杂的操作才可以和网站绑定,或者很多公司直接不绑定,而是每次都让用户填写账号 ...
 - C#/ASP.NET MVC微信公众号接口开发之从零开发(二) 接收微信消息并且解析XML(附源码)
		
文章导读: C#微信公众号接口开发之从零开发(一) 接入微信公众平台 微信接入之后,微信通过我们接入的地址进行通信,其中的原理是微信用户发送消息给微信公众账号,微信服务器将消息以xml的形式发送到我们 ...
 - C#/ASP.NET MVC微信公众号接口开发之从零开发(三)回复消息 (附源码)
		
C#/ASP.NET MVC微信接口开发文章目录: 1.C#/ASP.NET MVC微信公众号接口开发之从零开发(一) 接入微信公众平台 2.C#/ASP.NET MVC微信公众号接口开发之从零开发( ...
 - 微信JS-SDK]微信公众号JS开发之卡券领取功能详解
		
js sdk: http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html#.E9.99.84.E5.BD.952-.E6 ...
 - 使用开源库MAGICODES.WECHAT.SDK进行微信公众号支付开发
		
概要 博客使用Word发博,发布后,排版会出现很多问题,敬请谅解.可加群获取原始文档. 本篇主要讲解微信支付的开发流程,相关业务基于MAGICODES.WECHAT.SDK实现.通过本篇教程,您可以很 ...
 
随机推荐
- 北京Python开发培训怎么选?
			
北京的地理优势和经济优势基本无需多言,作为全国机会最多的地方,吸引了无数的北漂前赴后继.作为中国互联网中心之一,北京有海量Python岗位正在等待大家淘金. 近几年中,Python一直是市场上最受欢迎 ...
 - Redis防护建议
			
1.Redis本身防护 (1)不要使用默认端口(6379) (2)增加Redis用户名和密码 (3)在Redis绑定指定IP访问(位置配置文件[redis.config]中的bind节点)2.L ...
 - MongoDB主库和从库的数据大小不一致原因判断
			
1. 环境(MongoDB的版本是3.2.16) [root@xxx-mongodb-primary ~]# cat /etc/redhat-release CentOS Linux release ...
 - homework week 1
			
第一周的作业 首先来完成第二个作业, 编写登录接口, 因为视频上并没有相关的教程, 就在网上搜了一下读写文件的语句, 粗略了解. f1 = open("data.txt",&quo ...
 - 3D全景之ThreeJs
			
3D全景之ThreeJs 一.前言 随着H5越来越多的被应用到各个领域,3D也越来越频繁的出现在各个H5案例中,今天我们就来讨论一下3D全景的实现. 据百度百科上介绍:720全景是视角超过人的正常视角 ...
 - zoj  3693
			
#include<stdio.h> #include<string.h>//进位问题如3.985 应该进位3.99 int main() { int n,k,i; ...
 - nyoj  307
			
/*这是一道最短路变形题 从每个有藏宝的地方为起点 求到各个点的可以的最大重量,相当于求出了从出口 到 一个藏宝点 所 允许的最大重量,把所有藏宝点的按重量 排序(从小到大)先到最小的藏宝点带上 宝 ...
 - Spring MVC-集成(Integration)-生成JSON示例(转载实践)
			
以下内容翻译自:https://www.tutorialspoint.com/springmvc/springmvc_json.htm 说明:示例基于Spring MVC 4.1.6. 以下示例显示如 ...
 - POJ 2960
			
也算是一道模板题吧,只需按照SG函数的定义求出每个值的SG,然后异或就可以了. #include <iostream> #include <cstdio> #include & ...
 - [Vue-rx] Access Events from Vue.js Templates as RxJS Streams with domStreams
			
The domStreams component property enables you to access Events from your Vue.js templates as Streams ...