这个项目是在实际开发中逐渐完善的,开发过程基于ASP.Net Core 1.1,实际生成会兼容Net4.5。
写有完善的代码提示,怎么用就不多做解释了,引用好实例中的命名空间基本上就可以通过智能提示了解到具体的方法调用参数和用途,你也可以通过【对象浏览器】查看所有的扩展方法。
新建项目,ASP.Net Core、ASP.Net MVC 和 ASP.Net Api 都是可以的,都有扩展。另外,亦可使用Request作为入口,调用扩展方法GetBodyXml()即可。
示例给的是Api版本,各种入口都没多大区别,MVC 的 Controller 扩展了 this.WeChatResponse 的方法返回 带ContentType 为 text/xml 标头的 ActionResult 而已,不这样回复微信服务器也是可以正常接受返回的。
使用的第一步就是在 NuGet包管理器 下载包,搜索 OYMLCN 找 OYMLCN.WeChat ,下载安装到项目即可。
using System.Web.Http; using OYMLCN; using OYMLCN.WeChat; using OYMLCN.WeChat.Model; using System; namespace DemoWeChatProject.Controllers { public class ValuesController : ApiController { // 配置信息 微信号是可选的,仅当需要调用客服管理接口时需要用到 protected OYMLCN.WeChat.Config config = new Config("appid", "appSecret", "token", "aes", "微信号"); public string Get() { // 处理微信接口Token有效性验证 return this.CheckSignature(config); } // 微信消息请求基本处理形式 // MVC中的Controller处理方式也是一样的 // 直接通过扩展方法调用 public string Post() { // 获取微信浏览器类型 this.WhichWeChatBrowser(); // 通过检查签名确认是否是微信请求 if (this.IsWeChatRequest(config)) { // 转换微信请求的内容 var xml = this.GetBodyXml(); // 获取消息类型 switch (xml.GetMsgType()) { case RequestMsgType.Text: // 将消息转为文本消息操作类型 var text = xml.ToRequestMessageText(); // 直接从消息返回信息 return text.ResponseText("您的消息是:{0}", text.Content).Result; case RequestMsgType.Event: // 获取事件类型 switch (xml.GetEventType()) { // 以中文命名是方便查阅 case RequestEventType.a点击自定义菜单: // 将菜单点击消息转换为操作类型 var menuMsg = xml.ToEventMessage点击自定义菜单(); switch (menuMsg.EventKey) { case "事件值": return menuMsg.ResponseNews(new WeChatResponseNewItem( title: "标题" // 其他参数 )).Result; } break; case RequestEventType._模板消息事件推送: // 除了基本的消息类型和菜单消息以外都是消息推送类型 var tempMsg = xml.ToPush模板消息(); break; } break; } } return ""; } // 微信Api调用示例 public void Api() { // 获取AccessToken 有过期管理 var token = config.GetAccessToken(); // 调用菜单创建接口 var result = token.MenuCreate( new MenuButtonClick("点我", "事件值"), // 标准的创建方法(由于类型较多,可以选用下面的方法) new MenuButtonObject(MenuButtonType.Click, "你再点呀", "事件2"), // 易于编写的方法 new MenuButtonTop("有儿子啦", // 子菜单就只能这样创建了,不能上上面的创建 new MenuButtonView("爸爸网", "http://www.qq.com"), new MenuButtonPicWeixin("发张图片呀", "wxPic") ) ); if (result.Success) Console.WriteLine("创建成功,返回信息{0}", result.ToJsonString()); // 创建Js接口调用配置信息包 var jsTicket = token.GetJsApiTicket(); jsTicket.CreatePackage("页面地址"); } // 上面的Post实例只适用于需求比较小的项目 // 为了简化和模块化代码,可以使用Handler的方式 public string Demo() { if (this.IsWeChatRequest(config)) return new WeChatHandler(Request.GetBodyXml()).Result; return ""; } } // Demo public partial class WeChatHandler : MessageHandler { public WeChatHandler(WeChatRequsetXmlDocument XmlDocument) : base(XmlDocument) { AddMenuClickHandler(); } public override WeChatResponseXmlDocument DefaultResponseMessage(WeChatMessageBase msg) { return null; // 默认不处理信息 或 将记录消息到数据库 } public override WeChatResponseXmlDocument OnMessageText(WeChatMessageText text) { return text.ResponseText("您发的是:{0}", text.Content); } public override WeChatResponseXmlDocument OnEvent关注(WeChatEventMessageBase msg) { // 允许重写的方法都是默认实现调用DefaultResponseMessage方法 // 为了避免返回数据会被替换为默认消息,请勿调用base方法!!! return base.OnEvent关注(msg); } public override WeChatResponseXmlDocument OnEvent关注(WeChatEventMessage扫描带参数二维码 msg) { return base.OnEvent关注(msg); } public override void OnEvent取消关注(WeChatEventMessageBase msg) { base.OnEvent取消关注(msg); } public override WeChatResponseXmlDocument OnEvent点击自定义菜单(WeChatEventMessage点击自定义菜单 msg) { return base.OnEvent点击自定义菜单(msg); } } // 可以放在不同的文件以区分模块 public partial class WeChatHandler : MessageHandler { void AddMenuClickHandler() { // 可以添加一系列菜单处理方法 // 通过此方法添加的处理方法会首先匹配, // 一旦匹配处理成功则不在继续后续处理直接返回, // 就是说 OnEvent点击自定义菜单事件 是不会再被调用 AddEventMenuClickHanler("Demo", MenuClickDemo); } WeChatResponseXmlDocument MenuClickDemo(WeChatEventMessage点击自定义菜单 msg) { return msg.ResponseText("示例"); } } }
更新日志及详细调用说明会在安装包后打开,本文不会随着版本的迭代而更新,下面放上写本Demo时的更新日志。
微信公众平台接口 √ 已完整实现接口调用功能 ○ 推迟实现或暂未实现功能 × 无计划或未能实现的接口 XXX 表示一系列命名相似的方法 V0.1.7 微信推送信息转由委托事件处理(为优化正式项目代码所设置) MessageHandler.AddTextKeyWordHandler 添加文本消息关键词处理 MessageHandler.AddEventMenuClickHanler 添加菜单点击事件值处理 MessageHandler.AddEventScanTicketHanler 添加二维码扫描/关注ticket处理 V0.1.6 增加微信消息统一请求处理入口MessageHandler V0.1.5 开始开发 √ new Config() 获取AccessToken √ Config.GetAccessToken(包含自动刷新管理) 获取微信服务器IP地址 √ AccessToken.GetIpAdress 自定义菜单 √ 接口入口AccessToken 自定义菜单创建接口 √ MenuCreate 自定义菜单查询接口 √ MenuQuery 自定义菜单删除接口 √ MenuDelete MenuDeleteCondition 自定义菜单事件推送 √ RequestMessage.ToEventMessageXXX 个性化菜单接口 √ MenuCreatCondition 获取自定义菜单配置接口 √ MenuConfigQuery 消息管理 // 消息入口 Request Controller ApiController(仅Net45) 验证消息真实性 √ IsWeChatRequest CheckSignature 接收普通消息 √ GetBodyXml Xml.ToRequestMessageXXX 接收事件推送 √ Xml.GetEventType RequestMessage.ToEventMessageXXX 被动回复消息 √ RequestMessage.ResponseXXX 消息加密 √ 自动根据消息体处理收发解加密 客服消息 √ AccessToken.CustomerServiceSendXXX 群发接口和原创校验 √ 接口入口AccessToken MassXXX 未进行测试验证 上传图文消息内的图片获取URL √ MassMessageImageUpload 上传图文消息素材 √ MassMessageNewsUpload 根据标签进行群发 √ MassMessageSendXXX 根据OpenID列表群发 √ MassMessageSendXXXByOpenId 删除群发 √ MassMessageSentDelete 预览接口 √ MassMessageSendXXXPreview 查询群发消息发送状态 √ MassMessageSentStateQuery 事件推送群发结果 √ RequestMessage.ToPush群发消息 模板消息 √ 接口入口AccessToken 未完整测试 设置所属行业 √ TemplateIndustrySet 获取设置的行业信息 √ TemplateIndustryQuery 获得模板ID √ TemplateAdd 获取模板列表 √ TemplateQuery 删除模板 √ TemplateDelete 发送模板消息 √ TemplateMessageSend 事件推送 √ RequestMessage.ToPush模板消息 获取公众号的自动回复规则 × 微信网页开发 微信网页授权 √ 授权地址生成 √ Config.WebUrlScopeBase Config.WebUrlScopeUserInfo 获取授权Code √ Request.GetWebOauthCode 获取用户Token √ Config.WebAccessTokenXX 获取用户信息 √ WebAccessToken.WebUserInfo 检查Token是否有效 √ WebAccessToken.Check 刷新用户的Token √ Config.WebAccessTokenRefresh WebAccessToke.Refresh 微信JS-SDK 获取JsApiTicket √ AccessToken.GetJsApiTicket 生成JS-SDK权限签名包 √ JsApiTicket.CreatePackage 获取卡券ApiTicket ○ 生成卡券签名包 ○ 素材管理 √ 接口入口AccessToken 部分接口未能完整测试 新增临时素材 √ MediaUpload 获取临时素材 √ MediaDownload MediaDownloadSpeex 新增永久素材 √ MaterialNewsAdd MaterialUploadImage MaterialUpload 获取永久素材 √ MaterialDownload MaterialNewQuery 删除永久素材 √ MaterialDelete 修改永久图文素材 √ MaterialNewUpdate 获取素材总数 √ MaterialCount 获取素材列表 √ MaterialNewsQuery MaterialMediaQuery 用户管理 √ 接口入口AccessToken 用户标签管理 √ TagCreate TagQuery TagUpdate TagDelete TagUsersQuery 用户分组管理 √ TagApply TagCancel TagUserQuery 设置用户备注名 √ UserRemark 获取用户基本信息 √ UserInfo 获取用户列表 √ UsersQuery 获取用户地理位置 √ RequestMessage.ToEventMessage上报地理位置 黑名单管理 √ UserDefriendApply UserDefriendApply UserDefriendCancel 账号管理 接口入口AccessToken 生成带参数二维码 √ CreateQRScene CreateQRLimitScene 长链接转短链接接口 √ LongUrlToShort 微信认证事件推送 × 数据统计 ○ 微信卡券 ○ 微信门店 ○ 微信小店 ○ 微信设备 × 微信客服 √ 接口未能完整测试 消息转发到客服 √ RequestMessage.TransferToCustomerService 客服管理 √ AccessToken.CustomerServiceAccountXXX 会话控制 √ AccessToken.CustomerServiceSessionXXX 获取聊天记录 √ AccessToken.CustomerServiceRecordQuery 会话状态通知事件 √ RequestMessage.ToPushCustomerServiceXXX 微信摇一摇周边 × 微信连Wi-Fi × 微信扫一扫 × 微信小程序 ○ 微信开放平台 ○