diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Events/MarketingMemberCardOpen/MarketingMemberCardResource.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Events/MarketingMemberCardOpen/MarketingMemberCardResource.cs
new file mode 100644
index 00000000..23c26176
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Events/MarketingMemberCardOpen/MarketingMemberCardResource.cs
@@ -0,0 +1,69 @@
+using System;
+
+namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Events
+{
+ ///
+ /// 表示 MEMBERCARD.ACTIVATE_CARD 通知的数据。
+ /// 表示 MEMBERCARD.USERCARD_MANAGE 通知的数据。
+ ///
+ public class MarketingMemberCardResource : WechatTenpayEvent.Types.IDecryptedResource
+ {
+ ///
+ /// 获取或设置事件类型。
+ ///
+ [Newtonsoft.Json.JsonProperty("event_type")]
+ [System.Text.Json.Serialization.JsonPropertyName("event_type")]
+ public string EventType { get; set; } = default!;
+
+ ///
+ /// 获取或设置会员卡 ID。
+ ///
+ [Newtonsoft.Json.JsonProperty("card_id")]
+ [System.Text.Json.Serialization.JsonPropertyName("card_id")]
+ public string CardId { get; set; } = default!;
+
+ ///
+ /// 获取或设置会员卡 Code。
+ ///
+ [Newtonsoft.Json.JsonProperty("code")]
+ [System.Text.Json.Serialization.JsonPropertyName("code")]
+ public string? Code { get; set; }
+
+ ///
+ /// 获取或设置用户唯一标识。
+ ///
+ [Newtonsoft.Json.JsonProperty("openid")]
+ [System.Text.Json.Serialization.JsonPropertyName("openid")]
+ public string OpenId { get; set; } = default!;
+
+ ///
+ /// 获取或设置用户统一标识。
+ ///
+ [Newtonsoft.Json.JsonProperty("unionid")]
+ [System.Text.Json.Serialization.JsonPropertyName("unionid")]
+ public string? UnionId { get; set; }
+
+ ///
+ /// 获取或设置场景值。
+ ///
+ [Newtonsoft.Json.JsonProperty("activate_scene")]
+ [System.Text.Json.Serialization.JsonPropertyName("activate_scene")]
+ public string? SceneString { get; set; }
+
+ ///
+ /// 获取或设置自定义场景值。
+ ///
+ [Newtonsoft.Json.JsonProperty("outer_str")]
+ [System.Text.Json.Serialization.JsonPropertyName("outer_str")]
+ public string? OuterString { get; set; }
+
+ ///
+ /// 获取或设置事件时间。
+ ///
+ [Newtonsoft.Json.JsonProperty("event_time")]
+ [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RFC3339DateTimeOffsetConverter))]
+ [System.Text.Json.Serialization.JsonPropertyName("event_time")]
+ [System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RFC3339DateTimeOffsetConverter))]
+ public DateTimeOffset EventTime { get; set; }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteMarketingMemberCardOpenExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteMarketingMemberCardOpenExtensions.cs
index 4f024831..0f404f02 100644
--- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteMarketingMemberCardOpenExtensions.cs
+++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteMarketingMemberCardOpenExtensions.cs
@@ -281,5 +281,45 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
}
#endregion
+
+ #region Callback
+ ///
+ /// 异步调用 [POST] /marketing/membercard-open/callback 接口。
+ /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/marketing/membercard_open/chapter6_1.shtml
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteUpdateMarketingMemberCardOpenCallbackAsync(this WechatTenpayClient client, Models.UpdateMarketingMemberCardOpenCallbackRequest 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, "marketing", "membercard-open", "callback");
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [GET] /marketing/membercard-open/callback 接口。
+ /// REF: https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/marketing/membercard_open/chapter6_2.shtml
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteGetMarketingMemberCardOpenCallbackAsync(this WechatTenpayClient client, Models.GetMarketingMemberCardOpenCallbackRequest 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.Get, "marketing", "membercard-open", "callback");
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+ #endregion
}
}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingMemberCardOpen/Callback/GetMarketingMemberCardOpenCallbackRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingMemberCardOpen/Callback/GetMarketingMemberCardOpenCallbackRequest.cs
new file mode 100644
index 00000000..f8cd93cb
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingMemberCardOpen/Callback/GetMarketingMemberCardOpenCallbackRequest.cs
@@ -0,0 +1,9 @@
+namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
+{
+ ///
+ /// 表示 [GET] /marketing/membercard-open/callback 接口的请求。
+ ///
+ public class GetMarketingMemberCardOpenCallbackRequest : WechatTenpayRequest
+ {
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingMemberCardOpen/Callback/GetMarketingMemberCardOpenCallbackResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingMemberCardOpen/Callback/GetMarketingMemberCardOpenCallbackResponse.cs
new file mode 100644
index 00000000..8d21069c
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingMemberCardOpen/Callback/GetMarketingMemberCardOpenCallbackResponse.cs
@@ -0,0 +1,22 @@
+namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
+{
+ ///
+ /// 表示 [GET] /marketing/membercard-open/callback 接口的响应。
+ ///
+ public class GetMarketingMemberCardOpenCallbackResponse : WechatTenpayResponse
+ {
+ ///
+ /// 获取或设置微信商户号。
+ ///
+ [Newtonsoft.Json.JsonProperty("mchid")]
+ [System.Text.Json.Serialization.JsonPropertyName("mchid")]
+ public string MerchantId { get; set; } = default!;
+
+ ///
+ /// 获取或设置通知地址。
+ ///
+ [Newtonsoft.Json.JsonProperty("notify_url")]
+ [System.Text.Json.Serialization.JsonPropertyName("notify_url")]
+ public string NotifyUrl { get; set; } = default!;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingMemberCardOpen/Callback/UpdateMarketingMemberCardOpenCallbackRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingMemberCardOpen/Callback/UpdateMarketingMemberCardOpenCallbackRequest.cs
new file mode 100644
index 00000000..cc288be7
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingMemberCardOpen/Callback/UpdateMarketingMemberCardOpenCallbackRequest.cs
@@ -0,0 +1,15 @@
+namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
+{
+ ///
+ /// 表示 [POST] /marketing/membercard-open/callback 接口的请求。
+ ///
+ public class UpdateMarketingMemberCardOpenCallbackRequest : WechatTenpayRequest
+ {
+ ///
+ /// 获取或设置通知地址。
+ ///
+ [Newtonsoft.Json.JsonProperty("notify_url")]
+ [System.Text.Json.Serialization.JsonPropertyName("notify_url")]
+ public string NotifyUrl { get; set; } = string.Empty;
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingMemberCardOpen/Callback/UpdateMarketingMemberCardOpenCallbackResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingMemberCardOpen/Callback/UpdateMarketingMemberCardOpenCallbackResponse.cs
new file mode 100644
index 00000000..4900f4ae
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Models/MarketingMemberCardOpen/Callback/UpdateMarketingMemberCardOpenCallbackResponse.cs
@@ -0,0 +1,9 @@
+namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
+{
+ ///
+ /// 表示 [POST] /marketing/membercard-open/callback 接口的响应。
+ ///
+ public class UpdateMarketingMemberCardOpenCallbackResponse : GetMarketingMemberCardOpenCallbackResponse
+ {
+ }
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/EventSamples/MarketingMemberCardOpen/MarketingMemberCardResource.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/EventSamples/MarketingMemberCardOpen/MarketingMemberCardResource.json
new file mode 100644
index 00000000..09b8e4ae
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/EventSamples/MarketingMemberCardOpen/MarketingMemberCardResource.json
@@ -0,0 +1,9 @@
+{
+ "event_type": "MEMBER_CARD_ACTIVATE",
+ "event_time": "2019-12-17T10:35:53+08:00",
+ "openid": "obLatjnx9gnqzS4myYGmLZ7LgLBA",
+ "unionid": "obLatjvNtj7wO79ewoQBVIUEArg0",
+ "card_id": "paCkC00igoi8VmVpDvapnUhkN99w",
+ "code": "289560490049",
+ "outer_str": "sz_store_001"
+}
\ No newline at end of file
diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingMemberCardOpen/Callback/GetMarketingMemberCardOpenCallbackRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingMemberCardOpen/Callback/GetMarketingMemberCardOpenCallbackRequest.json
new file mode 100644
index 00000000..22fdca1b
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingMemberCardOpen/Callback/GetMarketingMemberCardOpenCallbackRequest.json
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingMemberCardOpen/Callback/GetMarketingMemberCardOpenCallbackResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingMemberCardOpen/Callback/GetMarketingMemberCardOpenCallbackResponse.json
new file mode 100644
index 00000000..aadae39d
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingMemberCardOpen/Callback/GetMarketingMemberCardOpenCallbackResponse.json
@@ -0,0 +1,4 @@
+{
+ "notify_url": "https://shangjia.com",
+ "mchid": "99999105"
+}
\ No newline at end of file
diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingMemberCardOpen/Callback/UpdateMarketingMemberCardOpenCallbackRequest.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingMemberCardOpen/Callback/UpdateMarketingMemberCardOpenCallbackRequest.json
new file mode 100644
index 00000000..c8d417fc
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingMemberCardOpen/Callback/UpdateMarketingMemberCardOpenCallbackRequest.json
@@ -0,0 +1,3 @@
+{
+ "notify_url": "https://shangjia.com"
+}
\ No newline at end of file
diff --git a/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingMemberCardOpen/Callback/UpdateMarketingMemberCardOpenCallbackResponse.json b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingMemberCardOpen/Callback/UpdateMarketingMemberCardOpenCallbackResponse.json
new file mode 100644
index 00000000..aadae39d
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests/ModelSamples/MarketingMemberCardOpen/Callback/UpdateMarketingMemberCardOpenCallbackResponse.json
@@ -0,0 +1,4 @@
+{
+ "notify_url": "https://shangjia.com",
+ "mchid": "99999105"
+}
\ No newline at end of file