概述

Magicodes.Wx.Sdk致力于打造最简洁最易于使用的微信Sdk,逐步包括公众号Sdk、小程序Sdk、企业微信Sdk等,以及Abp VNext集成。

本篇将侧重于讲述如何向Magicodes.Wx.Sdk进行贡献。

WebApiClientCore

Magicodes.Wx.Sdk之简洁很大层面依托于NCC的开源库WebApiClientCoreMagicodes.Wx.Sdk依托WebApiClientCore完成了微信接口的包装和校验。

开源库地址:https://github.com/dotnetcore/WebApiClient

快速开始

这里我们以【客服消息】【添加客服账号】为例进行讲解,官方接口文档地址为:https://developers.weixin.qq.com/doc/offiaccount/Customer_Service/Customer_Service_Management.html#2。

比如添加客服账号接口官方接口文档说明如下所示:

主体步骤如下:

1)添加接口IKfAccountApi

参考代码如下所示:

/// <summary>
/// 客服管理
/// </summary>
[HttpHost("https://api.weixin.qq.com/customservice/kfaccount/")]
public interface IKfAccountApi : IWxApiWithAccessTokenFilter
{
/// <summary>
/// 添加客服账号
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("add")]
Task<ApiResultBase> AddAsync(AddOrUpdateKfAccountInput input); /// <summary>
/// 设置客服信息
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("update")]
Task<ApiResultBase> UpdateAsync(AddOrUpdateKfAccountInput input); /// <summary>
/// 删除客服账号
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("del")]
Task<ApiResultBase> DelAsync(DelKfAccountInput input);
}

如上述代码所示,有几个注意事项:

  1. 需要定义接口

  2. 继承自IWxApiWithAccessTokenFilter接口将自动在接口请求启用AccessTokenApiFilter筛选器,即会自动会在接口请求时带上access_token。

  3. HttpHost用于定义接口跟地址

  4. HttpPost用于设置接口请求方法,常用特性有:

    特性名称 功能描述 备注
    HttpHostAttribute 请求服务http绝对完整主机域名 优先级比Options配置低
    HttpGetAttribute 声明Get请求方法与路径 支持null、绝对或相对路径
    HttpPostAttribute 声明Post请求方法与路径 支持null、绝对或相对路径
    HttpPutAttribute 声明Put请求方法与路径 支持null、绝对或相对路径
    HttpDeleteAttribute 声明Delete请求方法与路径 支持null、绝对或相对路径
    HeaderAttribute 声明请求头 常量值
    TimeoutAttribute 声明超时时间 常量值
    FormFieldAttribute 声明Form表单字段与值 常量键和值
    FormDataTextAttribute 声明FormData表单字段与值 常量键和值

2)添加Dto

这一步是非必要的,需要看参数的具体内容和要求。添加客服接口的输入参数代码参考如下:

 public class AddOrUpdateKfAccountInput
{
/// <summary>
/// 完整客服帐号,格式为:帐号前缀@公众号微信号,帐号前缀最多10个字符,必须是英文、数字字符或者下划线,后缀为公众号微信号,长度不超过30个字符
/// </summary>
[JsonProperty("kf_account")]
[StringLength(30, MinimumLength = 3)]
[Required]
public string Account { get; set; } /// <summary>
/// 客服昵称,最长16个字
/// </summary>
[JsonProperty("nickname")]
[StringLength(16, MinimumLength = 1)]
public string Nickname { get; set; }
}

Dto实体的添加这里给大家分享一个小技巧。当实体字段以及层级比较多时,大家可以使用VS的【编辑】==》【选择性粘贴】==》【将Json粘贴为类】:

3)添加ApiResultBase

框架中封装了默认的返回结果基类,如果没有其他额外的返回内容,仅需返回ApiResultBase即可。如果有额外的范围内容,则需要定义子类继承自ApiResultBase,在可能的情况下,有可能需要重写部分方法(比如IsSuccess)。如下述代码:

public class TokenApiResult : ApiResultBase
{
/// <summary>
/// 获取到的凭证
/// </summary>
[JsonProperty("access_token")]
public string AccessToken { get; set; } /// <summary>
/// 凭证有效时间,单位:秒
/// </summary>
[JsonProperty("expires_in")]
internal int Expires { get; set; } /// <summary>
/// 凭证过期时间
/// </summary>
public DateTime ExpiresTime { get; set; }
}

至此,一个接口就编写完成了。只需要定义interface和Dto就可以了。是不是非常简单?

4)单元测试编写

