feat(tenpayv3): 新增会员卡投放相关接口

This commit is contained in:
Fu Diwei
2021-12-09 17:05:53 +08:00
parent 6860c0d0f2
commit 71c287ab2c
21 changed files with 411 additions and 0 deletions

View File

@@ -321,5 +321,104 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
return await client.SendRequestWithJsonAsync<Models.GetMarketingMemberCardOpenCallbackResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
}
#endregion
#region Activation
/// <summary>
/// <para>异步调用 [POST] /marketing/membercard-open/cards/{card_id}/qrcode 接口。</para>
/// <para>REF: https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/marketing/membercard_open/chapter4_3.shtml </para>
/// </summary>
/// <param name="client"></param>
/// <param name="request"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public static async Task<Models.CreateMarketingMemberCardOpenCardQrcodeResponse> ExecuteCreateMarketingMemberCardOpenCardQrcodeAsync(this WechatTenpayClient client, Models.CreateMarketingMemberCardOpenCardQrcodeRequest 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", "cards", request.CardId, "qrcode");
return await client.SendRequestWithJsonAsync<Models.CreateMarketingMemberCardOpenCardQrcodeResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
}
/// <summary>
/// <para>异步调用 [POST] /marketing/membercard-open/cards/{card_id}/permission-tokens 接口。</para>
/// <para>REF: https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/marketing/membercard_open/chapter4_7.shtml </para>
/// </summary>
/// <param name="client"></param>
/// <param name="request"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public static async Task<Models.CreateMarketingMemberCardOpenCardPermissionTokenResponse> ExecuteCreateMarketingMemberCardOpenCardPermissionTokenAsync(this WechatTenpayClient client, Models.CreateMarketingMemberCardOpenCardPermissionTokenRequest 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", "cards", request.CardId, "permission-tokens");
return await client.SendRequestWithJsonAsync<Models.CreateMarketingMemberCardOpenCardPermissionTokenResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
}
/// <summary>
/// <para>异步调用 [GET] /marketing/membercard-open/cards/{card_id}/decrypt-code 接口。</para>
/// <para>REF: https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/marketing/membercard_open/chapter4_4.shtml </para>
/// </summary>
/// <param name="client"></param>
/// <param name="request"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public static async Task<Models.DecryptMarketingMemberCardOpenCardCodeResponse> ExecuteDecryptMarketingMemberCardOpenCardCodeAsync(this WechatTenpayClient client, Models.DecryptMarketingMemberCardOpenCardCodeRequest 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", "cards", request.CardId, "decrypt-code")
.SetQueryParam("card_id", request.CardId)
.SetQueryParam("encrypt_code", request.EncryptedCode);
return await client.SendRequestWithJsonAsync<Models.DecryptMarketingMemberCardOpenCardCodeResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
}
/// <summary>
/// <para>异步调用 [GET] /marketing/membercard-open/activate-informations/{activate_ticket} 接口。</para>
/// <para>REF: https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/marketing/membercard_open/chapter4_5.shtml </para>
/// </summary>
/// <param name="client"></param>
/// <param name="request"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public static async Task<Models.GetMarketingMemberCardOpenActivateInformationResponse> ExecuteGetMarketingMemberCardOpenActivateInformationAsync(this WechatTenpayClient client, Models.GetMarketingMemberCardOpenActivateInformationRequest 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", "activate-informations", request.ActivateTicket);
return await client.SendRequestWithJsonAsync<Models.GetMarketingMemberCardOpenActivateInformationResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
}
/// <summary>
/// <para>异步调用 [POST] /marketing/membercard-open/cards/{card_id}/codes/{code}/activate 接口。</para>
/// <para>REF: https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/marketing/membercard_open/chapter3_10.shtml </para>
/// </summary>
/// <param name="client"></param>
/// <param name="request"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public static async Task<Models.ActivateMarketingMemberCardOpenCardCodeResponse> ExecuteActivateMarketingMemberCardOpenCardCodeAsync(this WechatTenpayClient client, Models.ActivateMarketingMemberCardOpenCardCodeRequest 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", "cards", request.CardId, "codes", request.Code, "activate");
return await client.SendRequestWithJsonAsync<Models.ActivateMarketingMemberCardOpenCardCodeResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
}
#endregion
}
}

