C#微信开发文档
C#微信开发文档
开发前准备
微信公众平台链接:
https://mp.weixin.qq.com/cgi-bin/home?t=home/index&lang=zh_CN
开发初期我们使用测试号测试我们的微信功能,微信提供了测试号申请,它具有大部分我们需要的功能
微信公众平台测试号申请网址:
http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
1:测试号申请申请成功后我们首先要将我们的服务器接入微信接入微信公众平台来进行开发
首先我们配置我们自己的服务器:
I:在本地新建一个项目 ,新建一个页面weixin.aspx
II: 为项目配置主题(不配置服务器会报关于主题配置的错误)
Web.config配置:
<system.web>
<compilation debug="true" />
<pages theme="Blue">
<controls>
</controls>
</pages>
</system.web>
III:在weixin.aspx写点东西测试一下
IV:发布到服务器上 我们使用的服务器为:略 账号:略 密码:略
注意每次修改后 先编译一次再发布
V: 使用浏览器访问我们的页面
这样就可以将我们的服务器接入微信公众平台:
在微信公众平台测试页我们这样配置URL与Token
这里涉及到一个用户. 微信. 服务器的交互问题:
当用户通过微信提交一个消息(事件)时,先提交到腾讯微信的服务器,然后微信服务器将消息组装为xml格式的消息提交给我们的(开发者)服务者器,这样我们就可以解析这样的消息,然后给予用户反馈
当我们在微信公众平台点击提交按钮的时候,这里是微信公众平台与服务器的交互,我们需要在服务器端验证这个微信测试号(原因:微信客户端需要验证服务器地址的有效性),验证代码在weixin.aspx的pageload事件里 这里是因为当我们加载这个页面时第一次就是加载pageload事件,以下是验证代码(在项目中可以看到具体的代码):
string echoStr = Request.QueryString["echoStr"].ToString();
if (!string.IsNullOrEmpty(echoStr))
{
Valid();//校验签名
}
加判断是因为当微信服务器与开发服务器第一次验证服务器有效性时需要执行Valid(),而普通交互时则不需要验证
当微信平台出现如下图所示时表示配置成功。
2:项目开发代码解释
I: 由于在开发微信中的测试比较难,在服务器端加入了一个记事本文档 我们可以将用户与服务器的交互记录在文档中
(这个函数只能在页面中调用)
/// <summary>
/// 写日志(用于跟踪),可以将想打印出的内容计入一个文本文件里面,便于测试
/// </summary>
public static void WriteLog(string strMemo, HttpServerUtility server)
{
string filename = server.MapPath("~") + @"/logs/log.txt";
//string filename = server.MapPath("logs/log.txt");//在网站项目中建立一个文件夹命名logs(然后在文件夹中随便建立一个web页面文件,避免网站在发布到服务器之后看不到预定文件)
if (!Directory.Exists(server.MapPath("~") + @"/logs/"))
Directory.CreateDirectory(server.MapPath("~") + @"/logs/");
StreamWriter sr = null;
try
{
if (!File.Exists(filename))
{
sr = File.CreateText(filename);
}
else
{
sr = File.AppendText(filename);
}
sr.WriteLine(strMemo);
}
catch
{
}
finally
{
if (sr != null)
sr.Close();
}
}
II:weixin.aspx后台代码
PostInput()方法,将传过来的数据流转化为字节数组
Page_Load事件中Response.Write(amgp.resxml);
这句话就是返回给用户的信息(xml格式)
III:messageHelp (获取信息的类)
在构造函数中对信息进行处理
public messageHelp(string weixinXML)
{
XmlDocument doc = new XmlDocument();
doc.LoadXml(weixinXML);//读取XML字符串
XmlNodeList NodeList = doc.FirstChild.ChildNodes;
foreach (XmlNode xn in NodeList)
{
XmlElement xe = (XmlElement)xn;
switch (xe.Name)
{
case "ToUserName": ToUserName = xe.InnerText; break;
case "FromUserName": FromUserName = xe.InnerText; break;//用户的openid
case "CreateTime": CreateTime = xe.InnerText; break;//消息创建时间
case "MsgType": MsgType = xe.InnerText; break;//获取的消息类型
case "MsgId": MsgId = xe.InnerText; break; //获取消息ID
case "Content": TextContent = xe.InnerText; break; //获取文本内容
case "Event": EventType = xe.InnerText; break;//获取事件类型
case "PicUrl": PicUrl = xe.InnerText; break; //获取图片地址
case "EventKey": EventKey = xe.InnerText; break;//获取click事件的键值
case "Latitude": Latitude = xe.InnerText; break;//获取自动上传地理位置 纬度
case "Longitude": Longitude = xe.InnerText; break;//获取自动上传地理位置 经度
case "Location_X": Location_X = xe.InnerText; break;//获取地理位置 纬度
case "Location_Y": Location_Y = xe.InnerText; break;//获取地理位置 经度
default: break;
}
}
对不同的消息类型进行处理:
public void ResponseMsg(string MsgTypeStr)
{
try
{
switch (MsgTypeStr)
{
case "event": resxml = this.ReceiveEvent();
break;
case "text": resxml = this.ReceiveText();
break;
case "location": ; resxml = this.ReceiveLocation();
break;
case "voice": ;
break;
case "video": ;
break;
case "link": ;
break;
case "image": resxml = this.ReceiveImage();
break;
default: resxml = this.ReceiveNothing();
break;
}
}
catch (Exception ex)
{
throw ex;
}
}
具体处理代码我就不在这里粘贴了
补充:时间处理 由于加载消息的xml中时间格式为 时间戳 (定义为从格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数)
所以要转化为北京时间: 代码在 ConvertDateTime()函数
IV:
每个账户都有唯一的appid和appsecret 它们的作用是为了获取access_token的值access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token。正常情况下access_token有效期为7200秒,重复获取将导致上次获取的access_token失效。
公众号可以使用AppID和AppSecret调用本接口来获取access_token。AppID和AppSecret可在开发模式中获得(需要已经成为开发者,且帐号没有异常状态)。注意调用所有微信接口时均需使用https协议。
接口调用请求说明
http请求方式: GET
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
参数说明
|
参数 |
是否必须 |
说明 |
|
grant_type |
是 |
获取access_token填写client_credential |
|
appid |
是 |
第三方用户唯一凭证 |
|
secret |
是 |
第三方用户唯一凭证密钥,既appsecret |
返回说明
正常情况下,微信会返回下述JSON数据包给公众号:
{"access_token":"ACCESS_TOKEN","expires_in":7200}
|
参数 |
说明 |
|
access_token |
获取到的凭证 |
|
expires_in |
凭证有效时间,单位:秒 |
错误时微信会返回错误码等信息,JSON数据包示例如下(该示例为AppID无效错误):
{"errcode":40013,"errmsg":"invalid appid"}
简单一点理解:我们可以获取access_token ,在浏览器中输入我们的https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET(这里的appid和appsecret配置在webconfig中)
出现如图中效果说明可以获取成功
我们的后台代码可以获取到每个节点的值:具体参照GetAccessToken(),GetJsonValue()和RequestUrl()这三个方法
V: 自定义菜单的建立
createMenu.ascx控件的后台代码中实现了建立页面的代码 又在weixin.aspx中引用了这个,这样就实现了菜单的建立
菜单的配置在menu.txt中 配置时注意格式
以下为实例:
{
"button":
[
{
"type":"click",
"name":"今日歌曲",
"key":"今日歌曲"
},
{
"type":"view",
"name":"测试页",
"url":"http://jxedu.ecjtu.jx.cn/weixin/测试页.aspx"
},
{
"name":"菜单",
"sub_button":
[
{
"type":"view",
"name":"搜索",
"url":"http://www.soso.com/"
},
{
"type":"view",
"name":"视频",
"url":"http://v.qq.com/"
},
{
"type":"click",
"name":"查看信息",
"key":"查看信息"
}
]
}
]
}
参数说明
|
参数 |
是否必须 |
说明 |
|
button |
是 |
一级菜单数组,个数应为1~3个 |
|
sub_button |
否 |
二级菜单数组,个数应为1~5个 |
|
type |
是 |
菜单的响应动作类型,目前有click、view两种类型 |
|
name |
是 |
菜单标题,不超过16个字节,子菜单不超过40个字节 |
|
key |
click类型必须 |
菜单KEY值,用于消息接口推送,不超过128字节 |
|
url |
view类型必须 |
网页链接,用户点击菜单可打开链接,不超过256字节 |
C#微信开发文档的更多相关文章
- 微信小程序 开发文档
官方开发文档: 小程序公众平台 小程序开发者指南 小程序开发者文档 学习资源: 微信:官方入门教程 微信:WeUI 是一套同微信原生视觉体验一致的基础样式库 微信:微信小程序示例 视频: 学堂在线:学 ...
- 微信-小程序-开发文档-服务端-模板消息:templateMessage.send
ylbtech-微信-小程序-开发文档-服务端-模板消息:templateMessage.send 1.返回顶部 1. templateMessage.send 本接口应在服务器端调用,详细说明参见服 ...
- 微信-小程序-开发文档-服务端-模板消息:templateMessage.getTemplateList
ylbtech-微信-小程序-开发文档-服务端-模板消息:templateMessage.getTemplateList 1.返回顶部 1. templateMessage.getTemplateLi ...
- 微信-小程序-开发文档-服务端-模板消息:templateMessage.getTemplateLibraryList
ylbtech-微信-小程序-开发文档-服务端-模板消息:templateMessage.getTemplateLibraryList 1.返回顶部 1. templateMessage.getTem ...
- 微信-小程序-开发文档-服务端-模板消息:templateMessage.getTemplateLibraryById
ylbtech-微信-小程序-开发文档-服务端-模板消息:templateMessage.getTemplateLibraryById 1.返回顶部 1. templateMessage.getTem ...
- 微信-小程序-开发文档-服务端-模板消息:templateMessage.deleteTemplate
ylbtech-微信-小程序-开发文档-服务端-模板消息:templateMessage.deleteTemplate 1.返回顶部 1. templateMessage.deleteTemplate ...
- 微信-小程序-开发文档-服务端-模板消息:templateMessage.addTemplate
ylbtech-微信-小程序-开发文档-服务端-模板消息:templateMessage.addTemplate 1.返回顶部 1. templateMessage.addTemplate 本接口应在 ...
- 微信-小程序-开发文档-服务端-接口调用凭证:auth.getAccessToken
ylbtech-微信-小程序-开发文档-服务端-接口调用凭证:auth.getAccessToken 1.返回顶部 1. auth.getAccessToken 本接口应在服务器端调用,详细说明参见服 ...
- .NET6使用DOCFX自动生成开发文档
本文内容来自我写的开源电子书<WoW C#>,现在正在编写中,可以去WOW-Csharp/学习路径总结.md at master · sogeisetsu/WOW-Csharp (gith ...
随机推荐
- Effective C++ 2.构造 析构 赋值运算
//条款07:为多态基类声明virtual析构函数 // 1.若基类的析构函数不定义为虚函数,由于基类的指针或引用可以指向派生类的对象,则在删除基类对象的时候可能会出错,导致破坏数据结构. // 2. ...
- SQL 数据库备、还,附、分,数据查询,聚合函数
认识数据库备份和事务日志备份 数据库备份与日志备份是数据库维护的日常工作,备份的目的是在于当数据库出现故障或者遭到破坏时可以根据备份的数据库及事务日志文件还原到最近的时间点将损失降到最低点. 数据库备 ...
- 体验Java的封装性
package com.cnblogs.java; //体验Java的封装性 /* * 如下的人类年龄赋值-300岁,显然很不合理,这种直接对类的属性赋值,有时候虽然不合理但却会编译通过. * 所以我 ...
- 转:MIME(Multipurpose Internet Mail Extensions)类型
MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型.是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器 ...
- [原创] hadoop学习笔记:hadoopWEB监控
笔者安装单机版本 要想实现hadoopweb页面的监控,需要解决以下几个问题 1.关闭linux的防火墙:#service iptables stop 2.将linuxSE设置为disabled:#v ...
- ArcGIS Engine中加载数据
ArcGIS Engine中加载数据 http://blog.csdn.net/gisstar/article/details/4206822 分类: AE开发积累2009-05-21 16:49 ...
- 夺命雷公狗ThinkPHP项目之----企业网站17之网站配置页的添加
为了网站可以智能一点,所以我们开始来写一个网站配置的功能.. 所以我来写他的数据表: 先来完成他的添加功能,页面效果如下所示: lists.html代码如下所示: <!doctype html& ...
- 嵌套错误Inline markup blocks (@<p>Content</p>) cannot be nested. Only one level of inline markup is allowed
例子: @{Html.Telerik().Splitter().Name("MainSplitter") .Orientation(SplitterOrientation.Vert ...
- java总结第三次//类和对象2、3
四.类和对象2 主要内容:Java类的继承.方法的重写.覆盖.访问控制.super 关键字.多态性及其应用 1.继承 要求:Java只支持单继承,不允许多重继承 一个子类只能有一个父类 一个父类可以派 ...
- 电脑远程工具:mstsc
外网远程控制:电脑远程连接在开始程序中搜:mstsc 然后直接敲IP地址 工具:dell sonicwall netextender.exe mstsc.exe 内网远程控制:使用TeamVi ...