【微信公众平台SDK(链式调用)】经过半个月的迭代,今天抽空写了个Demo
这个项目是在实际开发中逐渐完善的,开发过程基于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的更多相关文章
- 微信公众平台SDK Python
微信公众平台SDK 项目背景 从2014年开始玩微信公众平台,试用过其中大多数的功能,如:消息回复.自定义菜单.公众号中的支付,页面授权等.之前的程序中都是直接调用公众平台的接口,这样复用功能无法实现 ...
- 国内流行的两大开源.net微信公众平台SDK对比分析
最近忙于微信周边的开发 难免手痒去搜索一下有没有相关的sdk直接拿来使 还真发现了不少 这里总结两个看起来比较不错的.net平台下基于C#语言开发的SDK 一个强大一个小巧 (1) Senparc.W ...
- 国内流行的开源.net微信公众平台SDK对比分析
一.引言 目前微信公众平台正如火如荼的进行中,微信虽然在海外市场不敌WhatsApp,但是已经俘获了国内绝大部分用户的心.作为国内最大的,超级"app",微信已算是成功问鼎了.公众 ...
- 微信公众平台SDK
微信公众平台网址:https://mp.weixin.qq.com/ 服务号说明:给企业和组织提供更强大的业务服务与用户管理能力,帮助企业快速实现全新的公众号服务平台. .NETSDK: Loogn. ...
- 微信公众平台SDK for node
实现了下面特性: 1.开启开发人员模式 2.解析微信请求參数 3.验证消息来源 4.被动回复文字消息 5.被动回复图文消息 6.获取access_token 7.创建自己定义菜单 地址:wechat ...
- Senparc.Weixin.MP SDK 微信公众平台开发教程(十三):地图相关接口说明
为了方便大家开发LBS应用,SDK对常用计算公式,以及百度和谷歌的地图接口做了封装. 常用计算: 用于计算2个坐标点之间的直线距离:Senparc.Weixin.MP.Helpers.Distance ...
- Senparc.Weixin.MP SDK 微信公众平台开发教程 索引
Senparc.Weixin.MP SDK从一开始就坚持开源的状态,这个过程中得到了许多朋友的认可和支持. 目前SDK已经达到比较稳定的版本,这个过程中我觉得有必要整理一些思路和经验,和大家一起分享. ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(70)-微信公众平台开发-成为开发者
系列目录 前言: 一.阅读这段系列之前,你必须花半天时间大致阅读微信公众平台的API文档,我尽量以简短快速的语言与大家分享一个过程 二.借助微信公众平台SDK Senparc.Weixin for C ...
- [转]微信公众平台WeChat PHP SDK
地址:https://github.com/dodgepudding/wechat-php-sdk 微信公众平台php开发包,细化各项接口操作,支持链式调用 微信支付接入文档: https://mp. ...
随机推荐
- phpstrom 的一些常用设置
phpstrom是php开发者使用率比较高的一款IDE,也是我使用的比较多的一款,以免以后忘记了自己熟悉的设置,在此做一些记录. 1.主题的设置 可以在http://www.phpstorm-th ...
- MongoDB的账户与权限管理及在Python与Java中的登陆
本文主要介绍了MongoDB的账户新建,权限管理(简单的),以及在Python,Java和默认客户端中的登陆. 默认的MongoDB是没有账户权限管理的,也就是说,不需要密码即可登陆,即可拥有读写的权 ...
- 你真的了解如何将 Nginx 配置为Web服务器吗
阅读之前,建议先阅读初识 Nginx. 之后,我们来了解一下 Nginx 配置. 抽象来说,将 Nginx 配置为 Web 服务器就是定义处理哪些 URLS 和如何处理这些URLS 对应的请求.具体来 ...
- GIS制图课程目录(持续整理)
GIS制图课程目录 by 李远祥 由于过去一年都没有进行更新,近期终于抽出时间来进行相关知识的整理,因此,对专项技术进行了不同技术线条的梳理.为了方便阅读,特意整理一下全书的目录结构,希望对读者有帮助 ...
- Ionic start 创建项目报错 Error with start undefined
转自:http://blog.csdn.net/wenzigui_qy/article/details/52874542 在Installing npm packages的时候报错,如下: Insta ...
- php curl详细解析和常见大坑
1. 拿来先试试手 比如我们以著名的"测试网络是否连接"的网站--百度为例,来尝试下curl <?php // create curl resource $ch = curl ...
- Android微信朋友圈全文、收起功能
在众多的社交类软件中,朋友圈是必不可少的,可以与好友.同学等分享自己的日常和有意思的事情,在开发社交类App时,朋友圈发表的内容你不可能让他全部显示,全部显示的话用户体验度会非常不好,这时就要用到全文 ...
- Ninject之旅之十三:Ninject在ASP.NET MVC程序上的应用(附程序下载)
摘要: 在Windows客户端程序(WPF和Windows Forms)中使用Ninject和在控制台应用程序中使用Ninject没什么不同.在这些应用程序里我们不需要某些配置用来安装Ninject, ...
- 使用nat方式解决虚拟机联网问题
本文全文参考:http://jingyan.baidu.com/album/4e5b3e1957979d91901e24f1.html?picindex=1,谢谢 对于很多的linux初学者来说,最开 ...
- PLSQL游标使用
游标是一个指针,它指向一块SQL区域,该区域用于存储处理过来的SELECT或者其他的DML操作返回的数据.由PLSQL创建并管理的游标成为隐式游标,用户创建并管理的成为显示游标.游标可以看做是指向记录 ...