C#微信公众平台账号开发真正给初学者的文章

微信越来越受到大众人群的喜爱,但是对于开发人员来说刚接触肯能还是一头雾水的,比如像我,看了三四天文档感觉要吐,但是程序还是要写知识还是要学。发现了一个比较适合初学者的文章送给大家,废话到此:(转贴吧)
C#开发公众平台,需要在官网mp.weixin.qq.com注册一个账号,审核通过后,就可以开始了。
第一步,

点开高级功能,关闭弱智的编辑模式,打开高级的开发模式。
第二部,


入开发模式,填写接口配置信息。这里也是刚开始困扰我的地方。URL就是服务器地址,刚开始想用自己电脑做服务器,让微信服务器访问,但是我是在内网里,
路由器权限也没有,无法端口映射到自己电脑,所以只好网上买了一个服务器空间,一年不到200的那种,空间只有100M,数据库50M。但是够用了。
Token是验证用的令牌,随便填一个字符串,但是要记住。程序里也要用这个Token字符串来验证是否微信服务器发来请求。不然别人可以模拟请求,伪造信息。
填好后,还不能通过验证,因为你没写代码。微信服务器访问你的时候,无法获取结果,自然不能通过验证。
服务器地址填写后,微信服务器会提交get请求,访问你的URL并且带上4个参数。
1,signature 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
2,timestamp 时间戳
3,nonce 随机数
4,echostr 随机字符串
他的signature加密方式为
1. 将token、timestamp、nonce三个参数进行字典序排序2. 将三个参数字符串拼接成一个字符串进行sha1加密3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信

过这些介绍,我们就可以开始在默认页面那里:比如Default.aspx.cs写page_load事件,获取4个参数,按加密算法,获得
signature结果,再对比微信发过来的signature,相同,原样输出echostr。这样,就能通过微信服务器验证。以后每次收到消息后,微
信就会发送消息到服务器,服务器经过处理后,就可以回复一定的内容给发送过来的那个人消息。
目前我自己只是简单的实现了天气预报和翻译功能。

下面详细介绍如何通过代码,来通过刚才的url接口配置。
ASP.NET DEFAULT.ASPX页面的page_load事件里。
首先获取四个参数。
string signature = Request["signature"];
string timestamp = Request["timestamp"];
string nonce = Request["nonce"];
string echostr = Request["echostr"];
按照前面说的加密过程,获得加密结果。
var arr = new[] { token, timestamp, nonce }.OrderBy(z => z).ToArray();
var arrString = string.Join("", arr);
var sha1 = System.Security.Cryptography.SHA1.Create();
var sha1Arr = sha1.ComputeHash(Encoding.UTF8.GetBytes(arrString));
StringBuilder enText = new StringBuilder();
foreach (var b in sha1Arr)
{
enText.AppendFormat("{0:x2}", b);
}
对比,
if( enText.ToString() == signature )
{
Response.Output.Write(echostr);
}
这样,就完成了简单的一步验证。微信就能通过校验,以后所有信息都会发到你填写的这个url服务器上去了。
校验完后,以后的消息都是post请求你的服务器。请求里包含一段xml数据。xml数据里包含了用户发过来的数据,和这个用户的openid.你获取了这些信息后,就可以发送自动回复的内容,发给这个openid的用户。

