From d364c1a3548a5908a0313f59470f917f1ea74b0c Mon Sep 17 00:00:00 2001
From: Fu Diwei <fudiwei@sina.com>
Date: Fri, 6 May 2022 10:26:23 +0800
Subject: [PATCH] =?UTF-8?q?feat(wxapi):=20=E6=96=B0=E5=A2=9E=E5=9F=8E?=
 =?UTF-8?q?=E5=B8=82=E6=9C=8D=E5=8A=A1=E5=BC=80=E6=94=BE=E4=BA=92=E8=81=94?=
 =?UTF-8?q?=E8=83=BD=E5=8A=9B=E7=9B=B8=E5=85=B3=E6=8E=A5=E5=8F=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 ...atApiClientExecuteCityServiceExtensions.cs | 22 ++++-
 .../CityServiceGetServicePathRequest.cs       | 99 +++++++++++++++++++
 .../CityServiceGetServicePathResponse.cs      | 44 +++++++++
 .../CityServiceGetServicePathRequest.json     | 14 +++
 .../CityServiceGetServicePathResponse.json    |  9 ++
 5 files changed, 187 insertions(+), 1 deletion(-)
 create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Models/CityService/CityServiceGetServicePathRequest.cs
 create mode 100644 src/SKIT.FlurlHttpClient.Wechat.Api/Models/CityService/CityServiceGetServicePathResponse.cs
 create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CityService/CityServiceGetServicePathRequest.json
 create mode 100644 test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CityService/CityServiceGetServicePathResponse.json

diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteCityServiceExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteCityServiceExtensions.cs
index d0d3b084..f21aa902 100644
--- a/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteCityServiceExtensions.cs
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteCityServiceExtensions.cs
@@ -11,7 +11,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Api
     {
         /// <summary>
         /// <para>异步调用 [POST] /cityservice/sendmsgdata 接口。</para>
-        /// <para>REF: https://developers.weixin.qq.com/miniprogram/dev/framework/cityservice/cityservice-results-page.html </para>
+        /// <para>REF: https://developers.weixin.qq.com/miniprogram/dev/platform-capabilities/cityservice/cityservice-results-page.html </para>
         /// </summary>
         /// <param name="client"></param>
         /// <param name="request"></param>
@@ -28,5 +28,25 @@ namespace SKIT.FlurlHttpClient.Wechat.Api
 
             return await client.SendRequestWithJsonAsync<Models.CityServiceSendMessageDataResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
         }