/// <summary>
/// 模板消息单元测试
/// </summary>
public class TemplateApiTest : TestBase, IClassFixture<TestWebApplicationFactory>
{
private readonly ITemplateApi templateApi;
public TemplateApiTest(TestWebApplicationFactory webApplicationFactory, ITestOutputHelper output) : base(webApplicationFactory, output)
{
//通过父类的GetRequiredService获取到Api
templateApi = GetRequiredService<ITemplateApi>();
} /// <summary>
/// 模板消息发送测试
/// </summary>
/// <returns></returns>
[Fact]
public async Task SendAsync_Test()
{
var result = await templateApi.SendAsync(new SendTemplateMessageInput()
{
To = "oXELNwzZgamuLS0JrJhVgdelzKyw",
TemplateId = "riid7aad8OKRQD9Ey6dclWBBkrqZSFDhlpKh0_spGLA",
Data = new System.Collections.Generic.Dictionary<string, TemplateDataItem>()
{
{"first",new TemplateDataItem("测试") },
{"keyword1",new TemplateDataItem("雪雁") },
{"keyword2",new TemplateDataItem("2021.2.5") },
{"remark",new TemplateDataItem("备注") },
}
});
//判断Api是否调用成功,未成功将抛出异常WxSdkException
result.EnsureSuccess();
}
}

整体参考:

https://github.com/xin-lai/Magicodes.Wx.Sdk/pull/1/commits/85263ed9a807581f7315a90fe6e00c51c994d386

其他须知内容

IWxApiWithAccessTokenFilter接口

IWxApiWithAccessTokenFilter接口用于定义需要携带公众号Acces sToken的接口。

如下述参考代码所示,其启用了AccessTokenApiFilter筛选器,以及关闭了AcceptContentType的匹配约束(公众号的接口官方写的一塌糊涂,很不规范)。

参考代码:

/// <summary>
///
/// </summary>
[JsonNetReturn(EnsureMatchAcceptContentType = false)]
[AccessTokenApiFilter]
//[LoggingFilter]
public interface IWxApiWithAccessTokenFilter
{
}

AccessTokenApiFilter筛选器

AccessTokenApiFilter接口筛选器会在启用的API、Action上自动添加access_token参数值。

参考代码如下所示:

public class AccessTokenApiFilter : ApiFilterAttribute
{
public override async Task OnRequestAsync(ApiRequestContext context)
{
ITokenManager tokenManager = context.HttpContext.ServiceProvider.GetRequiredService<ITokenManager>();
string accessToken = await tokenManager.GetAccessTokenAsync();
context.HttpContext.RequestMessage.AddUrlQuery("access_token", accessToken);
} public override Task OnResponseAsync(ApiResponseContext context)
{
return Task.CompletedTask;
}
}

关于ApiResultBase

ApiResultBase定义了公众号API返回基类,用于接收错误码、错误消息、是否执行成功的判断以及获取友好消息提示。

参考代码:

/// <summary>
/// API请求结果
/// {"errcode":40164,"errmsg":"invalid ip 218.76.8.29 ipv6 ::ffff:218.76.8.29, not in whitelist rid: 60122c35-705c3134-51b45a3d"}
/// </summary>
public class ApiResultBase
{
/// <summary>
/// 返回码
/// </summary>
[JsonProperty("errcode")]
public virtual ReturnCodes ReturnCode { get; set; } /// <summary>
/// 错误消息
/// </summary>
[JsonProperty("errmsg")]
public virtual string Message { get; set; } /// <summary>
/// 是否为成功返回
/// </summary>
/// <returns></returns>
public virtual bool IsSuccess()
{
return ReturnCode == ReturnCodes.请求成功;
} /// <summary>
/// 获取友好提示
/// </summary>
/// <returns></returns>
public virtual string GetFriendlyMessage()
{
return ReturnCode.ToString();
}
}
 