View File

@@ -0,0 +1,29 @@
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
{
/// <summary>
/// <para>表示 [POST] /marketing/membercard-open/cards/{card_id}/codes/{code}/activate 接口的请求。</para>
/// </summary>
public class ActivateMarketingMemberCardOpenCardCodeRequest : WechatTenpayRequest
{
/// <summary>
/// 获取或设置会员卡 ID。
/// </summary>
[Newtonsoft.Json.JsonIgnore]
[System.Text.Json.Serialization.JsonIgnore]
public string CardId { get; set; } = string.Empty;
/// <summary>
/// 获取或设置会员卡 Code。
/// </summary>
[Newtonsoft.Json.JsonIgnore]
[System.Text.Json.Serialization.JsonIgnore]
public string Code { get; set; } = string.Empty;
/// <summary>
/// 获取或设置会员编号。
/// </summary>
[Newtonsoft.Json.JsonProperty("membership_number")]
[System.Text.Json.Serialization.JsonPropertyName("membership_number")]
public string? MembershipNumber { get; set; }
}
}

View File

@@ -0,0 +1,9 @@
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
{
/// <summary>
/// <para>表示 [POST] /marketing/membercard-open/cards/{card_id}/codes/{code}/activate 接口的响应。</para>
/// </summary>
public class ActivateMarketingMemberCardOpenCardCodeResponse : WechatTenpayResponse
{
}
}

View File

@@ -0,0 +1,57 @@
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
{
/// <summary>
/// <para>表示 [POST] /marketing/membercard-open/cards/{card_id}/permission-tokens 接口的请求。</para>
/// </summary>
public class CreateMarketingMemberCardOpenCardPermissionTokenRequest : WechatTenpayRequest
{
/// <summary>
/// 获取或设置会员卡 ID。
/// </summary>
[Newtonsoft.Json.JsonIgnore]
[System.Text.Json.Serialization.JsonIgnore]
public string CardId { get; set; } = string.Empty;
/// <summary>
/// 获取或设置激活类型。
/// </summary>
[Newtonsoft.Json.JsonProperty("activate_type")]
[System.Text.Json.Serialization.JsonPropertyName("activate_type")]
public string ActivateType { get; set; } = string.Empty;
/// <summary>
/// 获取或设置是否在用户在开卡完成后返回拉起开卡组件的商家页面。
/// </summary>
[Newtonsoft.Json.JsonProperty("navigate_back_previous_page")]
[System.Text.Json.Serialization.JsonPropertyName("navigate_back_previous_page")]
public bool? RequireNavigateBackPreviousPage { get; set; }
/// <summary>
/// 获取或设置激活跳转 URL。
/// </summary>
[Newtonsoft.Json.JsonProperty("activate_url")]
[System.Text.Json.Serialization.JsonPropertyName("activate_url")]
public string? ActivateUrl { get; set; }
/// <summary>
/// 获取或设置激活跳转小程序 AppId。
/// </summary>
[Newtonsoft.Json.JsonProperty("activate_appid")]
[System.Text.Json.Serialization.JsonPropertyName("activate_appid")]
public string? ActivateMiniProgramAppId { get; set; }
/// <summary>
/// 获取或设置激活跳转小程序页面路径。
/// </summary>
[Newtonsoft.Json.JsonProperty("activate_path")]
[System.Text.Json.Serialization.JsonPropertyName("activate_path")]
public string ActivateMiniProgramPath { get; set; } = string.Empty;
/// <summary>
/// 获取或设置自定义场景值。
/// </summary>
[Newtonsoft.Json.JsonProperty("outer_str")]
[System.Text.Json.Serialization.JsonPropertyName("outer_str")]
public string? OuterString { get; set; }
}
}

