feat(wxapi): 新增小程序 B2B 门店助手相关接口

This commit is contained in:
Fu Diwei
2023-05-09 23:04:47 +08:00
parent 5d7f027daf
commit 7c0a8490dd
16 changed files with 507 additions and 25 deletions

View File

@@ -9,29 +9,6 @@ namespace SKIT.FlurlHttpClient.Wechat.Api
{ {
public static class WechatApiClientExecuteWxaBusinessExtensions public static class WechatApiClientExecuteWxaBusinessExtensions
{ {
/// <summary>
/// <para>异步调用 [POST] /wxa/business/getpayfororder 接口。</para>
/// <para>REF: https://developers.weixin.qq.com/minigame/dev/api-backend/midas-payment/business.getPayForOrder.html </para>
/// </summary>
/// <param name="client"></param>
/// <param name="request"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public static async Task<Models.WxaBusinessGetPayForOrderResponse> ExecuteWxaBusinessGetPayForOrderAsync(this WechatApiClient client, Models.WxaBusinessGetPayForOrderRequest request, CancellationToken cancellationToken = default)
{
if (client is null) throw new ArgumentNullException(nameof(client));
if (request is null) throw new ArgumentNullException(nameof(request));
if (request.AppId == null)
request.AppId = client.Credentials.AppId;
IFlurlRequest flurlReq = client
.CreateRequest(request, HttpMethod.Post, "wxa", "business", "getpayfororder")
.SetQueryParam("access_token", request.AccessToken);
return await client.SendRequestWithJsonAsync<Models.WxaBusinessGetPayForOrderResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
}
/// <summary> /// <summary>
/// <para>异步调用 [POST] /wxa/business/checkencryptedmsg 接口。</para> /// <para>异步调用 [POST] /wxa/business/checkencryptedmsg 接口。</para>
/// <para>REF: https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/user-info/auth.checkEncryptedData.html </para> /// <para>REF: https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/user-info/auth.checkEncryptedData.html </para>
@@ -74,6 +51,31 @@ namespace SKIT.FlurlHttpClient.Wechat.Api
return await client.SendRequestWithJsonAsync<Models.WxaBusinessGetUserPhoneNumberResponse>(flurlReq, data: request, cancellationToken: cancellationToken); return await client.SendRequestWithJsonAsync<Models.WxaBusinessGetUserPhoneNumberResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
} }
#region Midas
/// <summary>
/// <para>异步调用 [POST] /wxa/business/getpayfororder 接口。</para>
/// <para>REF: https://developers.weixin.qq.com/minigame/dev/api-backend/midas-payment/business.getPayForOrder.html </para>
/// </summary>
/// <param name="client"></param>
/// <param name="request"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public static async Task<Models.WxaBusinessGetPayForOrderResponse> ExecuteWxaBusinessGetPayForOrderAsync(this WechatApiClient client, Models.WxaBusinessGetPayForOrderRequest request, CancellationToken cancellationToken = default)
{
if (client is null) throw new ArgumentNullException(nameof(client));
if (request is null) throw new ArgumentNullException(nameof(request));
if (request.AppId == null)
request.AppId = client.Credentials.AppId;
IFlurlRequest flurlReq = client
.CreateRequest(request, HttpMethod.Post, "wxa", "business", "getpayfororder")
.SetQueryParam("access_token", request.AccessToken);
return await client.SendRequestWithJsonAsync<Models.WxaBusinessGetPayForOrderResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
}
#endregion
#region GameMatch #region GameMatch
/// <summary> /// <summary>
/// <para>异步调用 [POST] /wxa/business/gamematch/creatematchrule 接口。</para> /// <para>异步调用 [POST] /wxa/business/gamematch/creatematchrule 接口。</para>
@@ -326,5 +328,67 @@ namespace SKIT.FlurlHttpClient.Wechat.Api
return await client.SendRequestWithJsonAsync<Models.WxaBusinessGetUserEncryptKeyResponse>(flurlReq, data: request, cancellationToken: cancellationToken); return await client.SendRequestWithJsonAsync<Models.WxaBusinessGetUserEncryptKeyResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
} }
#endregion #endregion
#region B2BStore
/// <summary>
/// <para>异步调用 [POST] /wxa/business/getretailinfo 接口。</para>
/// <para>REF: https://developers.weixin.qq.com/miniprogram/dev/platform-capabilities/industry/B2b_store_assistant.html </para>
/// </summary>
/// <param name="client"></param>
/// <param name="request"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public static async Task<Models.WxaBusinessGetRetailInfoResponse> ExecuteWxaBusinessGetRetailInfoAsync(this WechatApiClient client, Models.WxaBusinessGetRetailInfoRequest 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, "wxa", "business", "getretailinfo")
.SetQueryParam("access_token", request.AccessToken);
return await client.SendRequestWithJsonAsync<Models.WxaBusinessGetRetailInfoResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
}
/// <summary>
/// <para>异步调用 [POST] /wxa/business/batchcreateretail 接口。</para>
/// <para>REF: https://developers.weixin.qq.com/miniprogram/dev/platform-capabilities/industry/B2b_store_assistant.html </para>
/// </summary>
/// <param name="client"></param>
/// <param name="request"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public static async Task<Models.WxaBusinessBatchCreateRetailResponse> ExecuteWxaBusinessBatchCreateRetailAsync(this WechatApiClient client, Models.WxaBusinessBatchCreateRetailRequest 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, "wxa", "business", "batchcreateretail")
.SetQueryParam("access_token", request.AccessToken);
return await client.SendRequestWithJsonAsync<Models.WxaBusinessBatchCreateRetailResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
}
/// <summary>
/// <para>异步调用 [POST] /wxa/business/retailnotifybusiness 接口。</para>
/// <para>REF: https://developers.weixin.qq.com/miniprogram/dev/platform-capabilities/industry/B2b_store_assistant.html </para>
/// </summary>
/// <param name="client"></param>
/// <param name="request"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public static async Task<Models.WxaBusinessRetailNotifyBusinessResponse> ExecuteWxaBusinessRetailNotifyBusinessAsync(this WechatApiClient client, Models.WxaBusinessRetailNotifyBusinessRequest 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, "wxa", "business", "retailnotifybusiness")
.SetQueryParam("access_token", request.AccessToken);
return await client.SendRequestWithJsonAsync<Models.WxaBusinessRetailNotifyBusinessResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
}
#endregion
} }
} }

