升级内容:添加根据标签群发接口,重构原根据分组群发接口

 参考微信文档https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1481187827_i0l21

 说明

之前 SDK 只提供了根据用户组群发的方法:

  1. GroupMessageApi.SendGroupMessageByGroupId();

由于根据分组和标签群发两种情况,逻辑基本一致,只有一个filter参数不同,因此我们创建了 BaseGroupMessageDataByFilter 基类,用于支持 GroupMessageByGroupId 和 GroupMessageByTagId。

BaseGroupMessageByFilter 代码如下:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. namespace Senparc.Weixin.MP.AdvancedAPIs.GroupMessage
  8. {
  9. /// <summary>
  10. /// 根据筛选条件(GroupId、TagId)群发消息数据的基类
  11. /// </summary>
  12. public abstract class BaseGroupMessageByFilter
  13. {
  14. public bool is_to_all { get; set; }
  15. }
  16.  
  17. public class BaseGroupMessageDataByFilter
  18. {
  19. public BaseGroupMessageByFilter filter { get; set; }
  20.  
  21. public string msgtype { get; set; }
  22.  
  23. /// <summary>
  24. /// 群发接口新增 send_ignore_reprint 参数,开发者可以对群发接口的 send_ignore_reprint 参数进行设置,指定待群发的文章被判定为转载时,是否继续群发。
  25. /// 当 send_ignore_reprint 参数设置为1时,文章被判定为转载时,且原创文允许转载时,将继续进行群发操作。
  26. /// 当 send_ignore_reprint 参数设置为0时,文章被判定为转载时,将停止群发操作。
  27. /// send_ignore_reprint 默认为0。
  28. /// </summary>
  29. public int send_ignore_reprint { get; set; }
  30. }
  31.  
  32. public class GroupMessageByFilter_MediaId
  33. {
  34. public string media_id { get; set; }
  35. }
  36.  
  37. public class GroupMessageByFilter_Content
  38. {
  39. public string content { get; set; }
  40. }
  41.  
  42. public class GroupMessageByFilter_WxCard
  43. {
  44. public string card_id { get; set; }
  45. }
  46.  
  47. public class GroupMessageByFilter_VoiceData : BaseGroupMessageDataByFilter
  48. {
  49. public GroupMessageByGroupId_MediaId voice { get; set; }
  50. }
  51.  
  52. public class GroupMessageByFilter_ImageData : BaseGroupMessageDataByFilter
  53. {
  54. public GroupMessageByGroupId_MediaId image { get; set; }
  55. }
  56.  
  57. public class GroupMessageByFilter_TextData : BaseGroupMessageDataByFilter
  58. {
  59. public GroupMessageByGroupId_Content text { get; set; }
  60. }
  61.  
  62. public class GroupMessageByFilter_MpNewsData : BaseGroupMessageDataByFilter
  63. {
  64. public GroupMessageByGroupId_MediaId mpnews { get; set; }
  65. }
  66.  
  67. public class GroupMessageByFilter_MpVideoData : BaseGroupMessageDataByFilter
  68. {
  69. public GroupMessageByGroupId_MediaId mpvideo { get; set; }
  70. }
  71.  
  72. public class GroupMessageByFilter_WxCardData : BaseGroupMessageDataByFilter
  73. {
  74. public GroupMessageByGroupId_WxCard wxcard { get; set; }
  75. }
  76. }

GroupMessageByTagId 代码如下:

  1. namespace Senparc.Weixin.MP.AdvancedAPIs.GroupMessage
  2. {
  3. /// <summary>
  4. /// 根据 TagId 群发筛选
  5. /// </summary>
  6. public class GroupMessageByTagId : BaseGroupMessageByFilter
  7. {
  8. public string tag_id { get; set; }
  9. }
  10. }

