前段时间用Senparc做微信开发,但是个人感觉不太好用,所以我把Senparc的API用装饰器模式进行二次封装。

微信开发者平台文档地址:https://mp.weixin.qq.com/wiki

0x00

先上一个抽象类,对各种类型消息的抽象封装

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Senparc.Weixin.QY;
using Senparc.Weixin.QY.AdvancedAPIs;
using Senparc.Weixin.QY.AdvancedAPIs.Mass;
using Senparc.Weixin.QY.Entities;
using Senparc.Weixin;namespace WeiXin
{public abstract class MsgHandler{/// <summary>/// 该消息的RID/// </summary>public String RID { get; set; }/// <summary>/// 接受者/// </summary>public String ToUser { get; set; }/// <summary>/// 接收部门/// </summary>public String ToParty { get; set; }/// <summary>/// 标签/// </summary>public String ToTag { get; set; }/// <summary>/// 消息类型/// </summary>public MsgType MsgType { get; set; }/// <summary>/// 应用ID/// </summary>public String AgentID { get; set; }/// <summary>/// 是否加密/// </summary>public int Safe { get; set; }/// <summary>/// 发送数据/// </summary>/// <returns></returns>public abstract MassResult SendMsg();/// <summary>/// 写入Log表/// </summary>public void Log(MassResult Result) { StringBuilder sb = new StringBuilder();sb.AppendFormat("update Msg set IsSuccess = {0} where RID = '{1}'", Result.errcode == Senparc.Weixin.ReturnCode_QY.请求成功 ? 1 : (int)Result.errcode, this.RID);SqlHelper.ExecuteCommand(sb.ToString());}}
}

0x01

用枚举区分消息类型

    public enum MsgType{TextMsg = 1,ImageMsg = 2,VoiceMsg = 3,VideoMsg = 4,FileMsg = 5,NewsMsg = 6,MpNewsMsg = 7}

0x02

按照每种消息类型进行详细封装

public partial class TextMsgHandler : MsgHandler{/// <summary>/// 文本消息/// </summary>private String Text { get; set; }/// <summary>/// 构造/// </summary>public TextMsgHandler() {this.MsgType = MsgType.TextMsg;}/// <summary>/// 发送消息方法/// </summary>public override MassResult SendMsg(){MassResult Result = MassApi.SendText("", ToUser, ToUser, ToTag, AgentID, Text, Safe, 10000);return Result;}}

View Code

    public partial class ImageMsgHandler : MsgHandler{/// <summary>/// 媒体ID/// </summary>private String Media_ID { get; set; }/// <summary>/// 构造/// </summary>public ImageMsgHandler(){this.MsgType = MsgType.ImageMsg;}/// <summary>/// 发送消息方法/// </summary>public override MassResult SendMsg(){MassResult Result = MassApi.SendImage("", ToUser, ToParty, ToTag, AgentID, Media_ID, Safe, 10000);return Result;}}

View Code

public partial class VoiceMsgHandler : MsgHandler{/// <summary>/// 媒体ID/// </summary>private String Media_ID { get; set; }/// <summary>/// 构造/// </summary>public VoiceMsgHandler(){this.MsgType = MsgType.VoiceMsg;}/// <summary>/// 发送消息方法/// </summary>public override MassResult SendMsg(){MassResult Result = MassApi.SendVoice("", ToUser, ToParty, ToTag, AgentID, Media_ID, Safe, 10000);return Result;}}

View Code

    public partial class VideoMsgHandler : MsgHandler{/// <summary>/// 视频标题/// </summary>private String Title { get; set; }/// <summary>/// 视频描述/// </summary>private String Description { get; set; }/// <summary>/// 媒体ID/// </summary>private String Media_ID { get; set; }/// <summary>/// 构造/// </summary>public VideoMsgHandler(){this.MsgType = MsgType.VideoMsg;}/// <summary>/// 发送消息方法/// </summary>public override MassResult SendMsg(){MassResult Result = MassApi.SendVideo("", ToUser, ToParty, ToTag, AgentID, Media_ID, Title, Description, Safe, 10000);return Result;}}

View Code

    public partial class FileMsgHandler : MsgHandler{/// <summary>/// 媒体ID/// </summary>private String Media_ID { get; set; }/// <summary>/// 构造/// </summary>public FileMsgHandler(){this.MsgType = MsgType.FileMsg;}/// <summary>/// 发送消息方法/// </summary>public override MassResult SendMsg(){MassResult Result = MassApi.SendFile("", ToUser, ToParty, ToTag, AgentID, Media_ID,Safe,10000);return Result;}}

View Code

    public partial class NewsMsgHandler : MsgHandler{/// <summary>/// 新闻列表/// </summary>private List<Article> Articles { get; set; }/// <summary>/// 构造/// </summary>private NewsMsgHandler(){this.MsgType = MsgType.NewsMsg;}/// <summary>/// 发送消息方法/// </summary>public override MassResult SendMsg(){MassResult Result = MassApi.SendNews("", ToUser, ToParty, ToTag, AgentID, Articles, Safe, 10000);return Result;}}

View Code

public partial class MpNewsMsgHandler : MsgHandler{/// <summary>/// 新闻列表/// </summary>private List<MpNewsArticle> MpArticles { get; set; }/// <summary>/// 构造/// </summary>public MpNewsMsgHandler(){this.MsgType = MsgType.MpNewsMsg;}/// <summary>/// 发送消息方法/// </summary>public override MassResult SendMsg(){MassResult Result = MassApi.SendMpNews("", ToUser, ToParty, ToTag, AgentID, MpArticles, Safe, 10000);return Result;}}

View Code

0x03

创建消息处理器类,处理类主要管理Token等与消息无直接关系的信息,比如Token隔多久取一次,如何加密企业通信SecretCode,这里是部分主要的代码,用到了装饰器模式。

public class Processor{/// <summary>/// 抽象消息/// </summary>private MsgHandler Msg { get; set; }/// <summary>/// Token/// </summary>private String Token { get; set; }/// <summary>/// 处理器构造/// </summary>/// <param name="msg"></param>public Processor(MsgHandler msg){this.Msg = msg;}/// <summary>/// 发送消息/// </summary>public void SendMsg(){MassResult Result = Msg.SendMsg();       Msg.Log(Result);}}

0x03

Demo

class Program{static void Main(string[] args){TextMsgHandler textHandlder = new TextMsgHandler();textHandlder.RID = Guid.NewGuid().ToString();textHandlder.ToUser = "me";textHandlder.ToParty = "dev";textHandlder.ToTag = "ex";textHandlder.AgentID = "0";textHandlder.Text = "微信测试";Processor P = new Processor(textHandlder);  //装饰器模式
            P.SendMsg();}}

转载于:https://www.cnblogs.com/prettydone/p/6928056.html

基于Senparc的二次封装相关推荐

  1. Android基于Glide的二次封装,借鉴Glide思想二次封装Fresco

    最近封装了个 fresco 的组件库:dfresco,就顺便来讲讲. 背景 fresco 图片库很强大,我们项目中就是使用的 fresco,但有一点就是,不怎么好使用,略麻烦.不同项目中,多多少少都需 ...

  2. 基于Glide的二次封装

    更多代码可以查询本人GitHub:欢迎阅读,star点起来. Glide二次封装库源码 前言 为什么选择Glide? Glide 轻量级 速度快 可以根据所需加载图片的大小自动适配所需分辨率的图 支持 ...

  3. 基于axios的二次封装

    1. axios的封装前言 axios是一个基于 promise 的 HTTP 库,目前,在vue,react框架中也还是备受青睐,根据不同项目的业务,也有许多种不同的封装方法,但不同的应用场景,导致 ...

  4. Tree组件_基于elementUI的二次封装及自己原生开发的轮子

    因为害怕自己并非明珠而不敢刻苦琢磨,又因为有几分相信自己是明珠,而不敢庸庸碌碌,与石砾为伍 一. 需求 1. 左侧文件夹 / 部门 列表 节点有部门 和 文件夹 文件夹下只有文件夹 部门下 有部门和文 ...

  5. 基于element dialog二次封装弹窗组件

    实现效果 组件封装 <template><el-dialog:title="title":width="width":visible.sync ...

  6. java二次封装_基于OKhttp+Rxjava2+Retrofit进行二次封装

    概述 基于Retrofit进行二次封装,优雅的初始化设置.基于Okhttp拦截器和基础缓存,封装了无网络和其他所有场景的缓存策略支持,以及频繁调用请求的丢弃策略. 特性 1.基于Retrofit的二次 ...

  7. 【基于蜂鸟地图二次开发工具,方便开发者快速开发业务】

    基于蜂鸟地图二次开发工具 lmfmap v0.0.1 开发 lmfmap v0.0.1 基于蜂鸟地图二次封装的工具,让开发者用最少的代码开发自己的业务,让业务和地图解耦,业务提供数据地图提供接口交互 ...

  8. 基于Dapper二次封装了一个易用的ORM工具类:SqlDapperUtil

    基于Dapper二次封装了一个易用的ORM工具类:SqlDapperUtil,把日常能用到的各种CRUD都进行了简化封装,让普通程序员只需关注业务即可,因为非常简单,故直接贴源代码,大家若需使用可以直 ...

  9. antd picker 使用 如何_如何基于jsoneditor二次封装一个可实时预览的json编辑器组件?(react版)...

    前言 做为一名前端开发人员,掌握vue/react/angular等框架已经是必不可少的技能了,我们都知道,vue或react等MVVM框架提倡组件化开发,这样一方面可以提高组件复用性和可扩展性,另一 ...

最新文章

  1. 漫长的数据中心绿化之路到底该如何走www.shzhenai.com
  2. Python拼接多张图片
  3. *【ZOJ - 3604】Tunnel Network (Cayley定理,purfer数列,无根树定理,构造,结论,或dp)
  4. 瞎扯数学分析-微积分
  5. JMeter实现web接口测试实践举例
  6. ubuntu 16.04 R语言安装 rJava package失败解决方案
  7. cacti添加apache监控模板
  8. python将对象放入列表根据某个属性排升序_python实现对象列表根据某个属性排序的方法详解...
  9. 计算机软件技术基础_「连载」信息技术基础题型归纳之计算机软件2
  10. Knoll Light Factory 3.2 for mac完整汉化版|灯光工厂 for mac中文版
  11. 上海富勒wms_【3PL | 宝时物流应用富勒WMS,提升现代化仓储管理水平 】
  12. Python3爬虫韩寒新浪博客文章
  13. 阿里云等企业主导的龙蜥社区发起“龙腾计划”;OpenInfra 基金会推出 LOKI 标准;GitLab 14.6 发布 | 开源日报
  14. AC上网行为管理(深信服)
  15. 微信支付开发(1)--普通商户申请、账户验证、签约、公众号授权流程详解
  16. CSDN博客图片去水印
  17. 【导数术】4.三次函数
  18. python 类初学之 小猫
  19. 使用STM32CUBEMX HAL库读写SD卡
  20. gitlab关闭用户注册功能

热门文章

  1. vsftp虚拟帐户配置
  2. 如何分析竟争网站和优秀网站的设计风格
  3. php数组和列表,【PHP基础】1.1 所有数组函数分类与列表(目前可能不全)
  4. java 异常总结_Java异常的十大问题总结
  5. vconsole在手机真机模拟器上显示console控制台
  6. node js并发加载页面缓慢_详解如何利用前端Node模块zlib开启gzip压缩使页面加载速度更快...
  7. php数据结构之线性表,php数据结构之顺序链表与链式线性表示例
  8. Mongodb入门安装
  9. OnePill本地保存用户的结构
  10. 2020-08-09