微信C# SDK
微信C# SDK
| # | 模块功能 | DLL |
|---|---|---|
| 1 | 基础库 | Senparc.Weixin.dll |
| 2 | 微信公众号 / 微信支付 / JSSDK / 摇周边 / 等等 | Senparc.Weixin.MP.dll |
| 3 | ASP.NET MVC 扩展 | Senparc.Weixin.MP.MVC.dll |
| 4 | 微信企业号 | Senparc.Weixin.QY.dl |
| 5 | 微信开放平台 | Senparc.Weixin.Open.dll |
| 6 | Redis 分布式缓存 | Senparc.Weixin.Cache.Redis.dll |
| 7 | Memcached 分布式缓存 | Senparc.Weixin.Cache.Memcached.dll |
本库为.NET4.5,其他.NET版本请看各自分支。
- 已经支持所有微信6 API,包括自定义菜单/个性化菜单、模板信息接口、素材上传接口、群发接口、多客服接口、支付接口、微小店接口、卡券接口等等。 > (同时由于易信的API目前与微信保持一致,此SDK也可以直接用于易信,如需使用易信的自定义菜单,通用接口改成易信的通讯地址即可)
- 已经支持用户会话上下文(解决服务器无法使用Session处理用户信息的问题)。
- 已经全面支持微信公众号、企业号、开放平台的最新API。
- 已经支持分布式缓存及缓存策略扩展。
目前官方的API都已完美集成,除非有特殊说明,所有升级都会尽量确保向下兼容,所以已经发布的版本请放心使用或直接升级(覆盖)最新的DLLs。
如果需要使用或修改此项目的源代码,建议先Fork。也欢迎将您修改的通用版本Pull Request过来。
资源
- 官网地址:http://weixin.senparc.com/
- 系列教程:http://www.cnblogs.com/szw/archive/2013/05/14/weixin-course-index.html
- 微信技术交流社区:http://www.weiweihi.com/QA
- 自定义菜单在线编辑工具:http://weixin.senparc.com/Menu
- 在线消息测试工具:http://weixin.senparc.com/SimulateTool
- 缓存测试工具:http://weixin.senparc.com/Cache/Test
- chm帮助文档下载:http://weixin.senparc.com/Document
- 技术交流QQ群(目前未满可加:8群/9群,其他群均已满):
1群:300313885,2群:293958349,3群:342319110,4群:372212092
5群:377815480,6群:425898825,7群:482942254,8群:106230270
9群:539061281
业务联系QQ:498977166
新浪微博:@苏震巍
如果这个项目对您有用,我们欢迎各方任何形式的捐助,也包括参与到项目代码更新或意见反馈中来。谢谢!
资金捐助: 进入主页
关注测试账号(SenparcRobot):
微信公众平台开发系列教程:http://www.cnblogs.com/szw/archive/2013/05/14/weixin-course-index.html
项目文件夹说明
| 文件夹 | 说明 |
|---|---|
| Senparc.Weixin.Cache | Senparc.Weixin.Cache.Memcached.dll 、 Senparc.Weixin.Cache.Redis.dll 等分布式缓存扩展方案 |
| Senparc.Weixin.MP.BuildOutPut | 所有最新版本DLL发布文件夹 |
| Senparc.Weixin.MP.MvcExtension | Senparc.Weixin.MP.MvcExtension.dll源码,为MVC4.0项目提供的扩展包。 |
| Senparc.Weixin.MP.Sample | 可以直接发布使用的Demo(ASP.NET MVC 4.0) |
| Senparc.Weixin.MP.Sample.WebForms | 可以直接发布使用的Demo(ASP.NET WebForms) |
| Senparc.Weixin.MP | Senparc.Weixin.MP.dll 微信公众账号SDK源代码 |
| Senparc.Weixin.QY | Senparc.Weixin.QY.dll 微信企业号SDK源代码 |
| Senparc.Weixin.Open | Senparc.Weixin.Open.dll 第三方开放平台SDK源代码 |
| Senparc.Wiexin | 所有Senparc.Weixin.[x].dll 基础类库源代码 |
Senparc.Weixin.MP.Sample中的关键代码说明
注:这是MVC项目,WebForms项目见对应Demo中的Weixin.aspx。
/Controllers/WeixinController.cs
下面的Token需要和微信公众平台后台设置的Token同步,如果经常更换建议写入Web.config等配置文件(实际使用过程中两列建议使用数字+英文大小写改写Token,Token一旦被破解,微信请求将很容易被伪造!):
public readonly string Token = "weixin";
下面这个Action(Get)用于接收并返回微信后台Url的验证结果,无需改动。地址如:http://domain/Weixin或http://domain/Weixin/Index
/// <summary>
/// 微信后台验证地址(使用Get),微信后台的“接口配置信息”的Url填写如:http://weixin.senparc.com/weixin
/// </summary>
[HttpGet]
[ActionName("Index")]
public ActionResult Get(PostModel postModel, string echostr)
{
if (CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, Token))
{
return Content(echostr); //返回随机字符串则表示验证通过
}
else
{
return Content("failed:" + postModel.Signature + ","
+ MP.CheckSignature.GetSignature(postModel.Timestamp, postModel.Nonce, Token) + "。" +
"如果你在浏览器中看到这句话,说明此地址可以被作为微信公众账号后台的Url,请注意保持Token一致。");
}
}
上述方法中的PostModel是一个包括了了Signature、Timestamp、Nonce(由微信服务器通过请求时的Url参数传入),以及AppId、Token、EncodingAESKey等一系列内部敏感的信息(需要自行传入)的实体类,同时也会在后面用到。
下面这个Action(Post)用于接收来自微信服务器的Post请求(通常由用户发起),这里的if必不可少,之前的Get只提供微信后台保存Url时的验证,每次Post必须重新验证,否则很容易伪造请求。
/// <summary>
/// 用户发送消息后,微信平台自动Post一个请求到这里,并等待响应XML
/// </summary>
[HttpPost]
[ActionName("Index")]
public ActionResult Post(PostModel postModel)
{
if (!CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, Token))
{
return Content("参数错误!");
}
...
}
如何处理微信公众账号请求?
Senparc.Weixin.MP提供了2中处理请求的方式,传统方法及使用MessageHandler处理方法(推荐)。上面两个方法在wiki中已经有比较详细的说明,这里简单举例MessageHandler的处理方法。
MessageHandler的处理流程非常简单:
[HttpPost]
[ActionName("Index")]
public ActionResult Post(PostModel postModel)
{
if (!CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, Token))
{
return Content("参数错误!");
} postModel.Token = Token;
postModel.EncodingAESKey = EncodingAESKey;//根据自己后台的设置保持一致
postModel.AppId = AppId;//根据自己后台的设置保持一致 var messageHandler = new CustomMessageHandler(Request.InputStream, postModel);//接收消息(第一步) messageHandler.Execute();//执行微信处理过程(第二步) return new FixWeixinBugWeixinResult(messageHandler);//返回(第三步)
}
整个消息除了postModel的赋值以外,接收(第一步)、处理(第二步)、返回(第三步)分别只需要一行代码。
上述代码中的CustomMessageHandler是一个自定义的类,继承自Senparc.Weixin.MP.MessageHandler.cs。MessageHandler是一个抽象类,包含了执行各种不同请求类型的抽象方法(如文字,语音,位置、图片等等),我们只需要在自己创建的CustomMessageHandler中逐个实现这些方法就可以了。刚建好的CustomMessageHandler.cs如下:
using System;
using System.IO;
using Senparc.Weixin.MP.MessageHandlers;
using Senparc.Weixin.MP.Entities; namespace Senparc.Weixin.MP.Sample.CustomerMessageHandler
{
public class CustomMessageHandler : MessageHandler<MessageContext>
{
public public CustomMessageHandler(Stream inputStream, PostModel postModel, int maxRecordCount = 0)
: base(inputStream, postModel, maxRecordCount)
{ } public override IResponseMessageBase DefaultResponseMessage(IRequestMessageBase requestMessage)
{
//ResponseMessageText也可以是News等其他类型
var responseMessage = CreateResponseMessage<ResponseMessageText>();
responseMessage.Content = "这条消息来自DefaultResponseMessage。";
return responseMessage;
} public override IResponseMessageBase OnTextRequest(RequestMessageText requestMessage)
{
//...
} public override IResponseMessageBase OnVoiceRequest(RequestMessageVoice requestMessage)
{
//...
} //更多没有重写的OnXX方法,将默认返回DefaultResponseMessage中的结果。
....
}
}
其中OnTextRequest、OnVoiceRequest等分别对应了接收文字、语音等不同的请求类型。
比如我们需要对文字类型请求做出回应,只需要完善OnTextRequest方法:
public override IResponseMessageBase OnTextRequest(RequestMessageText requestMessage)
{
//TODO:这里的逻辑可以交给Service处理具体信息,参考OnLocationRequest方法或/Service/LocationSercice.cs
var responseMessage = CreateResponseMessage<ResponseMessageText>();
responseMessage.Content =
string.Format(
"您刚才发送了文字信息:{0}",
requestMessage.Content);
return responseMessage;
}
这样CustomMessageHandler在执行messageHandler.Execute()的时候,如果发现请求信息的类型是文本,会自动调用以上代码,并返回代码中的responseMessage作为返回信息。responseMessage可以是IResponseMessageBase接口下的任何类型(包括文字、新闻、多媒体等格式)。
从v0.4.0开始,MessageHandler增加了对用户会话上下文的支持,用于解决服务器上无法使用Session管理用户会话的缺陷。详见:用户上下文WeixinContext和MessageContext
使用Nuget安装到项目中
如何处理微信公众号请求?
命令:
PM> Install-Package Senparc.Weixin.MP
如何增强 ASP.NET MVC 项目的功能?
Senparc.Weixin.MP.MVC 针对 ASP.NET MVC 项目做了更多的优化,包括便捷的浏览器环境判断、官方 bug 修复等。
Nuget 地址:https://www.nuget.org/packages/Senparc.Weixin.MP.MVC
命令:
PM> Install-Package Senparc.Weixin.MP.MVC
如何处理微信企业号请求?
Senparc.Weixin.QY.dll对企业号相关功能进行了封装,操作过程和微信公众账号SDK(Senparc.Weixin.MP)保持了一致。
命令:
PM> Install-Package Senparc.Weixin.QY
如何处理微开放平台请求?
Senparc.Weixin.Open.dll对目前所有的开放平台API进行了封装,消息处理过程和微信公众账号SDK(Senparc.Weixin.MP)保持了一致,其他一些特殊的消息流程请先阅读官方的文档,然后对照Senparc.Weixin.MP.Sample中有关Open的Demo进行开发。
命令:
PM> Install-Package Senparc.Weixin.Open
如何使用分布式缓存?
Senparc.Weixin SDK 提供了完善的缓存策略接口,默认使用本机缓存实现,同时也提供了 Redis 和 Memcached 两个扩展方案,您也可以根据相同的规则添加自己的缓存策略。
- Redis 缓存扩展包 Nuget 地址:https://www.nuget.org/packages/Senparc.Weixin.Cache.Redis
- 命令:
PM> Install-Package Senparc.Weixin.Senparc.Weixin.Cache.Redis
- Memcached 缓存扩展包 Nuget 地址:https://www.nuget.org/packages/Senparc.Weixin.Cache.Memcached
- 命令:
PM> Install-Package Senparc.Weixin.Senparc.Weixin.Cache.Memcached
已实现功能
微信公众号
- 接收/发送消息(事件)
- 自定义菜单 & 个性化菜单
- OAuth授权
- JSSDK
- 微信支付
- 用户管理
- 素材管理
- 账号管理
- 带参数二维码
- 长链接转短链接接口
- 微信认证事件推送
- 数据统计
- 微信小店
- 微信卡券
- 微信门店
- 微信智能
- 微信设备功能
- 多客服功能
- 微信摇一摇周边
- 微信连WI-FI(未完整)
- 微信扫一扫(商家)
微信开放平台
- 网站应用
- 公众号第三方平台
微信企业号
- 管理通讯录
- 管理素材文件
- 管理企业号应用
- 接收消息与事件
- 发送消息
- 自定义菜单
- 身份验证接口
- JSSDK
- 第三方应用授权
- 企业号授权登陆
- 企业号微信支付
- 企业回话服务
- 企业摇一摇周边
- 企业客服服务
缓存策略
- 策略扩展接口
- 本地缓存
- Redis 扩展包
- Memcached 扩展包
欢迎开发者对未完成或需要补充的模块进行 Pull Request!
微信C# SDK的更多相关文章
- 实战微信JS SDK开发:贺卡制作与播放(1)
前段时间忙于CanTK 2.0的开发,所以博客一直没有更新.CanTK 2.0主要增强了游戏和富媒体的开发,现在编码和测试基本完成了,等文档完成了再正式发布,里面有不少激动人心的功能,等发布时再一一细 ...
- iOS 关于微信检测SDK应用的原理浅析
微信作为一个开放平台,各方面都是做得比较好的,推出了SDK之后,微信与使用了SDK的应用便能进行更多交互.但在iOS平台上,应用间交换数据还是相对麻烦的,那么微信为什么能直接在应用检测到其他使用了SD ...
- 分享 Java微信开发SDK
分享 Java微信开发SDK •发布于 4周前 •作者 朋也 •432 次浏览 •最后一次编辑是 2周前 •来自 分享 给大家分享两个java开发微信公众号的sdk jfinal-weixin ...
- 【转】微信Android SDK示例代码及运行方法
原文网址:http://blog.csdn.net/icyfox_bupt/article/details/23742217 最近在研究微信SDK,无奈网上好使的教程太少,对于程序员来说最好的东西,一 ...
- 微信JS SDK接入的几点注意事项
微信JS SDK接入,主要可以先参考官网说明文档,总结起来有几个步骤: 1.绑定域名:先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”.备注:登录后可在“开发者中心”查看对 ...
- 使用 CocoaPods 给微信集成 SDK 打印收发消息
使用 CocoaPods 给微信集成 SDK 打印收发消息 推荐序 本文介绍的是一套逆向工具,可以在非越狱手机上给任意应用增加插件.在文末的示例中,作者拿微信举例,展示出在微信中打印收发消息的功能. ...
- 开源微信支付SDK
应该有一年多没在博客园上写文章了,毕竟是一个记录自己技术成长的平台,没能将写博客长期坚持下来,说起来也是挺惭愧的.对于自己的近况而言,确实平常加班也比较多,时间会比较压缩,所以到后来博客也基本停止了更 ...
- iOS 微信支付SDK与微信友盟分享两者同时集成时,出现的问题与解决之路。
这两天改版一个旧的APP,要旧貌换新颜,拿到app后进行编译,一直报下面的错误. 报不认识的符号名PayReq错误.奇怪,啥也没动就这样,真不知道给的包是不是本来就是个报错的工程. 不管怎样,要对它修 ...
- 微信js sdk上传多张图片
微信js sdk上传多张图片,微信上传多张图片 该案例已tp3.2商城为例 直接上代码: php代码: public function ind(){ $appid="111111111111 ...
随机推荐
- 用MathType编辑横三角形的方法
如果常常接触数学公式,你会发现同一个符号如果变换方向使用就可以代表不同的数学含义,这是非常常见的一种数学现象了.对于这种情况在数学公式编辑器中,我们可以使用不同的模板来进行编辑.比如横着的三角形符号, ...
- Web前端性能优化教程05:网站样式和脚本
本文是Web前端性能优化系列文章中的第五篇,主要讲述内容:网站样式和脚本代码的放置位置.使用外部javascript和css.完整教程可查看:Web前端性能优化 一.将样式表放在顶部 可视性回馈的重要 ...
- iOS的nil,Null,NSNull的使用
今天做项目时,在数组里面取值时,发现里面有NSNull的对象,然后用数组里面对应的对象赋值时出现各种问题,总是报错.后面经过研究和查资料,总算解决了这一问题. nil用来给对象赋值(Objective ...
- 【windows】跑大型程序时不要休眠和睡眠
win10系统. 为了节能,长时间没有操作操作系统会自动进入休眠模式. 先前设定了"控制面板\硬件和声音\电源选项\编辑计划设置",都设定为"从不",结果不起作 ...
- 【poj2122】 Optimal Milking
http://poj.org/problem?id=2112 (题目链接) 题意 有K个能挤M头奶牛的挤奶机和C头奶牛,告诉一些挤奶机和奶牛间距离,求最优分配方案使最大距离最小. Solution 先 ...
- Linq 101 工具和源码
工具如图: 源码: https://git.oschina.net/yudaming/Linq101
- codevs1138 聪明的质监员
题目描述 Description 小 T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有n 个矿石,从1到n 逐一编号,每个矿石都有自己的重量wi 以及价值vi.检验矿产的流程是:见图 ...
- 网易免费/付费163企业邮smtp服务器地址
免费:smtp.ym.163.com 25/pop.ym.163.com 110 付费:smtp.qiye.163.com 25/pop.qiye.163.com 110
- AngularJs angular.bind、angular.bootstrap、angular.copy
angular.bind 返回一个调用self的函数fn(self代表fn里的this).可以给fn提供参数args(*).这个功能也被称为局部操作,以区别功能. 格式:angular.bind(se ...
- UVA11987Almost Union-Find(并查集删除节点)
题目链接 题意:n个数(即1-n)和m个操作: 1表示把x和y合并,2表示把x移到y集合里面,3表示统计x集合的元素个数 1,3好说,关键是2操作,可以先把2删除掉,删除的操作可以找一个其他的数字来取 ...