View File

@@ -0,0 +1,100 @@
using System.Collections.Generic;
namespace SKIT.FlurlHttpClient.Wechat.Api.Models
{
/// <summary>
/// <para>表示 [POST] /wxa/business/batchcreateretail 接口的请求。</para>
/// </summary>
public class WxaBusinessBatchCreateRetailRequest : WechatApiRequest, IInferable<WxaBusinessBatchCreateRetailRequest, WxaBusinessBatchCreateRetailResponse>
{
public static class Types
{
public class RetailInfo
{
/// <summary>
/// 获取或设置一级类型。
/// </summary>
[Newtonsoft.Json.JsonProperty("retail_type")]
[System.Text.Json.Serialization.JsonPropertyName("retail_type")]
public string RetailType { get; set; } = string.Empty;
/// <summary>
/// 获取或设置二级类型。
/// </summary>
[Newtonsoft.Json.JsonProperty("sub_retail_type")]
[System.Text.Json.Serialization.JsonPropertyName("sub_retail_type")]
public string? RetailSubType { get; set; }
/// <summary>
/// 获取或设置门店名称。
/// </summary>
[Newtonsoft.Json.JsonProperty("retail_name")]
[System.Text.Json.Serialization.JsonPropertyName("retail_name")]
public string Name { get; set; } = string.Empty;
/// <summary>
/// 获取或设置门店地址省份。
/// </summary>
[Newtonsoft.Json.JsonProperty("address_province")]
[System.Text.Json.Serialization.JsonPropertyName("address_province")]
public string Province { get; set; } = string.Empty;
/// <summary>
/// 获取或设置门店地址城市。
/// </summary>
[Newtonsoft.Json.JsonProperty("address_city")]
[System.Text.Json.Serialization.JsonPropertyName("address_city")]
public string City { get; set; } = string.Empty;
/// <summary>
/// 获取或设置门店地址区县。
/// </summary>
[Newtonsoft.Json.JsonProperty("address_region")]
[System.Text.Json.Serialization.JsonPropertyName("address_region")]
public string District { get; set; } = string.Empty;
/// <summary>
/// 获取或设置门店地址街道。
/// </summary>
[Newtonsoft.Json.JsonProperty("address_street")]
[System.Text.Json.Serialization.JsonPropertyName("address_street")]
public string Street { get; set; } = string.Empty;
/// <summary>
/// 获取或设置门店负责人的手机号。
/// </summary>
[Newtonsoft.Json.JsonProperty("mobile_phone")]
[System.Text.Json.Serialization.JsonPropertyName("mobile_phone")]
public string Mobilephone { get; set; } = default!;
/// <summary>
/// 获取或设置企业名称。
/// </summary>
[Newtonsoft.Json.JsonProperty("biz_name")]
[System.Text.Json.Serialization.JsonPropertyName("biz_name")]
public string? BusinessName { get; set; }
/// <summary>
/// 获取或设置营业执照注册号。
/// </summary>
[Newtonsoft.Json.JsonProperty("registration_number")]
[System.Text.Json.Serialization.JsonPropertyName("registration_number")]
public string? RegistrationNumber { get; set; }
/// <summary>
/// 获取或设置法人姓名。
/// </summary>
[Newtonsoft.Json.JsonProperty("corporation_name")]
[System.Text.Json.Serialization.JsonPropertyName("corporation_name")]
public string? LegalPerson { get; set; }
}
}
/// <summary>
/// 获取或设置门店信息列表。
/// </summary>
[Newtonsoft.Json.JsonProperty("retail_info_list")]
[System.Text.Json.Serialization.JsonPropertyName("retail_info_list")]
public IList<Types.RetailInfo> RetailInfoList { get; set; } = new List<Types.RetailInfo>();
}
}

