[升级说明] Senparc.Weixin.MP v14.8.11 (微信群发接口调整)

时间:2022-01-28 19:08:27

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

 参考微信文档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 (微信群发接口调整)的更多相关文章

  1. &lbrack;公告&rsqb;Senparc&period;Weixin&period;MP v14&period;2&period;1 升级说明

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

  2. &lbrack;公告&rsqb;&lbrack;重要&rsqb;Senparc&period;Weixin v4&period;9&period;0 &amp&semi; Senparc&period;Weixin&period;MP v14&period;3&period;104更新说明

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

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

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

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

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

  5. 微信公众平台C&num; SDK:Senparc&period;Weixin&period;MP&period;dll

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

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

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

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

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

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

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

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

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

随机推荐

  1. 大熊君说说JS与设计模式之------命令模式Command

    一,总体概要 1,笔者浅谈 日常生活中,我们在看电视的时候,通过遥控器选择我们喜欢的频道时,此时我们就是客户端的角色,遥控器的按钮相当于客户请求,而具体执行的对象就是命令对象, 命令模式把一个请求或者 ...

  2. iOS开发:视图生命周期

    iOS应用的视图状态分为以下几种 在viewcontroller的父类UIViewController中可以看到如下代码,通过重写不同的方法对操作视图渲染. @available(iOS 2.0, * ...

  3. 【转】Android bluetooth介绍(二): android blueZ蓝牙代码架构及其uart 到rfcomm流程

    原文网址:http://blog.sina.com.cn/s/blog_602c72c50102uzoj.html 关键词:蓝牙blueZ  UART  HCI_UART H4  HCI  L2CAP ...

  4. Photoshop基础,前景背景,图层,选取

    1*前景色背景色 Alt+Delete 键 前景色填充 Ctrl+Delete 键 背景色填充 X 颜色转换 D 颜色互换 两个填充的原因: 2*图层(只要做东西就要建图层)透明的纸进行叠加,尽量多建 ...

  5. Java中的String类型

    1.基本类型和引用类型 在C语言里面,是有指针这么一个变量类型的,指针变量保存的就是所要指向内容的地址.在Java里面,没有了指针的这么个说法,而是换了一个词:引用类型变量. 先说Java里面的基本类 ...

  6. &period;net core WebApi Monitor实现并发同步

    在.net中,还可以使用Monitor实现线程并发同步.Monitor类是纯托管且完全可移植,并且可能会在操作系统资源需求方面更加高效. Monitor的锁对象尽可能使用引用对象,如果是字符串或值对象 ...

  7. 17秋 软件工程 团队第五次作业 Alpha Scrum9

    17秋 软件工程 团队第五次作业 Alpha Scrum9 今日完成的任务 世强:APP后端部门申请状态: 港晨:主页面代码实现: 树民:完善超级管理员web后端: 伟航:设置页面和侧边栏的原型: 陈 ...

  8. LCA&amp&semi;最小生成树

    LCA 经常被用来使用.比如询问树两点之间的距离. 比如树上差分 都是经常被使用的类型.有的时候倍增求LCA的同时还可以优化算法. 这道题呢 求一个严格的最小生成树,当然如果不严格的话如果有重边那么就 ...

  9. 【LibreOJ】&num;6395&period; 「THUPC2018」城市地铁规划 &sol; City 背包DP&plus;Prufer序

    [题目]#6395. 「THUPC2018」城市地铁规划 / City [题意]给定n个点要求构造一棵树,每个点的价值是一个关于点度的k次多项式,系数均为给定的\(a_0,...a_k\),求最大价值 ...

  10. 【百度统计】设置页面元素点击事件转化pv、uv

    html元素点击事件内添加代码:_hmt.push(['_trackEvent', category, action, opt_label, opt_value]); 1. '_trackEvent' ...