View File

@@ -0,0 +1,15 @@
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
{
/// <summary>
/// <para>表示 [POST] /marketing/membercard-open/cards/{card_id}/permission-tokens 接口的响应。</para>
/// </summary>
public class CreateMarketingMemberCardOpenCardPermissionTokenResponse : WechatTenpayResponse
{
/// <summary>
/// 获取或设置预授权 Token。
/// </summary>
[Newtonsoft.Json.JsonProperty("permission_token")]
[System.Text.Json.Serialization.JsonPropertyName("permission_token")]
public string PermissionToken { get; set; } = default!;
}
}

View File

@@ -0,0 +1,50 @@
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
{
/// <summary>
/// <para>表示 [POST] /marketing/membercard-open/cards/{card_id}/qrcode 接口的请求。</para>
/// </summary>
public class CreateMarketingMemberCardOpenCardQrcodeRequest : WechatTenpayRequest
{
/// <summary>
/// 获取或设置会员卡 ID。
/// </summary>
[Newtonsoft.Json.JsonIgnore]
[System.Text.Json.Serialization.JsonIgnore]
public string CardId { get; set; } = string.Empty;
/// <summary>
/// 获取或设置激活类型。
/// </summary>
[Newtonsoft.Json.JsonProperty("activate_type")]
[System.Text.Json.Serialization.JsonPropertyName("activate_type")]
public string ActivateType { get; set; } = string.Empty;
/// <summary>
/// 获取或设置激活跳转 URL。
/// </summary>
[Newtonsoft.Json.JsonProperty("activate_url")]
[System.Text.Json.Serialization.JsonPropertyName("activate_url")]
public string? ActivateUrl { get; set; }
/// <summary>
/// 获取或设置激活跳转小程序 AppId。
/// </summary>
[Newtonsoft.Json.JsonProperty("activate_appid")]
[System.Text.Json.Serialization.JsonPropertyName("activate_appid")]
public string? ActivateMiniProgramAppId { get; set; }
/// <summary>
/// 获取或设置激活跳转小程序页面路径。
/// </summary>
[Newtonsoft.Json.JsonProperty("activate_path")]
[System.Text.Json.Serialization.JsonPropertyName("activate_path")]
public string ActivateMiniProgramPath { get; set; } = string.Empty;
/// <summary>
/// 获取或设置自定义场景值。
/// </summary>
[Newtonsoft.Json.JsonProperty("outer_str")]
[System.Text.Json.Serialization.JsonPropertyName("outer_str")]
public string? OuterString { get; set; }
}
}

View File

@@ -0,0 +1,15 @@
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
{
/// <summary>
/// <para>表示 [POST] /marketing/membercard-open/cards/{card_id}/qrcode 接口的响应。</para>
/// </summary>
public class CreateMarketingMemberCardOpenCardQrcodeResponse : WechatTenpayResponse
{
/// <summary>
/// 获取或设置二维码对应的 URL。
/// </summary>
[Newtonsoft.Json.JsonProperty("url")]
[System.Text.Json.Serialization.JsonPropertyName("url")]
public string QrcodeUrl { get; set; } = default!;
}
}

View File

@@ -0,0 +1,22 @@
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
{
/// <summary>
/// <para>表示 [GET] /marketing/membercard-open/cards/{card_id}/decrypt-code 接口的请求。</para>
/// </summary>
public class DecryptMarketingMemberCardOpenCardCodeRequest : WechatTenpayRequest
{
/// <summary>
/// 获取或设置会员卡 ID。
/// </summary>
[Newtonsoft.Json.JsonIgnore]
[System.Text.Json.Serialization.JsonIgnore]
public string CardId { get; set; } = string.Empty;
/// <summary>
/// 获取或设置加密会员 Code。
/// </summary>
[Newtonsoft.Json.JsonIgnore]
[System.Text.Json.Serialization.JsonIgnore]
public string EncryptedCode { get; set; } = string.Empty;
}
}