GroupMessageByGroupId 代码如下(包含已经弃用的代码),为了保障向下兼容性,标记了[Obsolete]特性:

  1. namespace Senparc.Weixin.MP.AdvancedAPIs.GroupMessage
  2. {
  3. /// <summary>
  4. /// 根据GroupId群发筛选
  5. /// </summary>
  6. public class GroupMessageByGroupId : BaseGroupMessageByFilter
  7. {
  8. public string group_id { get; set; }
  9. }
  10.  
  11. #region 已废弃
  12.  
  13. [Obsolete("请使用GroupMessageByGroupId")]
  14. public class GroupMessageByGroupId_GroupId : BaseGroupMessageByFilter
  15. {
  16. public string group_id { get; set; }
  17. }
  18.  
  19. /// <summary>
  20. /// 根据GroupId群发消息筛选
  21. /// </summary>
  22. [Obsolete("请使用BaseGroupMessageDataByFilter")]
  23. public class BaseGroupMessageDataByGroupId : BaseGroupMessageDataByFilter
  24. {
  25.  
  26. }
  27.  
  28. [Obsolete("请使用GroupMessageByFilter_MediaId")]
  29. public class GroupMessageByGroupId_MediaId
  30. {
  31. public string media_id { get; set; }
  32. }
  33.  
  34. [Obsolete("请使用GroupMessageByFilter_MediaId")]
  35. public class GroupMessageByGroupId_Content
  36. {
  37. public string content { get; set; }
  38. }
  39.  
  40. [Obsolete("请使用GroupMessageByFilter_MediaId")]
  41. public class GroupMessageByGroupId_WxCard
  42. {
  43. public string card_id { get; set; }
  44. }
  45.  
  46. [Obsolete("请使用GroupMessageByFilter_MediaId")]
  47. public class GroupMessageByGroupId_VoiceData : BaseGroupMessageDataByGroupId
  48. {
  49. public GroupMessageByGroupId_MediaId voice { get; set; }
  50. }
  51.  
  52. [Obsolete("请使用GroupMessageByFilter_MediaId")]
  53. public class GroupMessageByGroupId_ImageData : BaseGroupMessageDataByGroupId
  54. {
  55. public GroupMessageByGroupId_MediaId image { get; set; }
  56. }
  57.  
  58. [Obsolete("请使用GroupMessageByFilter_MediaId")]
  59. public class GroupMessageByGroupId_TextData : BaseGroupMessageDataByGroupId
  60. {
  61. public GroupMessageByGroupId_Content text { get; set; }
  62. }
  63.  
  64. [Obsolete("请使用GroupMessageByFilter_MediaId")]
  65. public class GroupMessageByGroupId_MpNewsData : BaseGroupMessageDataByGroupId
  66. {
  67. public GroupMessageByGroupId_MediaId mpnews { get; set; }
  68. }
  69.  
  70. [Obsolete("请使用GroupMessageByFilter_MediaId")]
  71. public class GroupMessageByGroupId_MpVideoData : BaseGroupMessageDataByGroupId
  72. {
  73. public GroupMessageByGroupId_MediaId mpvideo { get; set; }
  74. }
  75.  
  76. [Obsolete("请使用GroupMessageByFilter_MediaId")]
  77. public class GroupMessageByGroupId_WxCardData : BaseGroupMessageDataByGroupId
  78. {
  79. public GroupMessageByGroupId_WxCard wxcard { get; set; }
  80. }
  81.  
  82. #endregion
  83.  
  84. }

