using System; using System.Net.Http; using System.Net.Http.Headers; using System.Threading; using System.Threading.Tasks; using Flurl; using Flurl.Http; namespace SKIT.FlurlHttpClient.Wechat.Api { public static class WechatApiClientExecuteChannelsExtensions { #region ECBasics /// /// 异步调用 [POST] /channels/ec/basics/img/upload 接口。 /// REF: https://developers.weixin.qq.com/doc/channels/API/basics/img_upload.html /// /// /// /// /// public static async Task ExecuteChannelsECBasicsImageUploadAsync(this WechatApiClient client, Models.ChannelsECBasicsImageUploadRequest request, CancellationToken cancellationToken = default) { if (client is null) throw new ArgumentNullException(nameof(client)); if (request is null) throw new ArgumentNullException(nameof(request)); IFlurlRequest flurlReq = client .CreateRequest(request, HttpMethod.Post, "channels", "ec", "basics", "img", "upload") .SetQueryParam("access_token", request.AccessToken) .SetQueryParam("resp_type", request.ResponseType); if (request.ImageUrl != null) { flurlReq.SetQueryParam("upload_type", 1) .SetQueryParam("img_url", request.ImageUrl); return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); } else { flurlReq.SetQueryParam("upload_type", 0) .SetQueryParam("height", request.Height) .SetQueryParam("width", request.Width); string boundary = "--BOUNDARY--" + DateTimeOffset.Now.Ticks.ToString("x"); using var httpContent = new MultipartFormDataContent(boundary); using var fileContent = new ByteArrayContent(request.ImageFileBytes ?? Array.Empty()); httpContent.Add(fileContent, "\"media\"", "\"image.png\""); httpContent.Headers.ContentType = MediaTypeHeaderValue.Parse("multipart/form-data; boundary=" + boundary); fileContent.Headers.ContentType = MediaTypeHeaderValue.Parse("image/png"); fileContent.Headers.ContentLength = request.ImageFileBytes?.Length; return await client.SendRequestAsync(flurlReq, httpContent: httpContent, cancellationToken: cancellationToken); } } #endregion #region ECCategory /// /// 异步调用 [POST] /channels/ec/category/availablesoncategories/get 接口。 /// REF: https://developers.weixin.qq.com/doc/channels/API/category/getavailablesoncategories.html /// /// /// /// /// public static async Task ExecuteChannelsECCategoryAvailableSonCategoriesGetAsync(this WechatApiClient client, Models.ChannelsECCategoryAvailableSonCategoriesGetRequest request, CancellationToken cancellationToken = default) { if (client is null) throw new ArgumentNullException(nameof(client)); if (request is null) throw new ArgumentNullException(nameof(request)); IFlurlRequest flurlReq = client .CreateRequest(request, HttpMethod.Post, "channels", "ec", "category", "availablesoncategories", "get") .SetQueryParam("access_token", request.AccessToken); return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); } /// /// 异步调用 [POST] /channels/ec/category/add 接口。 /// REF: https://developers.weixin.qq.com/doc/channels/API/category/add.html /// /// /// /// /// public static async Task ExecuteChannelsECCategoryAddAsync(this WechatApiClient client, Models.ChannelsECCategoryAddRequest request, CancellationToken cancellationToken = default) { if (client is null) throw new ArgumentNullException(nameof(client)); if (request is null) throw new ArgumentNullException(nameof(request)); IFlurlRequest flurlReq = client .CreateRequest(request, HttpMethod.Post, "channels", "ec", "category", "add") .SetQueryParam("access_token", request.AccessToken); return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); } /// /// 异步调用 [POST] /channels/ec/category/audit/get 接口。 /// REF: https://developers.weixin.qq.com/doc/channels/API/category/audit_get.html /// /// /// /// /// public static async Task ExecuteChannelsECCategoryAuditGetAsync(this WechatApiClient client, Models.ChannelsECCategoryAuditGetRequest request, CancellationToken cancellationToken = default) { if (client is null) throw new ArgumentNullException(nameof(client)); if (request is null) throw new ArgumentNullException(nameof(request)); IFlurlRequest flurlReq = client .CreateRequest(request, HttpMethod.Post, "channels", "ec", "category", "audit", "get") .SetQueryParam("access_token", request.AccessToken); return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); } #endregion #region Merchant #region Merchant/FreightTemplate /// /// 异步调用 [POST] /channels/ec/merchant/getfreighttemplatelist 接口。 /// REF: https://developers.weixin.qq.com/doc/channels/API/order/deliverycompanylist_get.html /// /// /// /// /// public static async Task ExecuteChannelsECMerchantGetFreightTemplateListAsync(this WechatApiClient client, Models.ChannelsECMerchantGetFreightTemplateListRequest request, CancellationToken cancellationToken = default) { if (client is null) throw new ArgumentNullException(nameof(client)); if (request is null) throw new ArgumentNullException(nameof(request)); IFlurlRequest flurlReq = client .CreateRequest(request, HttpMethod.Post, "channels", "ec", "merchant", "getfreighttemplatelist") .SetQueryParam("access_token", request.AccessToken); return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); } /// /// 异步调用 [POST] /channels/ec/merchant/getfreighttemplatedetail 接口。 /// REF: https://developers.weixin.qq.com/doc/channels/API/merchant/getfreighttemplatedetail.html /// /// /// /// /// public static async Task ExecuteChannelsECMerchantGetFreightTemplateDetailAsync(this WechatApiClient client, Models.ChannelsECMerchantGetFreightTemplateDetailRequest request, CancellationToken cancellationToken = default) { if (client is null) throw new ArgumentNullException(nameof(client)); if (request is null) throw new ArgumentNullException(nameof(request)); IFlurlRequest flurlReq = client .CreateRequest(request, HttpMethod.Post, "channels", "ec", "merchant", "getfreighttemplatedetail") .SetQueryParam("access_token", request.AccessToken); return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); } /// /// 异步调用 [POST] /channels/ec/merchant/addfreighttemplate 接口。 /// REF: https://developers.weixin.qq.com/doc/channels/API/merchant/addfreighttemplate.html /// /// /// /// /// public static async Task ExecuteChannelsECMerchantAddFreightTemplateAsync(this WechatApiClient client, Models.ChannelsECMerchantAddFreightTemplateRequest request, CancellationToken cancellationToken = default) { if (client is null) throw new ArgumentNullException(nameof(client)); if (request is null) throw new ArgumentNullException(nameof(request)); IFlurlRequest flurlReq = client .CreateRequest(request, HttpMethod.Post, "channels", "ec", "merchant", "addfreighttemplate") .SetQueryParam("access_token", request.AccessToken); return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); } /// /// 异步调用 [POST] /channels/ec/merchant/updatefreighttemplate 接口。 /// REF: https://developers.weixin.qq.com/doc/channels/API/merchant/updatefreighttemplate.html /// /// /// /// /// public static async Task ExecuteChannelsECMerchantUpdateFreightTemplateAsync(this WechatApiClient client, Models.ChannelsECMerchantUpdateFreightTemplateRequest request, CancellationToken cancellationToken = default) { if (client is null) throw new ArgumentNullException(nameof(client)); if (request is null) throw new ArgumentNullException(nameof(request)); IFlurlRequest flurlReq = client .CreateRequest(request, HttpMethod.Post, "channels", "ec", "merchant", "updatefreighttemplate") .SetQueryParam("access_token", request.AccessToken); return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); } #endregion #endregion #region Order #region Order/Delivery /// /// 异步调用 [POST] /channels/ec/order/deliverycompanylist/get 接口。 /// REF: https://developers.weixin.qq.com/doc/channels/API/order/deliverycompanylist_get.html /// /// /// /// /// public static async Task ExecuteChannelsECOrderDeliveryCompanyListGetAsync(this WechatApiClient client, Models.ChannelsECOrderDeliveryCompanyListGetRequest request, CancellationToken cancellationToken = default) { if (client is null) throw new ArgumentNullException(nameof(client)); if (request is null) throw new ArgumentNullException(nameof(request)); IFlurlRequest flurlReq = client .CreateRequest(request, HttpMethod.Post, "channels", "ec", "order", "deliverycompanylist", "get") .SetQueryParam("access_token", request.AccessToken); return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); } /// /// 异步调用 [POST] /channels/ec/order/delivery/send 接口。 /// REF: https://developers.weixin.qq.com/doc/channels/API/order/delivery_send.html /// /// /// /// /// public static async Task ExecuteChannelsECOrderDeliverySendAsync(this WechatApiClient client, Models.ChannelsECOrderDeliverySendRequest request, CancellationToken cancellationToken = default) { if (client is null) throw new ArgumentNullException(nameof(client)); if (request is null) throw new ArgumentNullException(nameof(request)); IFlurlRequest flurlReq = client .CreateRequest(request, HttpMethod.Post, "channels", "ec", "order", "delivery", "send") .SetQueryParam("access_token", request.AccessToken); return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); } #endregion #endregion #region ECWindow /// /// 异步调用 [POST] /channels/ec/window/product/add 接口。 /// REF: https://developers.weixin.qq.com/doc/channels/API/windowproduct/add.html /// /// /// /// /// public static async Task ExecuteChannelsECWindowProductAddAsync(this WechatApiClient client, Models.ChannelsECWindowProductAddRequest request, CancellationToken cancellationToken = default) { if (client is null) throw new ArgumentNullException(nameof(client)); if (request is null) throw new ArgumentNullException(nameof(request)); IFlurlRequest flurlReq = client .CreateRequest(request, HttpMethod.Post, "channels", "ec", "window", "product", "add") .SetQueryParam("access_token", request.AccessToken); return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); } /// /// 异步调用 [POST] /channels/ec/window/product/off 接口。 /// REF: https://developers.weixin.qq.com/doc/channels/API/windowproduct/off.html /// /// /// /// /// public static async Task ExecuteChannelsECWindowProductOffAsync(this WechatApiClient client, Models.ChannelsECWindowProductOffRequest request, CancellationToken cancellationToken = default) { if (client is null) throw new ArgumentNullException(nameof(client)); if (request is null) throw new ArgumentNullException(nameof(request)); IFlurlRequest flurlReq = client .CreateRequest(request, HttpMethod.Post, "channels", "ec", "window", "product", "off") .SetQueryParam("access_token", request.AccessToken); return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); } #endregion } }