diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteWxaExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteWxaExtensions.cs
index 82d59fb7..938e9a5e 100644
--- a/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteWxaExtensions.cs
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Extensions/WechatApiClientExecuteWxaExtensions.cs
@@ -13,6 +13,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Api
/// 异步调用 [GET] /wxa/checksession 接口。
///
/// REF:
+ ///
///
///
///
@@ -35,6 +36,33 @@ namespace SKIT.FlurlHttpClient.Wechat.Api
return await client.SendFlurlRequestAsJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
}
+ ///
+ /// 异步调用 [GET] /wxa/resetusersessionkey 接口。
+ ///
+ /// REF:
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteWxaResetUserSessionKeyAsync(this WechatApiClient client, Models.WxaResetUserSessionKeyRequest 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
+ .CreateFlurlRequest(request, HttpMethod.Get, "wxa", "resetusersessionkey")
+ .SetQueryParam("access_token", request.AccessToken)
+ .SetQueryParam("openid", request.OpenId)
+ .SetQueryParam("signature", request.Signature)
+ .SetQueryParam("sig_method", request.SignMethod);
+
+ return await client.SendFlurlRequestAsJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
+ }
+
///
/// 异步调用 [GET] /wxa/getpaidunionid 接口。
///
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Wxa/WxaCheckSessionRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Wxa/WxaCheckSessionRequest.cs
index 4891345a..26f47977 100644
--- a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Wxa/WxaCheckSessionRequest.cs
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Wxa/WxaCheckSessionRequest.cs
@@ -1,4 +1,6 @@
-namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+using System;
+
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
{
///
/// 表示 [GET] /wxa/checksession 接口的请求。
@@ -21,10 +23,27 @@
///
/// 获取或设置用户登录态签名的哈希方法。
- /// 默认值:hmac_sha256
+ /// 默认值:"hmac_sha256"
///
[Newtonsoft.Json.JsonIgnore]
[System.Text.Json.Serialization.JsonIgnore]
public string SignMethod { get; set; } = "hmac_sha256";
+
+ public void SetSignatureBySessionKey(string sessionKey, string signMethod = "hmac_sha256")
+ {
+ if (sessionKey is null) throw new ArgumentNullException(nameof(sessionKey));
+ if (signMethod is null) throw new ArgumentNullException(nameof(signMethod));
+
+ switch (signMethod)
+ {
+ case "hmac_sha256":
+ Signature = Utilities.HMACUtility.HashWithSHA256(sessionKey, string.Empty).Value!.ToLower();
+ SignMethod = signMethod;
+ break;
+
+ default:
+ throw new NotSupportedException();
+ }
+ }
}
}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Wxa/WxaResetUserSessionKeyRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Wxa/WxaResetUserSessionKeyRequest.cs
new file mode 100644
index 00000000..ca02f62f
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Wxa/WxaResetUserSessionKeyRequest.cs
@@ -0,0 +1,49 @@
+using System;
+
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [GET] /wxa/resetusersessionkey 接口的请求。
+ ///
+ public class WxaResetUserSessionKeyRequest : WechatApiRequest, IInferable
+ {
+ ///
+ /// 获取或设置用户唯一标识。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public string OpenId { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置用户登录态签名。
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public string Signature { get; set; } = string.Empty;
+
+ ///
+ /// 获取或设置用户登录态签名的哈希方法。
+ /// 默认值:"hmac_sha256"
+ ///
+ [Newtonsoft.Json.JsonIgnore]
+ [System.Text.Json.Serialization.JsonIgnore]
+ public string SignMethod { get; set; } = "hmac_sha256";
+
+ public void SetSignatureBySessionKey(string sessionKey, string signMethod = "hmac_sha256")
+ {
+ if (sessionKey is null) throw new ArgumentNullException(nameof(sessionKey));
+ if (signMethod is null) throw new ArgumentNullException(nameof(signMethod));
+
+ switch (signMethod)
+ {
+ case "hmac_sha256":
+ Signature = Utilities.HMACUtility.HashWithSHA256(sessionKey, string.Empty).Value!.ToLower();
+ SignMethod = signMethod;
+ break;
+
+ default:
+ throw new NotSupportedException();
+ }
+ }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Wxa/WxaResetUserSessionKeyResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Wxa/WxaResetUserSessionKeyResponse.cs
new file mode 100644
index 00000000..12ed32f7
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Models/Wxa/WxaResetUserSessionKeyResponse.cs
@@ -0,0 +1,22 @@
+namespace SKIT.FlurlHttpClient.Wechat.Api.Models
+{
+ ///
+ /// 表示 [GET] /wxa/resetusersessionkey 接口的响应。
+ ///
+ public class WxaResetUserSessionKeyResponse : WechatApiResponse
+ {
+ ///
+ /// 获取或设置用户唯一标识。
+ ///
+ [Newtonsoft.Json.JsonProperty("openid")]
+ [System.Text.Json.Serialization.JsonPropertyName("openid")]
+ public string OpenId { get; set; } = default!;
+
+ ///
+ /// 获取或设置重置后的会话密钥。
+ ///
+ [Newtonsoft.Json.JsonProperty("session_key")]
+ [System.Text.Json.Serialization.JsonPropertyName("session_key")]
+ public string SessionKey { get; set; } = default!;
+ }
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Wxa/WxaResetUserSessionKeyResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Wxa/WxaResetUserSessionKeyResponse.json
new file mode 100644
index 00000000..70771607
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Api.UnitTests/ModelSamples/Wxa/WxaResetUserSessionKeyResponse.json
@@ -0,0 +1,6 @@
+{
+ "errcode": 0,
+ "errmsg": "ok",
+ "openid": "xxxxxxx",
+ "session_key": "xxxxxxxx"
+}