这个项目是在实际开发中逐渐完善的,开发过程基于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 ×
 微信扫一扫 ×
 微信小程序 ○
 微信开放平台 ○

【微信公众平台SDK(链式调用)】经过半个月的迭代,今天抽空写了个Demo的更多相关文章

  1. 微信公众平台SDK Python

    微信公众平台SDK 项目背景 从2014年开始玩微信公众平台,试用过其中大多数的功能,如:消息回复.自定义菜单.公众号中的支付,页面授权等.之前的程序中都是直接调用公众平台的接口,这样复用功能无法实现 ...

  2. 国内流行的两大开源.net微信公众平台SDK对比分析

    最近忙于微信周边的开发 难免手痒去搜索一下有没有相关的sdk直接拿来使 还真发现了不少 这里总结两个看起来比较不错的.net平台下基于C#语言开发的SDK 一个强大一个小巧 (1) Senparc.W ...

  3. 国内流行的开源.net微信公众平台SDK对比分析

    一.引言 目前微信公众平台正如火如荼的进行中,微信虽然在海外市场不敌WhatsApp,但是已经俘获了国内绝大部分用户的心.作为国内最大的,超级"app",微信已算是成功问鼎了.公众 ...

  4. 微信公众平台SDK

    微信公众平台网址:https://mp.weixin.qq.com/ 服务号说明:给企业和组织提供更强大的业务服务与用户管理能力,帮助企业快速实现全新的公众号服务平台. .NETSDK: Loogn. ...

  5. 微信公众平台SDK for node

    实现了下面特性: 1.开启开发人员模式 2.解析微信请求參数 3.验证消息来源 4.被动回复文字消息 5.被动回复图文消息 6.获取access_token 7.创建自己定义菜单 地址:wechat ...

  6. Senparc.Weixin.MP SDK 微信公众平台开发教程(十三):地图相关接口说明

    为了方便大家开发LBS应用,SDK对常用计算公式,以及百度和谷歌的地图接口做了封装. 常用计算: 用于计算2个坐标点之间的直线距离:Senparc.Weixin.MP.Helpers.Distance ...

  7. Senparc.Weixin.MP SDK 微信公众平台开发教程 索引

    Senparc.Weixin.MP SDK从一开始就坚持开源的状态,这个过程中得到了许多朋友的认可和支持. 目前SDK已经达到比较稳定的版本,这个过程中我觉得有必要整理一些思路和经验,和大家一起分享. ...

  8. ASP.NET MVC5+EF6+EasyUI 后台管理系统(70)-微信公众平台开发-成为开发者

    系列目录 前言: 一.阅读这段系列之前,你必须花半天时间大致阅读微信公众平台的API文档,我尽量以简短快速的语言与大家分享一个过程 二.借助微信公众平台SDK Senparc.Weixin for C ...

  9. [转]微信公众平台WeChat PHP SDK

    地址:https://github.com/dodgepudding/wechat-php-sdk 微信公众平台php开发包,细化各项接口操作,支持链式调用 微信支付接入文档: https://mp. ...

随机推荐

  1. HDU2063(二分图最大匹配)

    过山车 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  2. sass纯新手(一)

    说是教程还真是有点不敢当,只是将自己今天上手sass的流程给记录下来,给一些和我一样的小白菜一点参考而已,照着走一遍应该就会对sass有基本的认识了,也请大神们不吝赐教. 很久之前同事做了一个关于sa ...

  3. ubuntu下php编译

    1.安装依赖 sudo apt-get install libjpeg-devsudo apt-get install libxml2-devsudo apt-get -y install libjp ...

  4. 第七届蓝桥杯javaB组真题解析-生日蜡烛(第二题)

    题目 /* 生日蜡烛 某君从某年开始每年都举办一次生日party,并且每次都要吹熄与年龄相同根数的蜡烛. 现在算起来,他一共吹熄了236根蜡烛. 请问,他从多少岁开始过生日party的? 请填写他开始 ...

  5. C++编程练习(4)----“实现简单的栈的链式存储结构“

    如果栈的使用过程中元素数目变化不可预测,有时很小,有时很大,则最好使用链栈:反之,如果它的变化在可控范围内,使用顺序栈会好一些. 简单的栈的链式存储结构代码如下: /*LinkStack.h*/ #i ...

  6. angular1.5 Components

    如今前端界angular react vue三大框架并驾齐驱,其中有一个共同点就是组件化开发,这也符合w3c 推行Web Components的趋势.现如今不懂组件化开发的前端绝对不是好厨子.跳槽新公 ...

  7. bootstrap - btn 实例

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...

  8. layer弹出层中H5播放器全屏出错解决 & 属性poster底图占满<video>的方法

    1. 在layer弹窗组件中 如果使用了flash播放器,全屏是正常的 但若使用了HTML5的播放器,全屏失效 举个栗子 <!DOCTYPE html> <html> < ...

  9. 使用scp命令,不同服务器之间拷备文件

    使用scp命令,不同服务器之间拷备文件 先将源服务器,目标服务器安装scp服务 yum -y install openssh-clients 命令格式 scp source dist usage: s ...

  10. 【问题解决】使用自定义控件时,vs停止工作

    问题表现:向页面中添加自定义控件时,vs卡住了,随便点击一下,然后窗口未响应,然后用资源管理器看到内存使用在飙升,监视进程会发现就是vs的进程出现了异常 问题的解决:菜鸟D在网上搜了一下,发现一个奇葩 ...