在 GroupMessageApi 中的使用上同样保持了向下兼容,根据 GroupId 和 TagId 群发的接口分别为 SendGroupMessageByGroupId() 以及 SendGroupMessageByTagId(),底层共同调用同一个私有方法 SendGroupMessageByFilter() :

  1. /// <summary>
  2. /// 根据分组或标签进行群发【订阅号与服务号认证后均可用】
  3. ///
  4. /// 请注意:
  5. /// 1、该接口暂时仅提供给已微信认证的服务号
  6. /// 2、虽然开发者使用高级群发接口的每日调用限制为100次,但是用户每月只能接收4条,请小心测试
  7. /// 3、无论在公众平台网站上,还是使用接口群发,用户每月只能接收4条群发消息,多于4条的群发将对该用户发送失败。
  8. /// 4、群发视频时需要先调用GetVideoMediaIdResult接口获取专用的MediaId然后进行群发
  9. ///
  10. /// </summary>
  11. /// <param name="accessTokenOrAppId">AccessToken或AppId(推荐使用AppId,需要先注册)</param>
  12. /// <param name="groupId">群发到的分组的group_id,参见用户管理中用户分组接口,若is_to_all值为true,可不填写group_id;如果groupId和tagId同时填写,优先使用groupId;groupId和tagId最多只能使用一个</param>
  13. /// <param name="tagId">群发到的标签的tag_id,若is_to_all值为true,可不填写tag_id;如果groupId和tagId同时填写,优先使用groupId;groupId和tagId最多只能使用一个</param>
  14. /// <param name="value">群发媒体文件时传入mediaId,群发文本消息时传入content,群发卡券时传入cardId</param>
  15. /// <param name="type"></param>
  16. /// <param name="isToAll">用于设定是否向全部用户发送,值为true或false,选择true该消息群发给所有用户,选择false可根据group_id发送给指定群组的用户</param>
  17. /// <param name="sendIgnoreReprint">待群发的文章被判定为转载时,是否继续群发</param>
  18. /// <param name="timeOut">代理请求超时时间(毫秒)</param>
  19. /// <returns></returns>
  20. 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)
  21. {
  22. return ApiHandlerWapper.TryCommonApi(accessToken =>
  23. {
  24. string urlFormat = Config.ApiMpHost + "/cgi-bin/message/mass/sendall?access_token={0}";
  25.  
  26. BaseGroupMessageDataByFilter baseData = null;
  27. BaseGroupMessageByFilter filter = null;
  28. if (groupId.IsNullOrEmpty())
  29. {
  30. filter = new GroupMessageByGroupId()
  31. {
  32. group_id = groupId,
  33. is_to_all = isToAll,
  34. };
  35. }
  36. else
  37. {
  38. filter = new GroupMessageByTagId()
  39. {
  40. tag_id = tagId,
  41. is_to_all = isToAll,
  42. };
  43. }
  44.  
  45. switch (type)
  46. {
  47. case GroupMessageType.image:
  48. baseData = new GroupMessageByFilter_ImageData()
  49. {
  50. filter = filter,
  51. image = new GroupMessageByGroupId_MediaId()
  52. {
  53. media_id = value
  54. },
  55. msgtype = "image"
  56. };
  57. break;
  58. case GroupMessageType.voice:
  59. baseData = new GroupMessageByFilter_VoiceData()
  60. {
  61. filter = filter,
  62. voice = new GroupMessageByGroupId_MediaId()
  63. {
  64. media_id = value
  65. },
  66. msgtype = "voice"
  67. };
  68. break;
  69. case GroupMessageType.mpnews:
  70. baseData = new GroupMessageByFilter_MpNewsData()
  71. {
  72. filter = filter,
  73. mpnews = new GroupMessageByGroupId_MediaId()
  74. {
  75. media_id = value
  76. },
  77. msgtype = "mpnews"
  78. };
  79. break;
  80. case GroupMessageType.video:
  81. baseData = new GroupMessageByFilter_MpVideoData()
  82. {
  83. filter = filter,
  84. mpvideo = new GroupMessageByGroupId_MediaId()
  85. {
  86. media_id = value
  87. },
  88. msgtype = "mpvideo"
  89. };
  90. break;
  91. case GroupMessageType.wxcard:
  92. baseData = new GroupMessageByFilter_WxCardData()
  93. {
  94. filter = filter,
  95. wxcard = new GroupMessageByGroupId_WxCard()
  96. {
  97. card_id = value
  98. },
  99. msgtype = "wxcard"
  100. };
  101. break;
  102. case GroupMessageType.text:
  103. baseData = new GroupMessageByFilter_TextData()
  104. {
  105. filter = filter,
  106. text = new GroupMessageByGroupId_Content()
  107. {
  108. content = value
  109. },
  110. msgtype = "text"
  111. };
  112. break;
  113. default:
  114. throw new Exception("参数错误。");
  115. //break;
  116. }
  117.  
  118. baseData.send_ignore_reprint = sendIgnoreReprint ? : ;//待群发的文章被判定为转载时,是否继续群发
  119.  
  120. return CommonJsonSend.Send<SendResult>(accessToken, urlFormat, baseData, timeOut: timeOut);
  121.  
  122. }, accessTokenOrAppId);
  123. }

本次更新同时更新了对应的异步方法。