View File

@@ -0,0 +1,56 @@
namespace SKIT.FlurlHttpClient.Wechat.Api.Models
{
/// <summary>
/// <para>表示 [POST] /wxa/business/batchcreateretail 接口的响应。</para>
/// </summary>
public class WxaBusinessBatchCreateRetailResponse : WechatApiResponse
{
public static class Types
{
public class Failure
{
/// <summary>
/// 获取或设置门店负责人的手机号。
/// </summary>
[Newtonsoft.Json.JsonProperty("mobile_phone")]
[System.Text.Json.Serialization.JsonPropertyName("mobile_phone")]
public string Mobilephone { get; set; } = default!;
/// <summary>
/// 获取或设置营业执照注册号。
/// </summary>
[Newtonsoft.Json.JsonProperty("registration_number")]
[System.Text.Json.Serialization.JsonPropertyName("registration_number")]
public string? RegistrationNumber { get; set; }
/// <summary>
/// 获取或设置失败原因编号。
/// </summary>
[Newtonsoft.Json.JsonProperty("failure_code")]
[System.Text.Json.Serialization.JsonPropertyName("failure_code")]
public int FailureCode { get; set; }
}
}
/// <summary>
/// 获取或设置成功数量。
/// </summary>
[Newtonsoft.Json.JsonProperty("num_success")]
[System.Text.Json.Serialization.JsonPropertyName("num_success")]
public int SuccessfulCount { get; set; }
/// <summary>
/// 获取或设置失败数量。
/// </summary>
[Newtonsoft.Json.JsonProperty("num_failure")]
[System.Text.Json.Serialization.JsonPropertyName("num_failure")]
public int FailedCount { get; set; }
/// <summary>
/// 获取或设置失败信息列表。
/// </summary>
[Newtonsoft.Json.JsonProperty("failure_record_list")]
[System.Text.Json.Serialization.JsonPropertyName("failure_record_list")]
public Types.Failure[]? FailureList { get; set; }
}
}

View File

@@ -0,0 +1,22 @@
namespace SKIT.FlurlHttpClient.Wechat.Api.Models
{
/// <summary>
/// <para>表示 [POST] /wxa/business/getretailinfo 接口的请求。</para>
/// </summary>
public class WxaBusinessGetRetailInfoRequest : WechatApiRequest, IInferable<WxaBusinessGetRetailInfoRequest, WxaBusinessGetRetailInfoResponse>
{
/// <summary>
/// 获取或设置门店负责人的 OpenId。与字段 <see cref="Mobilephone"/> 二选一。
/// </summary>
[Newtonsoft.Json.JsonProperty("openid")]
[System.Text.Json.Serialization.JsonPropertyName("openid")]
public string? OpenId { get; set; }
/// <summary>
/// 获取或设置门店负责人的手机号。与字段 <see cref="OpenId"/> 二选一。
/// </summary>
[Newtonsoft.Json.JsonProperty("mobile_phone")]
[System.Text.Json.Serialization.JsonPropertyName("mobile_phone")]
public string? Mobilephone { get; set; }
}
}

