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#微信开发文档的更多相关文章

  1. 微信小程序 开发文档

    官方开发文档: 小程序公众平台 小程序开发者指南 小程序开发者文档 学习资源: 微信:官方入门教程 微信:WeUI 是一套同微信原生视觉体验一致的基础样式库 微信:微信小程序示例 视频: 学堂在线:学 ...

  2. 微信-小程序-开发文档-服务端-模板消息:templateMessage.send

    ylbtech-微信-小程序-开发文档-服务端-模板消息:templateMessage.send 1.返回顶部 1. templateMessage.send 本接口应在服务器端调用,详细说明参见服 ...

  3. 微信-小程序-开发文档-服务端-模板消息:templateMessage.getTemplateList

    ylbtech-微信-小程序-开发文档-服务端-模板消息:templateMessage.getTemplateList 1.返回顶部 1. templateMessage.getTemplateLi ...

  4. 微信-小程序-开发文档-服务端-模板消息:templateMessage.getTemplateLibraryList

    ylbtech-微信-小程序-开发文档-服务端-模板消息:templateMessage.getTemplateLibraryList 1.返回顶部 1. templateMessage.getTem ...

  5. 微信-小程序-开发文档-服务端-模板消息:templateMessage.getTemplateLibraryById

    ylbtech-微信-小程序-开发文档-服务端-模板消息:templateMessage.getTemplateLibraryById 1.返回顶部 1. templateMessage.getTem ...

  6. 微信-小程序-开发文档-服务端-模板消息:templateMessage.deleteTemplate

    ylbtech-微信-小程序-开发文档-服务端-模板消息:templateMessage.deleteTemplate 1.返回顶部 1. templateMessage.deleteTemplate ...

  7. 微信-小程序-开发文档-服务端-模板消息:templateMessage.addTemplate

    ylbtech-微信-小程序-开发文档-服务端-模板消息:templateMessage.addTemplate 1.返回顶部 1. templateMessage.addTemplate 本接口应在 ...

  8. 微信-小程序-开发文档-服务端-接口调用凭证:auth.getAccessToken

    ylbtech-微信-小程序-开发文档-服务端-接口调用凭证:auth.getAccessToken 1.返回顶部 1. auth.getAccessToken 本接口应在服务器端调用,详细说明参见服 ...

  9. .NET6使用DOCFX自动生成开发文档

    本文内容来自我写的开源电子书<WoW C#>,现在正在编写中,可以去WOW-Csharp/学习路径总结.md at master · sogeisetsu/WOW-Csharp (gith ...

随机推荐

  1. PostgreSQL Replication之第十章 配置Slony(6)

    10.6 执行故障切换 一旦您学会了如何复制表并将它们添加到集合中,是时候学习故障转移了.基本上,我们可以在两个两种类型的故障转移之间做出区分: • 计划内故障转移 • 计划外故障转移和崩溃 在本节, ...

  2. zabbix监控企业esxi虚拟机

    zabbix监控企业esxi虚拟机 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我来公司有一段时间了,最近也发现模型部有测试和开发反应某台机器登陆不上去了,结果登陆esxi服务器 ...

  3. 创建Java类并实例化深入理解

    package com.sanguosha.java; import java.util.Scanner;//导入包 public class TestPerson { public static v ...

  4. 查看linux [Fedora] 系统信息

    系统版本: $ /etc/issue Fedora release (Heisenbug)或者$ cat /etc/issue 系统位数: $ getconf LONG_BIT64 内核信息: $ c ...

  5. [转]关于安装hadoop中出现的的 $HADOOP_HOME is deprecated 的解决方法

    当前用户的.bash_profile在/home/用户/下,系统的.bash_profile在/etc/skel目录下; 默认可能是隐藏的:有人会问了,隐藏的我怎么打开它,一个简单的办法,直接使用vi ...

  6. linux第10天 msg消息队列

    cat /proc/sys/kernel/msgmax最大消息长度限制 cat /proc/sys/kernel/msgmnb消息队列总的字节数 cat /proc/sys/kernel/msgmni ...

  7. linux下忘记mysql root密码解决办法

    vi /etc/my.cnf    #编辑文件,找到[mysqld],在下面添加一行skip-grant-tables [mysqld] skip-grant-tables :wq!  #保存退出 s ...

  8. paper 22:kl-divergence(KL散度)实现代码

    这个函数很重要: function KL = kldiv(varValue,pVect1,pVect2,varargin) %KLDIV Kullback-Leibler or Jensen-Shan ...

  9. 夺命雷公狗ThinkPHP项目之----企业网站4之数据库连接

    我们众所周知,我们在开发的时候网站是需要连接上我们的数据库的,毕竟数据库是网站的最核心之一嘛,废话不多说直接开干.... 我们先找到:config.php文件对她进行修改,因为我们网站前后台都用到数据 ...

  10. python函数传参是传值还是传引用?

    首先还是应该科普下函数参数传递机制,传值和传引用是什么意思? 函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题.基本的参数传递机制有两种:值传递和引用传 ...