[升级说明] Senparc.Weixin.MP v14.8.11 (微信群发接口调整)的更多相关文章

  1. [公告]Senparc.Weixin.MP v14.2.1 升级说明

    在Senparc.Weixin.MP v14.2.1中,所有Senparc.Weixin.MP下的Container,命名空间已经从 Senparc.Weixin.MP.CommonAPIs 改为了  ...

  2. [公告][重要]Senparc.Weixin v4.9.0 & Senparc.Weixin.MP v14.3.104更新说明

    本次升级除了更新了发红包接口等接口之外,最重要的是重构了缓存模块. 如何升级? 之前的缓存是为Container设计的,原先的ContainerCacheStrategy继承自BaseCacheStr ...

  3. Senparc.Weixin.MP SDK 微信公众平台开发教程(八):通用接口说明

    一.基础说明 这里说的“通用接口(CommonAPIs)”是使用微信公众账号一系列高级功能的必备验证功能(应用于开发模式). 我们通过微信后台唯一的凭证,向通用接口发出请求,得到访问令牌(Access ...

  4. 微信公众账号 Senparc.Weixin.MP SDK 开发教程 索引

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

  5. 微信公众平台C# SDK:Senparc.Weixin.MP.dll

    https://github.com/Senparc/WeiXinMPSDK [转] http://www.cnblogs.com/szw/archive/2013/01/13/senparc-wei ...

  6. Senparc.Weixin.MP SDK 微信公众平台开发教程(十七):个性化菜单接口说明

    前不久微信上线了个性化菜单接口,Senparc.Weixin SDK也已经同步更新. 本次更新升级Senparc.Weixin.MP版本到v13.5.2,依赖Senparc.Weixin版本4.5.4 ...

  7. Senparc.Weixin.MP SDK 微信公众平台开发教程(五):使用Senparc.Weixin.MP SDK

    Senparc.Weixin.MP SDK已经涵盖了微信6.x的所有公共API. 整个项目的源代码以及已经编译好的程序集可以在这个项目中获取到:https://github.com/JeffreySu ...

  8. Senparc.Weixin.MP SDK 微信公众平台开发教程(十六):AccessToken自动管理机制

    在<Senparc.Weixin.MP SDK 微信公众平台开发教程(八):通用接口说明>中,我介绍了获取AccessToken(通用接口)的方法. 在实际的开发过程中,所有的高级接口都需 ...

  9. 【转】微信公众账号 Senparc.Weixin.MP SDK 开发教程 索引

    微信公众账号 Senparc.Weixin.MP SDK 开发教程 索引 Senparc.Weixin.MP SDK从一开始就坚持开源的状态,这个过程中得到了许多朋友的认可和支持. 目前SDK已经达到 ...

随机推荐

  1. python的argpare和click模块详解

    一.argparse模块 1.模块说明 # argparse是python的标准库中用来解析命令行参数的模块,用来替代已经过时的optparse模块,argparse能够根据程序中的定义的sys.ar ...

  2. [leetcode]66. Plus One加一

    Given a non-empty array of digits representing a non-negative integer, plus one to the integer. The ...

  3. OO第一次blog

    (1)基于度量来分析自己的程序结构 第一次:Poly:属性 AL<Term>方法 check(格式检查) Poly(构造) merge(合并) compute(求导) Term:属性 co ...

  4. jquery点击回到顶部

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. pycharm 有些模块没有提示 解决方法

    解决方法:右键模块所在文件夹,选择make directory as ,选择excluded或者sources root,即可.

  6. 面试简单整理之web

    63.servlet是什么?运行过程? Servlet是一门用于开发动态web资源的技术. 运行过程: Servlet程序是由WEB服务器调用,web服务器收到客户端的Servlet访问请求后: ①W ...

  7. my new blog

    博客迁移至: https://www.dboop.com/

  8. Dynamics AX 中的图片处理

    1.从本地读取图片文件,并判断格式是否附合要求. FilenameFilter filter = [‘Image Files‘,‘*.bmp;*.jpg;*.gif;*.jpeg‘]; BinData ...

  9. jira6.3.6创建问题不自动发邮件通知的问题

    装完jira6.3.6后,设置好邮件服务器,测试没有问题.但是创建问题不自动发邮件提示用户.折腾了大半天,请教了一位大神,终于搞定.步骤是: agile->系统->用户界面->用户缺 ...

  10. hadoop教程

    http://www.yiibai.com/hadoop/hadoop_enviornment_setup.html 改网站讲解详细,还有源码,值得借阅