如何快速编写一个微信Api?的更多相关文章

  1. FastAPI 快速搭建一个REST API 服务

    最近正好在看好的接口文档方便的工具, 突然看到这个, 试了一下确实挺方便 快速示例 from fastapi import FastAPI from pydantic import BaseModel ...

  2. 编写一个微信小程序

    1.创建项目 2.创建目录及文件,结构如下:

  3. JAVA WEB快速入门之从编写一个基于SpringBoot+Mybatis快速创建的REST API项目了解SpringBoot、SpringMVC REST API、Mybatis等相关知识

    JAVA WEB快速入门系列之前的相关文章如下:(文章全部本人[梦在旅途原创],文中内容可能部份图片.代码参照网上资源) 第一篇:JAVA WEB快速入门之环境搭建 第二篇:JAVA WEB快速入门之 ...

  4. 微信小程序开发—快速掌握组件及API的方法

    微信小程序框架为开发者提供了一系列的组件和API接口. 组件主要完成小程序的视图部分,例如文字.图片显示.API主要完成逻辑功能,例如网络请求.数据存储.音视频播放控制,以及微信开放的微信登录.微信支 ...

  5. 微信小程序开发—快速掌握组件及API的方法---转载

    微信小程序框架为开发者提供了一系列的组件和API接口. 组件主要完成小程序的视图部分,例如文字.图片显示.API主要完成逻辑功能,例如网络请求.数据存储.音视频播放控制,以及微信开放的微信登录.微信支 ...

  6. 如何快速地开发一个微信小程序

    如何快速地开发一个微信小程序呢?我觉得作为初学者,最好能有一个模板,然后改这个模板. 同样作为初学者,刚开始的时候我有下面的几个问题,后来通过问同学,我弄清楚了. 微信小程序可以连接MySQL或者Sq ...

  7. 通过beego快速创建一个Restful风格API项目及API文档自动化

    通过beego快速创建一个Restful风格API项目及API文档自动化 本文演示如何快速(一分钟内,不写一行代码)的根据数据库及表创建一个Restful风格的API项目,及提供便于在线测试API的界 ...

  8. 一个用得比较广的微信API的XXE外部实体注入漏洞

    文件地址: https://github.com/dodgepudding/wechat-php-sdk/raw/master/wechat.class.php 代码: <?php /** * ...

  9. JAVA WEB快速入门之从编写一个JSP WEB网站了解JSP WEB网站的基本结构、调试、部署

    接上篇<JAVA WEB快速入门之环境搭建>,在完成了环境搭建后(JDK.Tomcat.IDE),现在是万事具备,就差写代码了,今天就来从编写一个JSP WEB网站了解JSP WEB网站的 ...

  10. 用PHP编写一个APP的API

    第一部分,通信接口的实现 标签(空格分隔): PHP 手机后台 api 通信接口 Andy PHP开发手机API时,一般返回XML或JSON数据类型的数据,除了要返回从源数据(程序本身需要的数据)外还 ...

随机推荐

  1. java使用split分隔,需要注意的点

    String severName = "10.6.62.244"; System.out.println(severName.split(".").length ...

  2. 获取body标签元素方法

    方法一 doucumnet.body 方法二 document.getElementsByTagName("body")[0]

  3. SRF之数据字典

      框架提供数据字典的配置和显示的功能 字典以编码作为标识,用varchar(50)类型保存字典的编码.   字典的用法 1.在代码里边需要查询字典信息的 可用 Components.DataDict ...

  4. UIWindow &amp; UIWindowLevel详解

    一.UIWindow是一种特殊的UIView,通常在一个程序中只会有一个UIWindow,但可以手动创建多个UIWindow,同时加到程序里面.UIWindow在程序中主要起到三个作用: 1.作为容器 ...

  5. OD调试2---TraceMe

    OD调试2---TraceMe 拆解一个Windows程序要比拆解一个DOS程序容易得多,因为在Windows中,只要API函数被使用,想对寻找蛛丝马迹的人隐藏一些东西是比较困难的.因此分析一个程序, ...

  6. 2.5 非透明PCI桥

    PCI桥规范定义了透明桥的实现规则,本篇在第2.3.1节中详细介绍了这种桥片.通过透明桥,处理器系统可以以HOST主桥为根节点,建立一颗PCI总线树,在这个树上的PCI设备共享同一个PCI总线域上的地 ...

  7. java StringBuilder和StringBuffer 用法

    可变的字符串,兄弟关系StringBuilder:效率高,安全性低StringBuffer:效率低,安全性高 StringBuilder 的常用方法的使用,StringBuffer用法一样. publ ...

  8. C++11 并发指南九(综合运用: C++11 多线程下生产者消费者模型详解)

    前面八章介绍了 C++11 并发编程的基础(抱歉哈,第五章-第八章还在草稿中),本文将综合运用 C++11 中的新的基础设施(主要是多线程.锁.条件变量)来阐述一个经典问题——生产者消费者模型,并给出 ...

  9. VMWare虚拟机 window文件传递

    无论是将虚拟机的文件传到window上或者是将window上文件传到虚拟机上: 都可以选中文件,然后拖动文件到另一个系统上 提前:虚拟机安装了VMWARE Tools 1)window上文件拖到虚拟机 ...

  10. PAT 乙级 1060 爱丁顿数(25) C++版

    1060. 爱丁顿数(25) 时间限制 250 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 英国天文学家爱丁顿很喜欢骑车.据说他 ...