+
+        /// <summary>
+        /// <para>异步调用 [POST] /cityservice/getservicepath 接口。</para>
+        /// <para>REF: https://developers.weixin.qq.com/miniprogram/dev/platform-capabilities/cityservice/InterconnectionCapabilities/API/API.html </para>
+        /// </summary>
+        /// <param name="client"></param>
+        /// <param name="request"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        public static async Task<Models.CityServiceGetServicePathResponse> ExecuteCityServiceGetServicePathAsync(this WechatApiClient client, Models.CityServiceGetServicePathRequest 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, "cityservice", "getservicepath")
+                .SetQueryParam("access_token", request.AccessToken);
+
+            return await client.SendRequestWithJsonAsync<Models.CityServiceGetServicePathResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
+        }
     }
 }
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CityService/CityServiceGetServicePathRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CityService/CityServiceGetServicePathRequest.cs
new file mode 100644
index 00000000..e233a717
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CityService/CityServiceGetServicePathRequest.cs
@@ -0,0 +1,99 @@
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+    /// <summary>
+    /// <para>表示 [POST] /cityservice/getservicepath 接口的请求。</para>
+    /// </summary>
+    public class CityServiceGetServicePathRequest : WechatApiRequest, IInferable<CityServiceGetServicePathRequest, CityServiceGetServicePathResponse>
+    {
+        public static class Types
+        {
+            public class Parameter
+            {
+                /// <summary>
+                /// 获取或设置键。
+                /// </summary>
+                [Newtonsoft.Json.JsonProperty("key")]
+                [System.Text.Json.Serialization.JsonPropertyName("key")]
+                public string Key { get; set; } = string.Empty;
+
+                /// <summary>
+                /// 获取或设置值。
+                /// </summary>
+                [Newtonsoft.Json.JsonProperty("value")]
+                [System.Text.Json.Serialization.JsonPropertyName("value")]
+                public string Value { get; set; } = string.Empty;
+            }
+        }
+
+        internal static class Converters
+        {
+            internal class RequestPropertyParameterListNewtonsoftJsonConverter : Newtonsoft.Json.Converters.TextualObjectInJsonFormatConverterBase<IList<Types.Parameter>>
+            {
+            }
+
+            internal class RequestPropertyParameterListSystemTextJsonConverter : System.Text.Json.Converters.TextualObjectInJsonFormatConverterBase<IList<Types.Parameter>>
+            {
+            }
+        }
+
+        /// <summary>
+        /// 获取或设置城市服务路径类型。
+        /// </summary>
+        [Newtonsoft.Json.JsonProperty("page_type")]
+        [System.Text.Json.Serialization.JsonPropertyName("page_type")]
+        public int PageType { get; set; }
+
+        /// <summary>
+        /// 获取或设置跳转来源渠道。
+        /// </summary>
+        [Newtonsoft.Json.JsonProperty("src_channel")]
+        [System.Text.Json.Serialization.JsonPropertyName("src_channel")]
+        public int SourceChannel { get; set; }
+
+        /// <summary>
+        /// 获取或设置城市名称。
+        /// </summary>
+        [Newtonsoft.Json.JsonProperty("city_name")]
+        [System.Text.Json.Serialization.JsonPropertyName("city_name")]
+        public string? CityName { get; set; }
+
+        /// <summary>
+        /// 获取或设置卡片类型。
+        /// </summary>
+        [Newtonsoft.Json.JsonProperty("card_type")]
+        [System.Text.Json.Serialization.JsonPropertyName("card_type")]
+        public int? CardType { get; set; }
+
+        /// <summary>
+        /// 获取或设置服务 ID。
+        /// </summary>
+        [Newtonsoft.Json.JsonProperty("service_id")]
+        [System.Text.Json.Serialization.JsonPropertyName("service_id")]
+        public int? ServiceId { get; set; }
+
+        /// <summary>
+        /// 获取或设置专题页名称。
+        /// </summary>
+        [Newtonsoft.Json.JsonProperty("content_name")]
+        [System.Text.Json.Serialization.JsonPropertyName("content_name")]
+        public string? ContentName { get; set; }
+
+        /// <summary>
+        /// 获取或设置参数列表。
+        /// </summary>
+        [Newtonsoft.Json.JsonProperty("params")]
+        [Newtonsoft.Json.JsonConverter(typeof(Converters.RequestPropertyParameterListNewtonsoftJsonConverter))]
+        [System.Text.Json.Serialization.JsonPropertyName("params")]
+        [System.Text.Json.Serialization.JsonConverter(typeof(Converters.RequestPropertyParameterListSystemTextJsonConverter))]
+        public IList<Types.Parameter>? ParameterList { get; set; }
+
+        /// <summary>
+        /// 获取或设置额外参数列表。
+        /// </summary>
+        [Newtonsoft.Json.JsonProperty("ext_params")]
+        [System.Text.Json.Serialization.JsonPropertyName("ext_params")]
+        public IList<Types.Parameter>? ExtraParameterList { get; set; }
+    }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CityService/CityServiceGetServicePathResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CityService/CityServiceGetServicePathResponse.cs
new file mode 100644
index 00000000..df82aab6
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/CityService/CityServiceGetServicePathResponse.cs
@@ -0,0 +1,44 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+    /// <summary>
+    /// <para>表示 [POST] /cityservice/getservicepath 接口的响应。</para>
+    /// </summary>
+    public class CityServiceGetServicePathResponse : WechatApiResponse
+    {
+        /// <summary>
+        /// 获取或设置小程序 AppId。
+        /// </summary>
+        [Newtonsoft.Json.JsonProperty("app_id")]
+        [System.Text.Json.Serialization.JsonPropertyName("app_id")]
+        public string? AppId { get; set; }
+
+        /// <summary>
+        /// 获取或设置小程序页面路径。
+        /// </summary>
+        [Newtonsoft.Json.JsonProperty("path")]
+        [System.Text.Json.Serialization.JsonPropertyName("path")]
+        public string PagePath { get; set; } = default!;
+
+        /// <summary>
+        /// 获取或设置小程序页面参数字符串。
+        /// </summary>
+        [Newtonsoft.Json.JsonProperty("query_string")]
+        [System.Text.Json.Serialization.JsonPropertyName("query_string")]
+        public string PageQueryString { get; set; } = default!;
+
+        /// <summary>
+        /// 获取或设置业务类型。
+        /// </summary>
+        [Newtonsoft.Json.JsonProperty("business_type")]
+        [System.Text.Json.Serialization.JsonPropertyName("business_type")]
+        [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.NumericalStringReadOnlyConverter))]
+        public string? BusinessType { get; set; }
+
+        /// <summary>
+        /// 获取或设置小程序原始 ID。
+        /// </summary>
+        [Newtonsoft.Json.JsonProperty("username")]
+        [System.Text.Json.Serialization.JsonPropertyName("username")]
+        public string? Username { get; set; }
+    }
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CityService/CityServiceGetServicePathRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CityService/CityServiceGetServicePathRequest.json
new file mode 100644
index 00000000..96ce7400
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CityService/CityServiceGetServicePathRequest.json
@@ -0,0 +1,14 @@
+{
+    "page_type": 1,
+    "src_channel": 0,
+    "city_name": "广州",
+    "card_type": 10001,
+    "ext_params": [
+        {
+            "key": "keyword",
+            "value": "挂号就诊"
+        }
+    ],
+    "content_name": "购房落户",
+    "params": "[{\"key\":\"type\",\"value\":\"11\"},{\"key\":\"dd\",\"value\":\"23\"}]" 
+}
\ No newline at end of file
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CityService/CityServiceGetServicePathResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CityService/CityServiceGetServicePathResponse.json
new file mode 100644
index 00000000..bd5ce120
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/CityService/CityServiceGetServicePathResponse.json
@@ -0,0 +1,9 @@
+{
+    "errcode": 0,
+    "errmsg": "成功",
+    "app_id": "wx322xxxx",
+    "username": "gh_xxx",
+    "path": "XXX",
+    "query_string": "xxx",
+    "business_type": "xxd"
+}
\ No newline at end of file