最近因为需要用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#微信公众号的开发——服务配置的更多相关文章

  1. 微信公众号支付开发全过程 --JAVA

    按照惯例,开头总得写点感想 ------------------------------------------------------------------ 业务流程 这个微信官网说的还是很详细的 ...

  2. 到处是坑的微信公众号支付开发(java)

    之前公司项目开发中支付是用阿里的支付做的,那叫一个简单,随意:悲催的是,现在公司开发了微信公众号,所以我步入了全是坑的微信支付开发中... ------------------------------ ...

  3. C#/ASP.NET MVC微信公众号接口开发之从零开发(四) 微信自定义菜单(附源码)

    C#/ASP.NET MVC微信接口开发文章目录: 1.C#/ASP.NET MVC微信公众号接口开发之从零开发(一) 接入微信公众平台 2.C#/ASP.NET MVC微信公众号接口开发之从零开发( ...

  4. JAVA微信公众号网页开发 —— 用户授权获取openid

    官方文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842 HttpClientUtil.java packa ...

  5. C#微信公众号接口开发,灵活利用网页授权、带参数二维码、模板消息,提升用户体验之完成用户绑定个人微信及验证码获取

    一.前言 当下微信公众号几乎已经是每个公司必备的,但是大部分微信公众账号用户体验都欠佳,特别是涉及到用户绑定等,需要用户进行复杂的操作才可以和网站绑定,或者很多公司直接不绑定,而是每次都让用户填写账号 ...

  6. C#/ASP.NET MVC微信公众号接口开发之从零开发(二) 接收微信消息并且解析XML(附源码)

    文章导读: C#微信公众号接口开发之从零开发(一) 接入微信公众平台 微信接入之后,微信通过我们接入的地址进行通信,其中的原理是微信用户发送消息给微信公众账号,微信服务器将消息以xml的形式发送到我们 ...

  7. C#/ASP.NET MVC微信公众号接口开发之从零开发(三)回复消息 (附源码)

    C#/ASP.NET MVC微信接口开发文章目录: 1.C#/ASP.NET MVC微信公众号接口开发之从零开发(一) 接入微信公众平台 2.C#/ASP.NET MVC微信公众号接口开发之从零开发( ...

  8. 微信JS-SDK]微信公众号JS开发之卡券领取功能详解

    js sdk: http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html#.E9.99.84.E5.BD.952-.E6 ...

  9. 使用开源库MAGICODES.WECHAT.SDK进行微信公众号支付开发

    概要 博客使用Word发博,发布后,排版会出现很多问题,敬请谅解.可加群获取原始文档. 本篇主要讲解微信支付的开发流程,相关业务基于MAGICODES.WECHAT.SDK实现.通过本篇教程,您可以很 ...

随机推荐

  1. Django - 一对多创建

    1.新创建一个app python manage.py startapp app01 2.在django的setting.py中,填加新增的app名称 3.在app01的models.py中,添加代码 ...

  2. HDU 3152 Obstacle Course(优先队列,广搜)

    题目 用优先队列优化普通的广搜就可以过了. #include<stdio.h> #include<string.h> #include<algorithm> usi ...

  3. DNS详细解析过程【转】

    转自:http://blog.csdn.net/crazw/article/details/8986504 先说一下DNS的几个基本概念: 一. 根域 就是所谓的“.”,其实我们的网址www.baid ...

  4. [C++] muParser 的简单使用方法

    关于 muParser 库 许多应用程序需要解析数学表达式.该库的主要目的是提供一种快速简便的方法. muParser是一个用C ++编写的可扩展的高性能数学表达式解析器库. 它的工作原理是将数学表达 ...

  5. Linux的安装教程

    CentOS 6 + VMWare: 资源:https://pan.baidu.com/s/1AA4gaMpaoVaMor-tRU-n7A  提取码:6e8r    ( 内附 VMWare 14 激活 ...

  6. Django cookie、session使用

    一.cookie Cookie是key-value结构,类似于一个python中的字典.随着服务器端的响应发送给客户端浏览器.然后客户端浏览器会把Cookie保存起来,当下一次再访问服务器时把Cook ...

  7. Serial Fluent UDF on Windows

    test test Table of Contents 1. Serial UDF on Windows OS 1 Serial UDF on Windows OS Note: Udf has to ...

  8. jdk8--十大新特性

    https://www.cnblogs.com/dennyzhangdd/p/6722445.html 一.十大特性 1.Lambda表达式 2.Stream函数式操作流元素集合 3.接口新增:默认方 ...

  9. (39.4) Spring Boot Shiro权限管理【从零开始学Spring Boot】

    在读此文章之前您还可能需要先了解: (39.1) Spring Boot Shiro权限管理[从零开始学Spring Boot] http://412887952-qq-com.iteye.com/b ...

  10. [HDU3038]How Many Answers Are Wrong(并查集)

    传送门 和某题类似,只不过奇偶换成了和. ——代码 #include <cstdio> #include <iostream> #define N 1000001 int n, ...