View File

@@ -0,0 +1,112 @@
namespace SKIT.FlurlHttpClient.Wechat.Api.Models
{
/// <summary>
/// <para>表示 [POST] /wxa/business/getretailinfo 接口的响应。</para>
/// </summary>
public class WxaBusinessGetRetailInfoResponse : WechatApiResponse
{
public static class Types
{
public class RetailInfo
{
/// <summary>
/// 获取或设置一级类型。
/// </summary>
[Newtonsoft.Json.JsonProperty("retail_type")]
[System.Text.Json.Serialization.JsonPropertyName("retail_type")]
public string RetailType { get; set; } = default!;
/// <summary>
/// 获取或设置二级类型。
/// </summary>
[Newtonsoft.Json.JsonProperty("sub_retail_type")]
[System.Text.Json.Serialization.JsonPropertyName("sub_retail_type")]
public string RetailSubType { get; set; } = default!;
/// <summary>
/// 获取或设置门店名称。
/// </summary>
[Newtonsoft.Json.JsonProperty("retail_name")]
[System.Text.Json.Serialization.JsonPropertyName("retail_name")]
public string Name { get; set; } = default!;
/// <summary>
/// 获取或设置门店地址。
/// </summary>
[Newtonsoft.Json.JsonProperty("retail_address")]
[System.Text.Json.Serialization.JsonPropertyName("retail_address")]
public string Address { get; set; } = default!;
/// <summary>
/// 获取或设置门店负责人的 OpenId。
/// </summary>
[Newtonsoft.Json.JsonProperty("openid")]
[System.Text.Json.Serialization.JsonPropertyName("openid")]
public string OpenId { get; set; } = default!;
/// <summary>
/// 获取或设置门店负责人的手机号。
/// </summary>
[Newtonsoft.Json.JsonProperty("mobile_phone")]
[System.Text.Json.Serialization.JsonPropertyName("mobile_phone")]
public string Mobilephone { get; set; } = default!;
/// <summary>
/// 获取或设置企业名称。
/// </summary>
[Newtonsoft.Json.JsonProperty("principal")]
[System.Text.Json.Serialization.JsonPropertyName("principal")]
public string? BusinessName { get; set; }
/// <summary>
/// 获取或设置营业执照注册号。
/// </summary>
[Newtonsoft.Json.JsonProperty("identification")]
[System.Text.Json.Serialization.JsonPropertyName("identification")]
public string? RegistrationNumber { get; set; }
/// <summary>
/// 获取或设置法人姓名。
/// </summary>
[Newtonsoft.Json.JsonProperty("legal_person_name")]
[System.Text.Json.Serialization.JsonPropertyName("legal_person_name")]
public string? LegalPerson { get; set; }
/// <summary>
/// 获取或设置认证方式。
/// </summary>
[Newtonsoft.Json.JsonProperty("auth_mode")]
[System.Text.Json.Serialization.JsonPropertyName("auth_mode")]
public int AuthMode { get; set; }
/// <summary>
/// 获取或设置认证状态。
/// </summary>
[Newtonsoft.Json.JsonProperty("status")]
[System.Text.Json.Serialization.JsonPropertyName("status")]
public int Status { get; set; }
/// <summary>
/// 获取或设置认证时间戳。
/// </summary>
[Newtonsoft.Json.JsonProperty("auth_time")]
[System.Text.Json.Serialization.JsonPropertyName("auth_time")]
public long? AuthTimestamp { get; set; }
/// <summary>
/// 获取或设置授权时间戳。
/// </summary>
[Newtonsoft.Json.JsonProperty("grant_time")]
[System.Text.Json.Serialization.JsonPropertyName("grant_time")]
public long? GrantTimestamp { get; set; }
}
}
/// <summary>
/// 获取或设置门店信息列表。
/// </summary>
[Newtonsoft.Json.JsonProperty("info")]
[System.Text.Json.Serialization.JsonPropertyName("info")]
public Types.RetailInfo[] RetailInfoList { get; set; } = default!;
}
}

View File

