[升级说明] Senparc.Weixin.MP v14.8.11 (微信群发接口调整)
升级内容:添加根据标签群发接口,重构原根据分组群发接口
参考微信文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1481187827_i0l21
说明:
之前 SDK 只提供了根据用户组群发的方法:
- GroupMessageApi.SendGroupMessageByGroupId();
由于根据分组和标签群发两种情况,逻辑基本一致,只有一个filter参数不同,因此我们创建了 BaseGroupMessageDataByFilter 基类,用于支持 GroupMessageByGroupId 和 GroupMessageByTagId。
BaseGroupMessageByFilter 代码如下:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- namespace Senparc.Weixin.MP.AdvancedAPIs.GroupMessage
- {
- /// <summary>
- /// 根据筛选条件(GroupId、TagId)群发消息数据的基类
- /// </summary>
- public abstract class BaseGroupMessageByFilter
- {
- public bool is_to_all { get; set; }
- }
- public class BaseGroupMessageDataByFilter
- {
- public BaseGroupMessageByFilter filter { get; set; }
- public string msgtype { get; set; }
- /// <summary>
- /// 群发接口新增 send_ignore_reprint 参数,开发者可以对群发接口的 send_ignore_reprint 参数进行设置,指定待群发的文章被判定为转载时,是否继续群发。
- /// 当 send_ignore_reprint 参数设置为1时,文章被判定为转载时,且原创文允许转载时,将继续进行群发操作。
- /// 当 send_ignore_reprint 参数设置为0时,文章被判定为转载时,将停止群发操作。
- /// send_ignore_reprint 默认为0。
- /// </summary>
- public int send_ignore_reprint { get; set; }
- }
- public class GroupMessageByFilter_MediaId
- {
- public string media_id { get; set; }
- }
- public class GroupMessageByFilter_Content
- {
- public string content { get; set; }
- }
- public class GroupMessageByFilter_WxCard
- {
- public string card_id { get; set; }
- }
- public class GroupMessageByFilter_VoiceData : BaseGroupMessageDataByFilter
- {
- public GroupMessageByGroupId_MediaId voice { get; set; }
- }
- public class GroupMessageByFilter_ImageData : BaseGroupMessageDataByFilter
- {
- public GroupMessageByGroupId_MediaId image { get; set; }
- }
- public class GroupMessageByFilter_TextData : BaseGroupMessageDataByFilter
- {
- public GroupMessageByGroupId_Content text { get; set; }
- }
- public class GroupMessageByFilter_MpNewsData : BaseGroupMessageDataByFilter
- {
- public GroupMessageByGroupId_MediaId mpnews { get; set; }
- }
- public class GroupMessageByFilter_MpVideoData : BaseGroupMessageDataByFilter
- {
- public GroupMessageByGroupId_MediaId mpvideo { get; set; }
- }
- public class GroupMessageByFilter_WxCardData : BaseGroupMessageDataByFilter
- {
- public GroupMessageByGroupId_WxCard wxcard { get; set; }
- }
- }
GroupMessageByTagId 代码如下:
- namespace Senparc.Weixin.MP.AdvancedAPIs.GroupMessage
- {
- /// <summary>
- /// 根据 TagId 群发筛选
- /// </summary>
- public class GroupMessageByTagId : BaseGroupMessageByFilter
- {
- public string tag_id { get; set; }
- }
- }
GroupMessageByGroupId 代码如下(包含已经弃用的代码),为了保障向下兼容性,标记了[Obsolete]特性:
- namespace Senparc.Weixin.MP.AdvancedAPIs.GroupMessage
- {
- /// <summary>
- /// 根据GroupId群发筛选
- /// </summary>
- public class GroupMessageByGroupId : BaseGroupMessageByFilter
- {
- public string group_id { get; set; }
- }
- #region 已废弃
- [Obsolete("请使用GroupMessageByGroupId")]
- public class GroupMessageByGroupId_GroupId : BaseGroupMessageByFilter
- {
- public string group_id { get; set; }
- }
- /// <summary>
- /// 根据GroupId群发消息筛选
- /// </summary>
- [Obsolete("请使用BaseGroupMessageDataByFilter")]
- public class BaseGroupMessageDataByGroupId : BaseGroupMessageDataByFilter
- {
- }
- [Obsolete("请使用GroupMessageByFilter_MediaId")]
- public class GroupMessageByGroupId_MediaId
- {
- public string media_id { get; set; }
- }
- [Obsolete("请使用GroupMessageByFilter_MediaId")]
- public class GroupMessageByGroupId_Content
- {
- public string content { get; set; }
- }
- [Obsolete("请使用GroupMessageByFilter_MediaId")]
- public class GroupMessageByGroupId_WxCard
- {
- public string card_id { get; set; }
- }
- [Obsolete("请使用GroupMessageByFilter_MediaId")]
- public class GroupMessageByGroupId_VoiceData : BaseGroupMessageDataByGroupId
- {
- public GroupMessageByGroupId_MediaId voice { get; set; }
- }
- [Obsolete("请使用GroupMessageByFilter_MediaId")]
- public class GroupMessageByGroupId_ImageData : BaseGroupMessageDataByGroupId
- {
- public GroupMessageByGroupId_MediaId image { get; set; }
- }
- [Obsolete("请使用GroupMessageByFilter_MediaId")]
- public class GroupMessageByGroupId_TextData : BaseGroupMessageDataByGroupId
- {
- public GroupMessageByGroupId_Content text { get; set; }
- }
- [Obsolete("请使用GroupMessageByFilter_MediaId")]
- public class GroupMessageByGroupId_MpNewsData : BaseGroupMessageDataByGroupId
- {
- public GroupMessageByGroupId_MediaId mpnews { get; set; }
- }
- [Obsolete("请使用GroupMessageByFilter_MediaId")]
- public class GroupMessageByGroupId_MpVideoData : BaseGroupMessageDataByGroupId
- {
- public GroupMessageByGroupId_MediaId mpvideo { get; set; }
- }
- [Obsolete("请使用GroupMessageByFilter_MediaId")]
- public class GroupMessageByGroupId_WxCardData : BaseGroupMessageDataByGroupId
- {
- public GroupMessageByGroupId_WxCard wxcard { get; set; }
- }
- #endregion
- }
在 GroupMessageApi 中的使用上同样保持了向下兼容,根据 GroupId 和 TagId 群发的接口分别为 SendGroupMessageByGroupId() 以及 SendGroupMessageByTagId(),底层共同调用同一个私有方法 SendGroupMessageByFilter() :
- /// <summary>
- /// 根据分组或标签进行群发【订阅号与服务号认证后均可用】
- ///
- /// 请注意:
- /// 1、该接口暂时仅提供给已微信认证的服务号
- /// 2、虽然开发者使用高级群发接口的每日调用限制为100次,但是用户每月只能接收4条,请小心测试
- /// 3、无论在公众平台网站上,还是使用接口群发,用户每月只能接收4条群发消息,多于4条的群发将对该用户发送失败。
- /// 4、群发视频时需要先调用GetVideoMediaIdResult接口获取专用的MediaId然后进行群发
- ///
- /// </summary>
- /// <param name="accessTokenOrAppId">AccessToken或AppId(推荐使用AppId,需要先注册)</param>
- /// <param name="groupId">群发到的分组的group_id,参见用户管理中用户分组接口,若is_to_all值为true,可不填写group_id;如果groupId和tagId同时填写,优先使用groupId;groupId和tagId最多只能使用一个</param>
- /// <param name="tagId">群发到的标签的tag_id,若is_to_all值为true,可不填写tag_id;如果groupId和tagId同时填写,优先使用groupId;groupId和tagId最多只能使用一个</param>
- /// <param name="value">群发媒体文件时传入mediaId,群发文本消息时传入content,群发卡券时传入cardId</param>
- /// <param name="type"></param>
- /// <param name="isToAll">用于设定是否向全部用户发送,值为true或false,选择true该消息群发给所有用户,选择false可根据group_id发送给指定群组的用户</param>
- /// <param name="sendIgnoreReprint">待群发的文章被判定为转载时,是否继续群发</param>
- /// <param name="timeOut">代理请求超时时间(毫秒)</param>
- /// <returns></returns>
- private static SendResult SendGroupMessageByFilter(string accessTokenOrAppId, string groupId, string tagId, string value, GroupMessageType type, bool isToAll = false, bool sendIgnoreReprint = false, int timeOut = Config.TIME_OUT)
- {
- return ApiHandlerWapper.TryCommonApi(accessToken =>
- {
- string urlFormat = Config.ApiMpHost + "/cgi-bin/message/mass/sendall?access_token={0}";
- BaseGroupMessageDataByFilter baseData = null;
- BaseGroupMessageByFilter filter = null;
- if (groupId.IsNullOrEmpty())
- {
- filter = new GroupMessageByGroupId()
- {
- group_id = groupId,
- is_to_all = isToAll,
- };
- }
- else
- {
- filter = new GroupMessageByTagId()
- {
- tag_id = tagId,
- is_to_all = isToAll,
- };
- }
- switch (type)
- {
- case GroupMessageType.image:
- baseData = new GroupMessageByFilter_ImageData()
- {
- filter = filter,
- image = new GroupMessageByGroupId_MediaId()
- {
- media_id = value
- },
- msgtype = "image"
- };
- break;
- case GroupMessageType.voice:
- baseData = new GroupMessageByFilter_VoiceData()
- {
- filter = filter,
- voice = new GroupMessageByGroupId_MediaId()
- {
- media_id = value
- },
- msgtype = "voice"
- };
- break;
- case GroupMessageType.mpnews:
- baseData = new GroupMessageByFilter_MpNewsData()
- {
- filter = filter,
- mpnews = new GroupMessageByGroupId_MediaId()
- {
- media_id = value
- },
- msgtype = "mpnews"
- };
- break;
- case GroupMessageType.video:
- baseData = new GroupMessageByFilter_MpVideoData()
- {
- filter = filter,
- mpvideo = new GroupMessageByGroupId_MediaId()
- {
- media_id = value
- },
- msgtype = "mpvideo"
- };
- break;
- case GroupMessageType.wxcard:
- baseData = new GroupMessageByFilter_WxCardData()
- {
- filter = filter,
- wxcard = new GroupMessageByGroupId_WxCard()
- {
- card_id = value
- },
- msgtype = "wxcard"
- };
- break;
- case GroupMessageType.text:
- baseData = new GroupMessageByFilter_TextData()
- {
- filter = filter,
- text = new GroupMessageByGroupId_Content()
- {
- content = value
- },
- msgtype = "text"
- };
- break;
- default:
- throw new Exception("参数错误。");
- //break;
- }
- baseData.send_ignore_reprint = sendIgnoreReprint ? : ;//待群发的文章被判定为转载时,是否继续群发
- return CommonJsonSend.Send<SendResult>(accessToken, urlFormat, baseData, timeOut: timeOut);
- }, accessTokenOrAppId);
- }
本次更新同时更新了对应的异步方法。
[升级说明] Senparc.Weixin.MP v14.8.11 (微信群发接口调整)的更多相关文章
- [公告]Senparc.Weixin.MP v14.2.1 升级说明
在Senparc.Weixin.MP v14.2.1中,所有Senparc.Weixin.MP下的Container,命名空间已经从 Senparc.Weixin.MP.CommonAPIs 改为了 ...
- [公告][重要]Senparc.Weixin v4.9.0 & Senparc.Weixin.MP v14.3.104更新说明
本次升级除了更新了发红包接口等接口之外,最重要的是重构了缓存模块. 如何升级? 之前的缓存是为Container设计的,原先的ContainerCacheStrategy继承自BaseCacheStr ...
- Senparc.Weixin.MP SDK 微信公众平台开发教程(八):通用接口说明
一.基础说明 这里说的“通用接口(CommonAPIs)”是使用微信公众账号一系列高级功能的必备验证功能(应用于开发模式). 我们通过微信后台唯一的凭证,向通用接口发出请求,得到访问令牌(Access ...
- 微信公众账号 Senparc.Weixin.MP SDK 开发教程 索引
Senparc.Weixin.MP SDK从一开始就坚持开源的状态,这个过程中得到了许多朋友的认可和支持. 目前SDK已经达到比较稳定的版本,这个过程中我觉得有必要整理一些思路和经验,和大家一起分享. ...
- 微信公众平台C# SDK:Senparc.Weixin.MP.dll
https://github.com/Senparc/WeiXinMPSDK [转] http://www.cnblogs.com/szw/archive/2013/01/13/senparc-wei ...
- Senparc.Weixin.MP SDK 微信公众平台开发教程(十七):个性化菜单接口说明
前不久微信上线了个性化菜单接口,Senparc.Weixin SDK也已经同步更新. 本次更新升级Senparc.Weixin.MP版本到v13.5.2,依赖Senparc.Weixin版本4.5.4 ...
- Senparc.Weixin.MP SDK 微信公众平台开发教程(五):使用Senparc.Weixin.MP SDK
Senparc.Weixin.MP SDK已经涵盖了微信6.x的所有公共API. 整个项目的源代码以及已经编译好的程序集可以在这个项目中获取到:https://github.com/JeffreySu ...
- Senparc.Weixin.MP SDK 微信公众平台开发教程(十六):AccessToken自动管理机制
在<Senparc.Weixin.MP SDK 微信公众平台开发教程(八):通用接口说明>中,我介绍了获取AccessToken(通用接口)的方法. 在实际的开发过程中,所有的高级接口都需 ...
- 【转】微信公众账号 Senparc.Weixin.MP SDK 开发教程 索引
微信公众账号 Senparc.Weixin.MP SDK 开发教程 索引 Senparc.Weixin.MP SDK从一开始就坚持开源的状态,这个过程中得到了许多朋友的认可和支持. 目前SDK已经达到 ...
随机推荐
- python的argpare和click模块详解
一.argparse模块 1.模块说明 # argparse是python的标准库中用来解析命令行参数的模块,用来替代已经过时的optparse模块,argparse能够根据程序中的定义的sys.ar ...
- [leetcode]66. Plus One加一
Given a non-empty array of digits representing a non-negative integer, plus one to the integer. The ...
- OO第一次blog
(1)基于度量来分析自己的程序结构 第一次:Poly:属性 AL<Term>方法 check(格式检查) Poly(构造) merge(合并) compute(求导) Term:属性 co ...
- jquery点击回到顶部
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- pycharm 有些模块没有提示 解决方法
解决方法:右键模块所在文件夹,选择make directory as ,选择excluded或者sources root,即可.
- 面试简单整理之web
63.servlet是什么?运行过程? Servlet是一门用于开发动态web资源的技术. 运行过程: Servlet程序是由WEB服务器调用,web服务器收到客户端的Servlet访问请求后: ①W ...
- my new blog
博客迁移至: https://www.dboop.com/
- Dynamics AX 中的图片处理
1.从本地读取图片文件,并判断格式是否附合要求. FilenameFilter filter = [‘Image Files‘,‘*.bmp;*.jpg;*.gif;*.jpeg‘]; BinData ...
- jira6.3.6创建问题不自动发邮件通知的问题
装完jira6.3.6后,设置好邮件服务器,测试没有问题.但是创建问题不自动发邮件提示用户.折腾了大半天,请教了一位大神,终于搞定.步骤是: agile->系统->用户界面->用户缺 ...
- hadoop教程
http://www.yiibai.com/hadoop/hadoop_enviornment_setup.html 改网站讲解详细,还有源码,值得借阅