只要某个用户发过来一个消息,微信服务器就会发送一个post请求到你填写的服务器url上,然后每次都会触发page_load事件。接收用户信息,和处理要回复的内容,都在page_load里。
if (Request.HttpMethod == "POST")
{
string weixin = "";//获取xml数据
weixin = PostInput();//自定义方法,获取xml数据
if (!string.IsNullOrEmpty(weixin))
{
ResponseMsg(weixin);//根据获取的内容,自动回复一定的内容。
}
}
这样,我们的微信功能就完成了。教程到此结束。。。。。。是不可能的。
先讲postinput方法,
private string PostInput()/// 获取post请求数据
{
Stream s = System.Web.HttpContext.Current.Request.InputStream;
byte[] b = new byte[s.Length];
s.Read(b, 0, (int)s.Length);
return Encoding.UTF8.GetString(b);
}
四行代码,就获取了xml数据。asp.net很少用,所以不知道有没有更好的方法。
然后就是最重要的ResponseMsg方法了。上源码。
private void ResponseMsg(string weixin)// 服务器响应微信请求
{
XmlDocument doc = new XmlDocument();
doc.LoadXml(weixin);//读取xml字符串
XmlElement root = doc.DocumentElement;
XmlNode MsgType = root.SelectSingleNode("MsgType");//获取收到的消息类型。文本(text),图片(image),语音等。
string messageType = MsgType.InnerText;
try
{
switch (messageType)
{
case "text":
WriteContent(ResponseText.GetResponseMessage(weixin));
break;
case "image":

break;
case "voice":
break;
case "vedio":
break;
case "location":
break;
case "link":
break;
default:
break;
}
Response.End();
}
catch (Exception)
{

}
}
其实前面讲的都不重要。重要的是分支语句,
switch (messageType)
{
case "text":
Response.Output.Write(ResponseText.GetResponseMessage(weixin));
break;
就是如果用户发过来的是文本请求,调用ResponseText.GetResponseMessage()方法。
这个方法里,就是根据具体的文本关键字,经过处理,设置自动回复的内容。

只有一个自动回复的方法没讲。直接贴源码了。在代码里注释着讲。
public static string GetResponseMessage(string weixin)
{
XmlDocument doc = new XmlDocument();
doc.LoadXml(weixin);//读取xml字符串
XmlElement root = doc.DocumentElement;
string message = "对不起,无法识别您发送的命令。请发送“帮助”来获取已经实现的功能。";
string resxml = "";
var model = new
{
ToUserName = root.SelectSingleNode("ToUserName").InnerText,//本公众账号
FromUserName = root.SelectSingleNode("FromUserName").InnerText,//用户
CreateTime = root.SelectSingleNode("CreateTime").InnerText,//创建时间
Content = root.SelectSingleNode("Content").InnerText,//消息内容
MsgId = root.SelectSingleNode("MsgId").InnerText//消息ID,64位整型
};//获取xml数据里各个结点的内容。
MySQL sql = new MySQL();//这里是我记录用户发送的内容到数据库的,不写也没事。
string str_insert = "insert into ChatRecord values(‘" +
model.FromUserName + "‘,‘" + model.Content + "‘,‘" +
DateTime.Now.ToString().Substring(2) + "‘)";
if (sql.ExecuteCommand(str_insert) < 0)//插入失败,记录日志
{
StreamWriter sw = new
StreamWriter(HttpContext.Current.Request.PhysicalApplicationPath +
"/Log/log.txt", true, Encoding.UTF8);

sw.WriteLine(DateTime.Now.ToString().Substring(2) + ": 插入ChatRecord表失败["
+ model.FromUserName + "----" + model.Content + "]");
sw.Close();
}

//这里就是关键的设置自动回复的内容。回复的格式,要按照官方提供的来填写,也是一段xml数据。具体格式,注册了微信公众平台账号后,看API文档就
有了。这里稍微简单的介绍一下。ToUserName,就是刚才发过来的那个用户的openid,fromusername一般就是我们的公众账号。
CREATETIME就是一个整型时间,unix格式的,转成距离1970年1月1日0点0分有多少秒就行了。MsgType就是回复的类型。你可以回复
图片,新闻链接,语音,视频,音乐等。这里我们是文本,所以是text。content就是自动回复的内容。funcflag不管,填写0.

resxml += "<xml><ToUserName><![CDATA[" +
model.FromUserName +
"]]></ToUserName><FromUserName><![CDATA[";

resxml += model.ToUserName +
"]]></FromUserName><CreateTime>" +
MyAPI.ConvertDateTimeInt(DateTime.Now) + "</CreateTime>";
////////////////////////////////////已实现功能////////////////////已实现功能//////////////////////////////////////////////
//这里如果对方发过来“帮助”,我们设置常量文本(暂时这么叫。。),自动回复给用户。
if (model.Content == "帮助")
{
message = "目前实现功能有:" + CRLF + "1,帮助:获取发送命令菜单" + CRLF;
message += "2,翻译功能。只要发送“翻译”+空格+需要翻译的内容,即可实现翻译功能。" + CRLF;
message += "3,天气预报。发送 “天气”+空格+城市名 ,即可查询该城市6天内天气预报。如发送“天气 北京”。" + CRLF;
}
//
这里。如果是“翻译+空格+词语”,我们就调用百度翻译API,获取翻译结果后,再发给用户。关于这些内容,就不在教程的范围里了。种类太多,毕竟你有可
能要操作数据库,请求别的网站,等等各种各种的功能。发送“笑话”,“鬼故事”等等,查数据库也可以,请求别的网站也可以。这里实现方法就不在这个地方讲
拉。我也不是很清楚。查了很多资料,才实现了翻译。
else if (model.Content.Trim().StartsWith("翻译 "))
{
string str = model.Content.Trim().Substring(3);
MyAPI api = new MyAPI();
MyJSON json = new MyJSON();
BaiDuFanYiResult obj = json.FromJson<BaiDuFanYiResult>(api.BaiduTanslate(str, "auto", "auto"));
message = obj.trans_result[0].dst;
}
//这里是天气预报。用户发“天气+空格+城市”,
else if (model.Content.Trim().StartsWith("天气 "))
{
string str = model.Content.Trim().Substring(3);
MyAPI api = new MyAPI();
MyJSON json = new MyJSON();
string strjson = api.WeatherReport(str);
if (strjson.Length < 10)
{
message = "对不起,找不到[" + str + "]的天气,请正确输入城市名字,如果城市确实存在,请发送“BUG 城市名”提交BUG";
resxml +=
"<MsgType><![CDATA[text]]></MsgType><Content><![CDATA["
+ message +
"]]></Content><FuncFlag>0</FuncFlag></xml>";
return resxml;
}
RootObject report = json.FromJson<RootObject>(strjson);
message = "今天: " + report.weatherinfo.temp1 + ", " + report.weatherinfo.weather1 + CRLF;
message += "明天开始接下来5天天气预报如下:" + CRLF;
message += report.weatherinfo.temp2 + ", " + report.weatherinfo.weather2 + CRLF;
message += report.weatherinfo.temp3 + ", " + report.weatherinfo.weather3 + CRLF;
message += report.weatherinfo.temp4 + ", " + report.weatherinfo.weather4 + CRLF;
message += report.weatherinfo.temp5 + ", " + report.weatherinfo.weather5 + CRLF;
message += report.weatherinfo.temp6 + ", " + report.weatherinfo.weather6 + CRLF;
message += report.weatherinfo.index_d;
}
else if (model.Content.Trim().StartsWith(""))
{

}
//这里本来是想写个在线的纯文字(可以带图片)的在线多人RPG游戏。。。暂时还没开始。。个人能力问题。
else if (model.Content.Trim().StartsWith("游戏 "))
{
string gamename = model.Content.Trim().Substring(3);
message = Game.GetBackground(gamename);
}
else
{
message = "对不起,无法识别您发送的命令。请发送“帮助”来获取已经实现的功能。";
}
resxml +=
"<MsgType><![CDATA[text]]></MsgType><Content><![CDATA["
+ message +
"]]></Content><FuncFlag>0</FuncFlag></xml>";
return resxml;//回复内容有了哦。基本实现了
}
还有其他更多的接口,比如发过来图片,语音,音乐,视频等等,还可以获取用户信息,用户地理位置,等等。这里应该又可以想出不少的功能。

时间: 2024-10-25 12:53:06

C#微信公众平台账号开发真正给初学者的文章的相关文章

【课程分享】深入浅出微信公众平台实战开发(微网站、LBS云、Api接口调用、服务号高级接口)

深入浅出微信公众平台实战开发(微网站.LBS云.Api接口调用.服务号高级接口) 课程下载地址:链接:http://pan.baidu.com/share/link?shareid=2214724072&uk=3611155194 密码:glvc 一.本课程是怎么样的一门课程(全面介绍) 1.1.课程的背景 微信公众平台的火热程度已经不用多言,无论是个人还是企业,政府还是商家,都已经开始搭建微信公众平台,微信的作用已经被各界人士认可.微信公众平台的技术需求市场缺口巨大. 1.2.课程内容简介 本

微信公众平台深度开发JAVA版第二季视频教程

微信公众平台深度开发JAVA版第二季(九宝饭店微信点餐系统)视频教程下载密码:qa4a     联系QQ:1026270010 微信作为当前流行的通信社交软件有了上亿的用户量,几乎每一个只能手机都要安装微信.但是,市场上对于JAVA开发微信公众平台的资料却少之又少,多数的资料一般是其他语言的.因此,主讲老师经过潜心研究.认真准备,录制了这套针对JAVA开发语言的微信公众平台开发教程. 1.课程研发环境 开发语言:JAVA WEBServer:TOMAT DATABASE:MySQL 开发工具:m

微名汇-微信公众平台功能开发(微信聊天机器人)

因为现在小黄鸡智能聊天机器人接口能免费试用7天,7天之后会收费这对于很多用户来说感觉不划算.所以我找了另一个接口:小i机器人,并且完全免费.本文介绍如何在微信公众平台中使用小i智能聊天api接口开发智能聊天机器人. 小i机器人是全球用户量最大的中文聊天机器人,最早在MSN上出现,后拓展到QQ.短信.网页等交互平台上,拥有超过1亿的用户.2012年2月,小i机器人整合了自然语音识别功能,并陆续发布了智能手机.智能电视以及电话上的语音交互版本. 小i机器人申请地址为http://cloud.xiao

微信公众平台网页开发实战--1.微信分享一个网页到朋友圈

对微信的JSSDK进行封装一下,创建一份类似的文件结构,增加index.html与shareApi.js文件,结构如图3.3所示. 图3.3  3.2节文件结构 另外,提醒读者一下,wxJSSDK.js文件的JSSDK环境配置中,需要更改一下配置参数,代码如下: 01 jsApiList: [ // 其他代码略 02 "onMenuShareTimeline", 03 "onMenuShareAppMessage", 04 "onMenuShareQQ&q

微信公众平台网页开发实战--2.从手机相册中选照片然后分享

通过对需求的了解,可以将其分解为: (1)微信端手机用户,可以使用微信的JSSDK. (2)选取图片,使用JSSDK的“chooseImage”,由于分享图片时本地地址无法分享,因此还需要JSSDK的“uploadImage”. (3)分享到朋友圈,需要JSSDK的“onMenuShareTimeline”. 综合起来,业务逻辑如图4.5所示. 图4.5  业务逻辑结构图 首先将JSSDK的环境复制一份到本节目录下,创建index.html文件.imageSharing.js文件,目录结构如图4

微信公众平台网页开发实战--3.利用JSSDK在网页中获取地理位置(HTML5+jQuery)

复制一份JSSDK环境,创建一份index.html文件,结构如图7.1所示. 图7.1  7.1节文件结构 在location.js中,封装“getLocation”接口,如下: 01 wxJSSDK.location = function(locationApi){ 02 if(wxJSSDK.isReady){ //wxJSSDK.isReady 查看微信JSSDK是否初始化完毕 03 if(locationApi){ 04 locationApi.getLocation && wx

微信公众平台功能开发(生成带参数的二维码)

为了满足用户渠道推广分析的需要,公众平台提供了生成带参数二维码的接口.使用该接口可以获得多个带不同场景值的二维码,用户扫描后,公众号可以接收到事件推送. 目前有2种类型的二维码,分别是临时二维码和永久二维码,前者有过期时间,最大为1800秒,但能够生成较多数量,后者无过期时间,数量较少(目前参数只支持1--100000).两种二维码分别适用于帐号绑定.用户来源统计等场景. 用户扫描带场景值二维码时,可能推送以下两种事件: 如果用户还未关注公众号,则用户可以关注公众号,关注后微信会将带场景值关注事

微名汇-微信公众平台功能开发(天气查询)

在这篇教程中,我们将介绍如何在微信公众平台上开发天气预报功能.我们将使用中国天气网的气象数据接口来获取天气信息 这篇教程将介绍以下内容: 获取中国天气网的气象数据 在微信公众平台中回复天气 微名汇:http://weixin.zgtuango.com 联系QQ:44653139 一.中国天气网 中国天气网提供了丰富的气象数据接口.下面我们介绍主要的几个: 国家根节点接口: http://flash.weather.com.cn/wmaps/xml/china.xml 该接口以XML格式列出所有的

【课程分享】ASP.NET MVC5&amp;amp;微信公众平台整合开发实战(响应式布局、JQuery Mobile,Windows Azure、微信核心开发)

对这个课程有兴趣的,能够联系我QQ2748165793 基础知识储备 ASP.NET MVC 5基础(6讲) 第一讲-初识ASP.NET MVC并搭建整合开发环境 第二讲-深入MVC开发模式 第三讲-C#核心语言特性 第四讲-C#核心语言特性(二) 第五讲-视图引擎Razor 第六讲-MVC核心工具 实战演练(11讲) 第七讲-体育商店(一):项目架构 第八讲-体育商店(二):数据库创建和訪问 第九讲-体育商店(三):分页和样式 第十讲-体育商店(四):布局和导航 第十一讲-体育商店(五):购物