View File

@@ -0,0 +1,13 @@
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
{
/// <summary>
/// <para>表示 [GET] /marketing/membercard-open/cards/{card_id}/decrypt-code 接口的响应。</para>
/// </summary>
public class DecryptMarketingMemberCardOpenCardCodeResponse : WechatTenpayResponse
{
public override bool IsSuccessful()
{
return RawStatus == 200;
}
}
}

View File

@@ -0,0 +1,15 @@
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
{
/// <summary>
/// <para>表示 [GET] /marketing/membercard-open/activate-informations/{activate_ticket} 接口的请求。</para>
/// </summary>
public class GetMarketingMemberCardOpenActivateInformationRequest : WechatTenpayRequest
{
/// <summary>
/// 获取或设置激活 Ticket。
/// </summary>
[Newtonsoft.Json.JsonIgnore]
[System.Text.Json.Serialization.JsonIgnore]
public string ActivateTicket { get; set; } = string.Empty;
}
}

View File

@@ -0,0 +1,36 @@
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Models
{
/// <summary>
/// <para>表示 [GET] /marketing/membercard-open/activate-informations/{activate_ticket} 接口的响应。</para>
/// </summary>
public class GetMarketingMemberCardOpenActivateInformationResponse : WechatTenpayResponse
{
public static class Types
{
public class UserInformation : GetMarketingMemberCardOpenCardCodeByCardIdAndCodeResponse.Types.UserInformation
{
}
}
/// <summary>
/// 获取或设置用户的微信昵称。
/// </summary>
[Newtonsoft.Json.JsonProperty("nickname")]
[System.Text.Json.Serialization.JsonPropertyName("nickname")]
public string? Nickname { get; set; }
/// <summary>
/// 获取或设置用户的微信头像 URL。
/// </summary>
[Newtonsoft.Json.JsonProperty("head_image_url")]
[System.Text.Json.Serialization.JsonPropertyName("head_image_url")]
public string? HeadImageUrl { get; set; }
/// <summary>
/// 获取或设置用户开卡时填写的个人信息。
/// </summary>
[Newtonsoft.Json.JsonProperty("user_information")]
[System.Text.Json.Serialization.JsonPropertyName("user_information")]
public Types.UserInformation? UserInformation { get; set; }
}
}

View File

@@ -0,0 +1,8 @@
{
"activate_type": "AUTO_ACTIVATE",
"navigate_back_previous_page": true,
"activate_url": "https://w.url.cn/s/Ahz3p2C",
"activate_appid": "wxea9c30a90fs8d3fe",
"activate_path": "pages/activate/activate",
"outer_str": "szwxtd"
}

View File

@@ -0,0 +1,3 @@
{
"permission_token": "EhhEF0Jt0uDLPK6Cr70KCrJmkTtfPPE222gUFsdP87CF4RqzpIdnNpDsbOD1kpsNuioecawJqEUfANcDhLrSA3xadU4pD6IJ7tpLEheA3kS1b6"
}

View File

@@ -0,0 +1,7 @@
{
"activate_type": "AUTO_ACTIVATE",
"activate_url": "https://w.url.cn/s/Ahz3p2C",
"activate_appid": "wxea9c30a90fs8d3fe",
"activate_path": "pages/activate/activate",
"outer_str": "szwxtd"
}

View File

@@ -0,0 +1,21 @@
{
"nickname": "周星星",
"head_image_url": "https://xxx.jpg",
"user_information": {
"common_field_list": [
{
"name": "USER_FORM_FLAG_MOBILE",
"value": "深圳"
}
],
"custom_field_list": [
{
"name": "喜欢的运动",
"value": "篮球",
"value_list": [
"羽毛球,足球,乒乓球"
]
}
]
}
}