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学习【第7篇】:Python之常用模块2
hashlib,configparser,logging模块 一.常用模块二 hashlib模块 hashlib提供了常见的摘要算法,如md5和sha1等等. 那么什么是摘要算法呢?摘要算法又称为哈希 ...
- 【解题报告】 洛谷 P3492 [POI2009]TAB-Arrays
[解题报告] 洛谷 P3492 [POI2009]TAB-Arrays 这题是我随机跳题的时候跳到的.写完这道题之后,顺便看了一下题解,发现只有一篇题解,所以就在这里顺便写一个解题报告了. 首先当然是 ...
- java web 基本属性
page指令 属性 描述 默认值 language 指定JSP页面使用的脚本语言 java import contenType include指令 taglib注释 <!--我是html注释-- ...
- hdu 5176 The Experience of Love
The Experience of Love Accepts: 11 Submissions: 108 Time Limit: 4000/2000 MS (Java/Others) Memor ...
- 火狐浏览器插件(XPI 文件)签名指南
Symantec,Thawte,GlobalSign 签发的代码签名证书都可以签名火狐浏览器插件(XPI)文件.如果您还没有代码签名证书,请联系易维信(EVTrust)购买火狐代码签名证书. 第 1 ...
- 【Codeforces 385C】Bear and Prime Numbers
[链接] 我是链接,点我呀:) [题意] f[i]表示在x[]中有多少个数字是i的倍数 让你求出sum(f[i]) li<=i<=ri 且i是质数 [题解] 做筛法求素数的时候顺便把素数i ...
- 暑假集训D21总结
考试 今天考了一大圈 不可做 题 本来是爆零的,后来把数据改了一下,成功暴力骗了5分= = 刷题 无限水题$ing$,然后就$GG$了 生活 不开心$ing$,没有啥好写的 今天就是莫名的不开心 歌 ...
- 清北学堂模拟赛d2t5 吃东西(eat)
题目描述一个神秘的村庄里有4家美食店.这四家店分别有A,B,C,D种不同的美食.LYK想在每一家店都吃其中一种美食.每种美食需要吃的时间可能是不一样的.现在给定第1家店A种不同的美食所需要吃的时间a1 ...
- poj 2553强连通+缩点
/*先吐槽下,刚开始没看懂题,以为只能是一个连通图0T0 题意:给你一个有向图,求G图中从v可达的所有点w,也都可以达到v,这样的v称为sink.求这样的v. 解;求强连通+缩点.求所有出度为0的点即 ...
- GPS时间系统概述和世界时系统
6.1 GPS时间系统概述 时间包含"时刻"和"时间间隔"2个概念.所谓时刻,即发生某一现象的瞬间.在天文学和卫星定位中.与所获数据对应的时刻也称为历元.时间 ...