@@ -0,0 +1,31 @@
using System.Collections.Generic;
namespace SKIT.FlurlHttpClient.Wechat.Api.Models
{
/// <summary>
/// <para>表示 [POST] /wxa/business/retailnotifybusiness 接口的请求。</para>
/// </summary>
public class WxaBusinessRetailNotifyBusinessRequest : WechatApiRequest, IInferable<WxaBusinessRetailNotifyBusinessRequest, WxaBusinessRetailNotifyBusinessResponse>
{
/// <summary>
/// 获取或设置消息类型。
/// </summary>
[Newtonsoft.Json.JsonProperty("type")]
[System.Text.Json.Serialization.JsonPropertyName("type")]
public int Type { get; set; }
/// <summary>
/// 获取或设置下发内容。
/// </summary>
[Newtonsoft.Json.JsonProperty("content")]
[System.Text.Json.Serialization.JsonPropertyName("content")]
public string Content { get; set; } = string.Empty;
/// <summary>
/// 获取或设置门店负责人的 OpenId 列表。
/// </summary>
[Newtonsoft.Json.JsonProperty("to_user_list")]
[System.Text.Json.Serialization.JsonPropertyName("to_user_list")]
public IList<string> ToUserOpenIdList { get; set; } = new List<string>();
}
}

View File

@@ -0,0 +1,9 @@
namespace SKIT.FlurlHttpClient.Wechat.Api.Models
{
/// <summary>
/// <para>表示 [POST] /wxa/business/retailnotifybusiness 接口的响应。</para>
/// </summary>
public class WxaBusinessRetailNotifyBusinessResponse : WechatApiResponse
{
}
}

View File

@@ -1,4 +1,4 @@
namespace SKIT.FlurlHttpClient.Wechat.Api.Models namespace SKIT.FlurlHttpClient.Wechat.Api.Models
{ {
/// <summary> /// <summary>
/// <para>表示 [POST] /wxa/business/getpayfororder 接口的响应。</para> /// <para>表示 [POST] /wxa/business/getpayfororder 接口的响应。</para>
@@ -56,7 +56,7 @@
/// </summary> /// </summary>
[Newtonsoft.Json.JsonProperty("env")] [Newtonsoft.Json.JsonProperty("env")]
[System.Text.Json.Serialization.JsonPropertyName("env")] [System.Text.Json.Serialization.JsonPropertyName("env")]
public string MidasEnv { get; set; } = default!; public int MidasEnvironment { get; set; }
/// <summary> /// <summary>
/// 获取或设置支付时间戳。 /// 获取或设置支付时间戳。

View File

@@ -0,0 +1,24 @@
{
"retail_info_list": [
{
"mobile_phone": "12345678910",
"retail_name": "张三烧烤店",
"retail_type": "餐饮店",
"address_province": "广东省",
"address_city": "广州市",
"address_region": "海珠区",
"address_street": "新港中路397号TIT创意园"
},
{
"mobile_phone": "a123456789",
"retail_type": "便利店",
"address_province": "广东省",
"address_city": "广州市",
"address_region": "海珠区",
"address_street": "新港中路397号TIT创意园",
"registration_number": "xxxxx",
"biz_name": "xxxxx",
"corporation_name": "xxxxx"
}
]
}

View File

@@ -0,0 +1,13 @@
{
"errcode": 0,
"errmsg": "ok",
"num_success": 1,
"num_failure": 1,
"failure_record_list": [
{
"mobile_phone": "a123456789",
"registration_number": "",
"failure_code": 6
}
]
}

View File

@@ -0,0 +1,21 @@
{
"errcode": 0,
"errmsg": "ok",
"info": [
{
"mobile_phone": "12345678910",
"retail_type": "餐饮店",
"sub_retail_type": "",
"retail_address": "广东省广州市海珠区新港中路397号TIT创意园",
"retail_name": "张三烧烤店",
"identification": "100000000000000001",
"principal": "广州张三烧烤店",
"legal_person_name": "张*",
"openid": "xxxxxxxxxx",
"status": 1,
"auth_mode": 1,
"auth_time": 1655458898,
"grant_time": 1655458909
}
]
}

View File

@@ -0,0 +1,7 @@
{
"type": 7,
"content": "{}",
"to_user_list": [
"xxxxxxxxxxxxxx"
]
}

View File

@@ -0,0 +1,5 @@
{
"appid": "",
"order_no": "",
"out_trade_no": ""
}

View File

@@ -0,0 +1,15 @@
{
"errcode": 0,
"errmsg": "ok",
"payfororder": {
"out_trade_no": "",
"order_no": "",
"openid": "",
"create_time": 123456,
"amount": 0,
"status": 0,
"zone_id": "",
"env": 0,
"pay_time": null
}
}