一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

Magicodes.Wx.Sdk之30秒編寫一個微信接口

 風聲之家 2021-03-26

移動開發(fā)和人工智能 4天前

以下文章來源于麥扣聊技術(shù) ,作者magiccodes

出容器、產(chǎn)品開發(fā)管理、微服務(wù)架構(gòu)系列文章和教程:docs.xin-lai.com。



概述


Magicodes.Wx.Sdk致力于打造最簡潔最易于使用的微信Sdk,逐步包括公眾號Sdk、小程序Sdk、企業(yè)微信Sdk等,以及Abp VNext集成。

本篇將側(cè)重于講述如何向Magicodes.Wx.Sdk進行貢獻。



WebApiClientCore


Magicodes.Wx.Sdk之簡潔很大層面依托于NCC的開源庫WebApiClientCore。Magicodes.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> /// 設(shè)置客服信息 /// </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用于設(shè)置接口請求方法,常用特性有:

    特性名稱功能描述備注
    HttpHostAttribute請求服務(wù)http絕對完整主機域名優(yōu)先級比Options配置低
    HttpGetAttribute聲明Get請求方法與路徑支持null、絕對或相對路徑
    HttpPostAttribute聲明Post請求方法與路徑支持null、絕對或相對路徑
    HttpPutAttribute聲明Put請求方法與路徑支持null、絕對或相對路徑
    HttpDeleteAttribute聲明Delete請求方法與路徑支持null、絕對或相對路徑
    HeaderAttribute聲明請求頭常量值
    TimeoutAttribute聲明超時時間常量值
    FormFieldAttribute聲明Form表單字段與值常量鍵和值
    FormDataTextAttribute聲明FormData表單字段與值常量鍵和值
2)添加Dto

這一步是非必要的,需要看參數(shù)的具體內(nèi)容和要求。添加客服接口的輸入?yún)?shù)代碼參考如下:

 public class AddOrUpdateKfAccountInput    {        /// <summary>        /// 完整客服賬號,格式為:賬號前綴@公眾號微信號,賬號前綴最多10個字符,必須是英文、數(shù)字字符或者下劃線,后綴為公眾號微信號,長度不超過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

框架中封裝了默認的返回結(jié)果基類,如果沒有其他額外的返回內(nèi)容,僅需返回ApiResultBase即可。如果有額外的范圍內(nèi)容,則需要定義子類繼承自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> /// 模板消息發(fā)送測試 /// </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是否調(diào)用成功,未成功將拋出異常WxSdkException result.EnsureSuccess(); }}

整體參考:

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



其他須知內(nèi)容


IWxApiWithAccessTokenFilter接口

IWxApiWithAccessTokenFilter接口用于定義需要攜帶公眾號Acces sToken的接口。

如下述參考代碼所示,其啟用了AccessTokenApiFilter篩選器,以及關(guān)閉了AcceptContentType的匹配約束(公眾號的接口官方寫的一塌糊涂,很不規(guī)范)。

參考代碼:

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

AccessTokenApiFilter接口篩選器會在啟用的API、Action上自動添加access_token參數(shù)值。

參考代碼如下所示:

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; }}
關(guān)于ApiResultBase

ApiResultBase定義了公眾號API返回基類,用于接收錯誤碼、錯誤消息、是否執(zhí)行成功的判斷以及獲取友好消息提示。

參考代碼:

/// <summary>///     API請求結(jié)果///     {"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(); }}

《輕量易用的微信Sdk發(fā)布——Magicodes.Wx.Sdk

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    青青操日老女人的穴穴| 日本人妻免费一区二区三区| 最新国产欧美精品91| 东京热男人的天堂久久综合| 日韩国产亚洲一区二区三区| 国产在线一区二区三区不卡| 国产偷拍精品在线视频| 高清国产日韩欧美熟女| 国产精品二区三区免费播放心| 99视频精品免费视频播放| 91久久精品国产一区蜜臀| 免费亚洲黄色在线观看| 国产又粗又硬又大又爽的视频| 欧美韩日在线观看一区| 久久久精品区二区三区| 午夜精品一区免费视频| 国产一区二区在线免费| 欧美一区二区三区喷汁尤物| 日本加勒比不卡二三四区| 亚洲欧美日韩中文字幕二欧美| 午夜视频在线观看日韩| 国产欧美日韩在线精品一二区| 日本高清视频在线播放| 一区二区三区欧美高清| 亚洲精品蜜桃在线观看| 国产一级不卡视频在线观看| 蜜桃传媒在线正在播放| 午夜福利直播在线视频| 五月天丁香婷婷狠狠爱| 欧美野外在线刺激在线观看 | 欧美日本精品视频在线观看| 日韩中文无线码在线视频| 日本高清一道一二三区四五区| 午夜精品久久久99热连载| 色婷婷激情五月天丁香| 欧美精品中文字幕亚洲| 91免费精品国自产拍偷拍| 欧美av人人妻av人人爽蜜桃| 国产传媒欧美日韩成人精品| 日系韩系还是欧美久久| 五月天六月激情联盟网|