diff --git a/Senparc.Weixin.MP.BuildOutPut/Senparc.Weixin.MP.MvcExtension.XML b/Senparc.Weixin.MP.BuildOutPut/Senparc.Weixin.MP.MvcExtension.XML
new file mode 100644
index 0000000000..4bd11d0e29
--- /dev/null
+++ b/Senparc.Weixin.MP.BuildOutPut/Senparc.Weixin.MP.MvcExtension.XML
@@ -0,0 +1,31 @@
+
+
+
+ Senparc.Weixin.MP.MvcExtension
+
+
+
+
+ 过滤来自非微信客户端浏览器的请求
+
+
+
+
+
+
+ 错误提示信息
+ 如果地址栏中提供改参数,则忽略浏览器判断,建议设置得复杂一些。如?abc=[任意字符]
+
+
+
+ 返回MessageHandler结果
+
+
+
+
+ 获取ContentResult中的Content或IMessageHandler中的ResponseDocument文本结果。
+ 一般在测试的时候使用。
+
+
+
+
diff --git a/Senparc.Weixin.MP.BuildOutPut/Senparc.Weixin.MP.MvcExtension.dll b/Senparc.Weixin.MP.BuildOutPut/Senparc.Weixin.MP.MvcExtension.dll
index a445704ca5..9bc1b7bb33 100644
Binary files a/Senparc.Weixin.MP.BuildOutPut/Senparc.Weixin.MP.MvcExtension.dll and b/Senparc.Weixin.MP.BuildOutPut/Senparc.Weixin.MP.MvcExtension.dll differ
diff --git a/Senparc.Weixin.MP.BuildOutPut/Senparc.Weixin.MP.XML b/Senparc.Weixin.MP.BuildOutPut/Senparc.Weixin.MP.XML
new file mode 100644
index 0000000000..eaa526a108
--- /dev/null
+++ b/Senparc.Weixin.MP.BuildOutPut/Senparc.Weixin.MP.XML
@@ -0,0 +1,1359 @@
+
+
+
+ Senparc.Weixin.MP
+
+
+
+
+ 发送文本信息
+
+
+
+
+
+
+
+
+ 发送图片消息
+
+
+
+
+
+
+
+
+ 发送语音消息
+
+
+
+
+
+
+
+
+ 发送视频消息
+
+
+
+
+
+
+
+
+
+ 发送音乐消息
+
+
+
+ 音乐标题(非必须)
+ 音乐描述(非必须)
+ 音乐链接
+ 高品质音乐链接,wifi环境优先使用该链接播放音乐
+ 视频缩略图的媒体ID
+
+
+
+
+ 发送图文消息
+
+
+
+ 音乐标题(非必须)
+ 音乐描述(非必须)
+ 音乐链接
+ 高品质音乐链接,wifi环境优先使用该链接播放音乐
+ 视频缩略图的媒体ID
+
+
+
+
+ 创建分组返回结果
+
+
+
+
+ JSON返回结果(用于菜单接口等)
+
+
+
+
+ 为P2P返回结果做准备
+
+
+
+
+ 发送文本信息
+
+
+
+
+
+
+
+
+ 创建分组
+
+
+
+
+
+ 创建分组
+
+
+
+ 分组名字(30个字符以内)
+
+
+
+
+ 移动用户分组
+
+
+
+
+
+
+
+
+ 此属性在CreateGroupResult的Json数据中,创建结果中始终为0
+
+
+
+
+ 二维码创建返回结果
+
+
+
+
+ 创建二维码
+
+ 该二维码有效时间,以秒为单位。 最大不超过1800。0时为永久二维码
+ 场景值ID,临时二维码时为32位整型,永久二维码时最大值为1000
+
+
+
+
+ 获取二维码(不需要AccessToken)
+ 错误情况下(如ticket非法)返回HTTP错误码404。
+
+
+
+
+
+
+ 获取用户信息
+
+
+
+
+
+
+
+ 获取关注着OpenId信息
+
+
+
+
+
+
+
+ 高级接口获取的用户信息
+
+
+
+
+ 代理请求
+ 注意!使用代理必然导致网络访问节点增加,会加重响应延时,
+ 因此建议准备至少2-3秒的延迟时间的准备,
+ 如果增加2-3秒后远远超过5秒的微信服务器等待时间,
+ 需要慎重使用,否则可能导致用户无法收到消息。
+
+ 此外这个类中的方法也可以用于模拟服务器发送消息到自己的服务器进行测试。
+
+
+
+
+ 获取Xml结果。
+
+
+
+
+ 是否使用SouideaKey,如果使用,则token为SouideaKey
+
+
+
+
+ 获取Xml结果
+
+
+
+
+
+
+
+
+ 对接Souidea(P2P)平台,获取Xml结果,使用SouideaKey对接
+ SouideaKey的获取方式请看:
+
+
+
+
+
+
+
+ 获取ResponseMessge结果
+
+
+
+
+
+
+
+
+ 获取ResponseMessge结果
+
+
+
+
+
+
+
+
+ 获取Souidea开放平台的ResponseMessge结果
+
+
+
+
+
+
+
+
+ 在网站没有提供Token(或传入为null)的情况下的默认Token,建议在网站中进行配置。
+
+
+
+
+ 检查签名是否正确
+
+
+
+
+
+
+
+
+
+ 返回正确的签名
+
+
+
+
+
+
+
+
+
+ 获取凭证接口
+
+ 获取access_token填写client_credential
+ 第三方用户唯一凭证
+ 第三方用户唯一凭证密钥,既appsecret
+
+
+
+
+ 用户信息接口
+
+
+
+
+
+
+
+ 媒体文件上传接口
+ 注意事项
+ 1.上传的媒体文件限制:
+ 图片(image) : 1MB,支持JPG格式
+ 语音(voice):1MB,播放长度不超过60s,支持MP4格式
+ 视频(video):10MB,支持MP4格式
+ 缩略图(thumb):64KB,支持JPG格式
+ 2.媒体文件在后台保存时间为3天,即3天后media_id失效
+
+
+ 上传文件类型
+ 上传文件完整路径+文件名
+
+
+
+
+ 创建菜单
+
+
+ 菜单内容
+
+
+
+
+ 获取单击按钮
+
+
+
+
+
+
+ 从JSON字符串获取菜单对象
+
+
+
+
+
+
+ 获取当前菜单,如果菜单不存在,将返回null
+
+
+
+
+
+
+ 根据微信返回的Json数据得到可用的GetMenuResult结果
+
+
+
+
+
+
+ 删除菜单
+
+
+
+
+
+
+ 向需要AccessToken的API发送消息的公共方法
+
+
+
+
+
+
+
+
+ 最大记录条数(保留尾部),如果小于等于0则不限制
+
+
+
+
+ 对话上下文被删除时触发事件的事件数据
+
+
+
+
+ 该用户的OpenId
+
+
+
+
+ 最后一次响应时间
+
+
+
+
+ 上下文对象
+
+
+
+
+ 标记大小
+
+
+
+
+ (可选)指定集合 {tiny, mid, small} 中的标记大小。如果未设置 size 参数,标记将以其默认(常规)大小显示。
+
+
+
+
+ (可选)指定 24 位颜色(例如 color=0xFFFFCC)或集合 {black, brown, green, purple, yellow, blue, gray, orange, red, white} 中预定义的一种颜色。
+
+
+
+
+ (可选)指定集合 {A-Z, 0-9} 中的一个大写字母数字字符。
+
+
+
+
+ 经度longitude
+
+
+
+
+ 纬度latitude
+
+
+
+
+ access_token请求后的JSON返回格式
+
+
+
+
+ 获取到的凭证
+
+
+
+
+ 凭证有效时间,单位:秒
+
+
+
+
+ 获取菜单时候的完整结构,用于接收微信服务器返回的Json信息
+
+
+
+
+ GetMenu返回的Json结果
+
+
+
+
+ 上传媒体文件返回结果
+
+
+
+
+ 用户信息
+
+
+
+
+ 用户是否订阅该公众号标识,值为0时,拉取不到其余信息
+
+
+
+
+ 普通用户的标识,对当前公众号唯一
+
+
+
+
+ 普通用户的昵称
+
+
+
+
+ 普通用户的头像链接
+
+
+
+
+ 普通用户的语言,简体中文为zh_CN
+
+
+
+
+ 所有按钮基类
+
+
+
+
+ 按钮描述,既按钮名字,不超过16个字节,子菜单不超过40个字节
+
+
+
+
+ 整个按钮设置(可以直接用ButtonGroup实例返回JSON对象)
+
+
+
+
+ 按钮数组,按钮个数应为2~3个
+
+
+
+
+ 所有单击按钮的基类(view,click等)
+
+
+
+
+ 按钮类型(click或view)
+
+
+
+
+ 单个按键
+
+
+
+
+ 类型为click时必须。
+ 按钮KEY值,用于消息接口(event类型)推送,不超过128字节
+
+
+
+
+ 子菜单
+
+
+
+
+ 子按钮数组,按钮个数应为2~5个
+
+
+
+
+ Url按键
+
+
+
+
+ 类型为view时必须
+ 网页链接,用户点击按钮可打开链接,不超过256字节
+
+
+
+
+ 所有Request和Response消息的基类
+
+
+
+
+ 接收到请求的消息
+
+
+
+
+ 事件类型
+
+
+
+
+ 事件KEY值,与自定义菜单接口中KEY值对应
+
+
+
+
+ 事件类型
+
+
+
+
+ 事件KEY值,与自定义菜单接口中KEY值对应
+
+
+
+
+ 事件类型
+
+
+
+
+ 获取用户地理位置(高级接口下才能用)
+ 获取用户地理位置的方式有两种,一种是仅在进入会话时上报一次,一种是进入会话后每隔5秒上报一次。公众号可以在公众平台网站中设置。
+ 用户同意上报地理位置后,每次进入公众号会话时,都会在进入时上报地理位置,或在进入会话后每5秒上报一次地理位置,上报地理位置以推送XML数据包到开发者填写的URL来实现。
+
+
+
+
+ 事件类型
+
+
+
+
+ 地理位置维度,事件类型为LOCATION的时存在
+
+
+
+
+ 地理位置经度,事件类型为LOCATION的时存在
+
+
+
+
+ 地理位置精度,事件类型为LOCATION的时存在
+
+
+
+
+ 地理位置纬度
+
+
+
+
+ 地理位置经度
+
+
+
+
+ 语音格式:amr
+
+
+
+
+ 语音识别结果,UTF8编码
+ 开通语音识别功能,用户每次发送语音给公众号时,微信会在推送的语音消息XML数据包中,增加一个Recongnition字段。
+ 注:由于客户端缓存,开发者开启或者关闭语音识别功能,对新关注者立刻生效,对已关注用户需要24小时生效。开发者可以重新关注此帐号进行测试。
+
+
+
+
+ 事件之订阅
+
+
+
+
+ 事件类型
+
+
+
+
+ 事件之取消订阅
+
+
+
+
+ 事件类型
+
+
+
+
+ 事件之取消订阅
+
+
+
+
+ 事件类型
+
+
+
+
+ 事件之取消订阅
+
+
+
+
+ 事件类型
+
+
+
+
+ 视频类型
+
+
+
+
+ 响应回复消息
+
+
+
+
+ 获取响应类型实例,并初始化
+
+ 请求
+ 响应类型
+
+
+
+
+ 获取响应类型实例,并初始化
+
+ 需要返回的类型
+ 请求数据
+
+
+
+
+ 从返回结果XML转换成IResponseMessageBase实体类
+
+ 返回给服务器的Response Xml
+
+
+
+
+ 文章列表,微信客户端只能输出前10条(可能未来数字会有变化,出于视觉效果考虑,建议控制在8条以内)
+
+
+
+
+ 接收消息类型
+
+
+
+
+ 当RequestMsgType类型为Event时,Event属性的类型
+
+
+
+
+ 进入会话(似乎已从官方API中移除)
+
+
+
+
+ 地理位置(似乎已从官方API中移除)
+
+
+
+
+ 订阅
+
+
+
+
+ 取消订阅
+
+
+
+
+ 自定义菜单点击事件
+
+
+
+
+ 二维码扫描
+
+
+
+
+ 发送消息类型
+
+
+
+
+ 菜单按钮类型
+
+
+
+
+ 点击
+
+
+
+
+ Url
+
+
+
+
+ 上传媒体文件类型
+
+
+
+
+ 图片
+
+
+
+
+ 语音
+
+
+
+
+ 视频
+
+
+
+
+ thumb
+
+
+
+
+ 返回码(JSON)
+
+
+
+
+ JSON返回错误代码(比如token_access相关操作中使用)。
+
+
+
+
+ 微信自定义异常基类
+
+
+
+
+ 转换微信DateTime时间到C#时间
+
+ 微信DateTime
+
+
+
+
+ 转换微信DateTime时间到C#时间
+
+ 微信DateTime
+
+
+
+
+ 获取微信DateTime
+
+ 时间
+
+
+
+
+ 根据XML信息填充实实体
+
+ MessageBase为基类的类型,Response和Request都可以
+ 实体
+ XML
+
+
+
+ 将实体转为XML
+
+ RequestMessage或ResponseMessage
+ 实体
+
+
+
+
+ 将实体转为XML字符串
+
+ RequestMessage或ResponseMessage
+ 实体
+
+
+
+
+
+ ResponseMessageBase.CreateFromResponseXml(xml)的扩展方法
+
+ 返回给服务器的Response Xml
+
+
+
+
+ 根据完整文件路径获取FileStream
+
+
+
+
+
+
+ 获取谷歌今天静态地图Url。API介绍:https://developers.google.com/maps/documentation/staticmaps/?hl=zh-CN
+
+
+
+
+
+ 计算两点GPS坐标的距离(单位:米)
+
+ 第一点的纬度坐标
+ 第一点的经度坐标
+ 第二点的纬度坐标
+ 第二点的经度坐标
+
+
+
+
+ 获取维度差
+
+ 千米
+
+
+
+
+ 获取经度差
+
+ 千米
+
+
+
+
+ 根据xml信息,返回RequestMsgType
+
+
+
+
+
+ 根据xml信息,返回RequestMsgType
+
+
+
+
+
+ 根据xml信息,返回ResponseMsgType
+
+
+
+
+
+ 根据xml信息,返回ResponseMsgType
+
+
+
+
+
+ 获取Post结果
+
+
+
+
+
+
+
+ 发起Post请求
+
+ 返回数据类型(Json对应的实体)
+ 请求Url
+ CookieContainer,如果不需要则设为null
+ 要发送的文件名,如果不需要上传则设为null
+
+
+
+
+ 发起Post请求
+
+ 返回数据类型(Json对应的实体)
+ 请求Url
+ CookieContainer,如果不需要则设为null
+ 文件流
+
+
+
+
+ 使用Get方法获取字符串结果(没有加入Cookie)
+
+
+
+
+
+
+ 使用Get方法获取字符串结果(加入Cookie)
+
+
+
+
+
+
+
+
+ 使用Post方法获取字符串结果
+
+
+
+
+
+ 使用Post方法获取字符串结果
+
+
+
+
+
+
+ 使用Post方法获取字符串结果
+
+
+
+
+ postStreams是否是文件流
+
+
+
+
+ 请求是否发起自微信客户端的浏览器
+
+
+
+
+
+
+
+ 封装System.Web.HttpUtility.HtmlEncode
+
+
+
+
+
+
+ 封装System.Web.HttpUtility.HtmlDecode
+
+
+
+
+
+
+ 封装System.Web.HttpUtility.UrlEncode
+
+
+
+
+
+
+ 封装System.Web.HttpUtility.UrlDecode
+
+
+
+
+
+
+ 发送者用户名(OpenId)
+
+
+
+
+ 取消执行Execute()方法。一般在OnExecuting()中用于临时阻止执行Execute()。
+ 默认为False。
+ 如果在执行OnExecuting()执行前设为True,则所有OnExecuting()、Execute()、OnExecuted()代码都不会被执行。
+ 如果在执行OnExecuting()执行过程中设为True,则后续Execute()及OnExecuted()代码不会被执行。
+ 建议在设为True的时候,给ResponseMessage赋值,以返回友好信息。
+
+
+
+
+ 在构造函数中转换得到原始XML数据
+
+
+
+
+ 根据ResponseMessageBase获得转换后的ResponseDocument
+ 注意:这里每次请求都会根据当前的ResponseMessageBase生成一次,如需重用此数据,建议使用缓存或局部变量
+
+
+
+
+ 请求实体
+
+
+
+
+ 响应实体
+ 只有当执行Execute()方法后才可能有值
+
+
+
+
+ 微信请求的集中处理方法
+ 此方法中所有过程,都基于Senparc.Weixin.MP的基础功能,只为简化代码而设。
+
+
+
+
+ 上下文
+
+
+
+
+ 根据当前的RequestMessage创建指定类型的ResponseMessage
+
+ 基于ResponseMessageBase的响应消息类型
+
+
+
+
+ 执行微信请求
+
+
+
+
+ 默认返回消息(当任何OnXX消息没有被重写,都将自动返回此默认消息)
+
+
+
+
+ 文字类型请求
+
+
+
+
+ 位置类型请求
+
+
+
+
+ 图片类型请求
+
+
+
+
+ 语音类型请求
+
+
+
+
+ 视频类型请求
+
+
+
+
+ 链接消息类型请求
+
+
+
+
+ Event事件类型请求
+
+
+
+
+ Event事件类型请求之ENTER
+
+
+
+
+ Event事件类型请求之LOCATION
+
+
+
+
+ Event事件类型请求之subscribe
+
+
+
+
+ Event事件类型请求之unsubscribe
+
+
+
+
+ Event事件类型请求之CLICK
+
+
+
+
+ Event事件类型请求之scan
+
+
+
+
+ 全局消息上下文
+
+
+
+
+ 当前用户消息上下文
+
+
+
+
+ 发送者用户名(OpenId)
+
+
+
+
+
+
+
+
+
+ 取消执行Execute()方法。一般在OnExecuting()中用于临时阻止执行Execute()。
+ 默认为False。
+ 如果在执行OnExecuting()执行前设为True,则所有OnExecuting()、Execute()、OnExecuted()代码都不会被执行。
+ 如果在执行OnExecuting()执行过程中设为True,则后续Execute()及OnExecuted()代码不会被执行。
+ 建议在设为True的时候,给ResponseMessage赋值,以返回友好信息。
+
+
+
+
+ 在构造函数中转换得到原始XML数据
+
+
+
+
+ 根据ResponseMessageBase获得转换后的ResponseDocument
+ 注意:这里每次请求都会根据当前的ResponseMessageBase生成一次,如需重用此数据,建议使用缓存或局部变量
+
+
+
+
+ 请求实体
+
+
+
+
+ 响应实体
+ 正常情况下只有当执行Execute()方法后才可能有值。
+ 也可以结合Cancel,提前给ResponseMessage赋值。
+
+
+
+
+ 获取XDocument转换后的IRequestMessageBase实例。
+ 如果MsgType不存在,抛出UnknownRequestMsgTypeException异常
+
+
+
+
+
+ 获取XDocument转换后的IRequestMessageBase实例。
+ 如果MsgType不存在,抛出UnknownRequestMsgTypeException异常
+
+
+
+
+
+ 获取XDocument转换后的IRequestMessageBase实例。
+ 如果MsgType不存在,抛出UnknownRequestMsgTypeException异常
+
+ 如Request.InputStream
+
+
+
+
+ 未知请求类型。
+
+
+
+
+ 获取XDocument转换后的IResponseMessageBase实例(通常在反向读取日志的时候用到)。
+ 如果MsgType不存在,抛出UnknownRequestMsgTypeException异常
+
+
+
+
+
+ 获取XDocument转换后的IRequestMessageBase实例。
+ 如果MsgType不存在,抛出UnknownRequestMsgTypeException异常
+
+
+
+
+
+ 用户名(OpenID)
+
+
+
+
+ 最后一次活动时间(用户主动发送Resquest请求的时间)
+
+
+
+
+ 接收消息记录
+
+
+
+
+ 响应消息记录
+
+
+
+
+ 最大储存容量(分别针对RequestMessages和ResponseMessages)
+
+
+
+
+ 临时储存数据,如用户状态等,出于保持.net 3.5版本,这里暂不使用dynamic
+
+
+
+
+ 微信消息上下文(单个用户)
+
+
+
+
+ 执行上下文被移除的事件
+ 注意:此事件不是实时触发的,而是等过期后任意一个人发过来的下一条消息执行之前触发。
+
+
+
+
+
+
+
+ maxRecordCount如果小于等于0,则不限制
+
+
+
+ 是否开启上下文记录
+
+
+
+
+ 微信消息上下文(全局)
+ 默认过期时间:90分钟
+
+
+
+
+ 重置所有上下文参数,所有记录将被清空
+
+
+
+
+ 获取MessageContext,如果不存在,返回null
+ 这个方法的更重要意义在于操作TM队列,及时移除过期信息,并将最新活动的对象移到尾部
+
+ 用户名(OpenId)
+
+
+
+
+ 获取MessageContext
+
+ 用户名(OpenId)
+ True:如果用户不存在,则创建一个实例,并返回这个最新的实例
+ False:用户储存在,则返回null
+
+
+
+
+ 获取MessageContext,如果不存在,使用requestMessage信息初始化一个,并返回原始实例
+
+
+
+
+
+ 获取MessageContext,如果不存在,使用requestMessage信息初始化一个,并返回原始实例
+
+
+
+
+
+ 记录请求信息
+
+ 请求信息
+
+
+
+ 记录响应信息
+
+ 响应信息
+
+
+
+ 获取最新一条请求数据,如果不存在,则返回Null
+
+ 用户名(OpenId)
+
+
+
+
+ 获取最新一条响应数据,如果不存在,则返回Null
+
+ 用户名(OpenId)
+
+
+
+
+ 所有MessageContext集合,不要直接操作此对象
+
+
+
+
+ MessageContext列队(LastActiveTime升序排列),不要直接操作此对象
+
+
+
+
+ 每一个MessageContext过期时间
+
+
+
+
+ 最大储存上下文数量(分别针对请求和响应信息)
+
+
+
+
diff --git a/Senparc.Weixin.MP.BuildOutPut/Senparc.Weixin.MP.dll b/Senparc.Weixin.MP.BuildOutPut/Senparc.Weixin.MP.dll
index f5c79dc496..61e9c492a9 100644
Binary files a/Senparc.Weixin.MP.BuildOutPut/Senparc.Weixin.MP.dll and b/Senparc.Weixin.MP.BuildOutPut/Senparc.Weixin.MP.dll differ
diff --git a/Senparc.Weixin.MP.MvcExtension/Senparc.Weixin.MP.MvcExtension/Senparc.Weixin.MP.MvcExtension.csproj b/Senparc.Weixin.MP.MvcExtension/Senparc.Weixin.MP.MvcExtension/Senparc.Weixin.MP.MvcExtension.csproj
index ee4ded325d..6c74b0a145 100644
--- a/Senparc.Weixin.MP.MvcExtension/Senparc.Weixin.MP.MvcExtension/Senparc.Weixin.MP.MvcExtension.csproj
+++ b/Senparc.Weixin.MP.MvcExtension/Senparc.Weixin.MP.MvcExtension/Senparc.Weixin.MP.MvcExtension.csproj
@@ -28,6 +28,7 @@
TRACE
prompt
4
+ ..\..\Senparc.Weixin.MP.BuildOutPut\Senparc.Weixin.MP.MvcExtension.XML
diff --git a/Senparc.Weixin.MP/Senparc.Weixin.MP/Senparc.Weixin.MP.csproj b/Senparc.Weixin.MP/Senparc.Weixin.MP/Senparc.Weixin.MP.csproj
index c8b68fb265..36d513aacf 100644
--- a/Senparc.Weixin.MP/Senparc.Weixin.MP/Senparc.Weixin.MP.csproj
+++ b/Senparc.Weixin.MP/Senparc.Weixin.MP/Senparc.Weixin.MP.csproj
@@ -28,6 +28,7 @@
TRACE
prompt
4
+ ..\..\Senparc.Weixin.MP.BuildOutPut\Senparc.Weixin.MP.XML
true