feat(wxapi): 新增小游戏游戏内容安全相关接口

This commit is contained in:
Fu Diwei 2024-06-20 16:45:01 +08:00
parent 4e40454ce7
commit 6760c959c1
35 changed files with 358 additions and 32 deletions

View File

@ -109,10 +109,10 @@
| | 微信 API | 备注 |
| :-: | :----------: | :--: |
| √ | 基础功能 | |
| √ | OpenAPI 管理 | |
| √ | 虚拟支付 | |
| √ | 接口调用凭证 | |
| √ | 登录 | |
| √ | 内容安全 | |
| √ | 游戏内容安全 | |
| √ | 开放数据 |
| √ | 动态消息 | |
| √ | 小程序码 | |
@ -125,11 +125,9 @@
| √ | 硬件设备 | |
| √ | 网络 | |
| √ | 帧同步 | |
| √ | 手机号 | |
| √ | 安全风控 | |
| √ | Short Link | |
| √ | 订阅消息 | |
| √ | 虚拟支付 | |
</details>

View File

@ -74,7 +74,6 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Events
}
}
/// <summary>
/// 获取或设置微信商户号。
/// </summary>
@ -101,7 +100,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Events
public string AppId { get; set; } = default!;
/// <summary>
/// 获取或设置任务 ID
/// 获取或设置请求跟踪标识
/// </summary>
[Newtonsoft.Json.JsonProperty("trace_id")]
[System.Text.Json.Serialization.JsonPropertyName("trace_id")]

View File

@ -9,8 +9,57 @@ namespace SKIT.FlurlHttpClient.Wechat.Api
{
public static class WechatApiClientExecuteWxaGameExtensions
{
#region ContentSpam
/// <summary>
/// <para>异步调用 [POST] /wxa/game/content_spam/msg_sec_check 接口。</para>
/// <para>
/// REF: <br/>
/// <![CDATA[ https://developers.weixin.qq.com/minigame/dev/api-backend/open-api/wxa-sec-check/gamesecurity.msgSecCheck.html ]]>
/// </para>
/// </summary>
/// <param name="client"></param>
/// <param name="request"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public static async Task<Models.WxaGameContentSpamMessageSecurityCheckResponse> ExecuteWxaGameContentSpamMessageSecurityCheckAsync(this WechatApiClient client, Models.WxaGameContentSpamMessageSecurityCheckRequest 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.Post, "wxa", "game", "content_spam", "msg_sec_check")
.SetQueryParam("access_token", request.AccessToken);
return await client.SendFlurlRequestAsJsonAsync<Models.WxaGameContentSpamMessageSecurityCheckResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
}
/// <summary>
/// <para>异步调用 [POST] /wxa/game/content_spam/media_check_sync 接口。</para>
/// <para>
/// REF: <br/>
/// <![CDATA[ https://developers.weixin.qq.com/minigame/dev/api-backend/open-api/wxa-sec-check/gamesecurity.mediaCheck.html ]]>
/// </para>
/// </summary>
/// <param name="client"></param>
/// <param name="request"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public static async Task<Models.WxaGameContentSpamMediaCheckSyncResponse> ExecuteWxaGameContentSpamMediaCheckSyncAsync(this WechatApiClient client, Models.WxaGameContentSpamMediaCheckSyncRequest 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.Post, "wxa", "game", "content_spam", "media_check_sync")
.SetQueryParam("access_token", request.AccessToken);
return await client.SendFlurlRequestAsJsonAsync<Models.WxaGameContentSpamMediaCheckSyncResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
}
#endregion
#region Payment
private static T PreprocessRequest<T>(WechatApiClient client, ref T request)
where T : Models.WxaGameRequestBase, new()
where T : Models.WxaGamePaymentRequestBase, new()
{
if (client is null) throw new ArgumentNullException(nameof(request));
if (request is null) throw new ArgumentNullException(nameof(request));
@ -207,5 +256,6 @@ namespace SKIT.FlurlHttpClient.Wechat.Api
return await client.SendFlurlRequestAsJsonAsync<Models.WxaGameQueryOrderInfoResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
}
#endregion
}
}

View File

@ -1,10 +1,17 @@
namespace SKIT.FlurlHttpClient.Wechat.Api.Models
namespace SKIT.FlurlHttpClient.Wechat.Api.Models
{
/// <summary>
/// <para>表示 [POST] /wxa/media_check_async 接口的请求。</para>
/// </summary>
public class WxaMediaCheckRequest : WechatApiRequest, IInferable<WxaMediaCheckRequest, WxaMediaCheckResponse>
{
/// <summary>
/// 获取或设置用户 OpenId。
/// </summary>
[Newtonsoft.Json.JsonProperty("openid")]
[System.Text.Json.Serialization.JsonPropertyName("openid")]
public string? OpenId { get; set; }
/// <summary>
/// 获取或设置多媒体 URL。
/// </summary>
@ -32,12 +39,5 @@
[Newtonsoft.Json.JsonProperty("scene")]
[System.Text.Json.Serialization.JsonPropertyName("scene")]
public int? Scene { get; set; }
/// <summary>
/// 获取或设置用户 OpenId。
/// </summary>
[Newtonsoft.Json.JsonProperty("openid")]
[System.Text.Json.Serialization.JsonPropertyName("openid")]
public string? OpenId { get; set; }
}
}

View File

@ -1,10 +1,17 @@
namespace SKIT.FlurlHttpClient.Wechat.Api.Models
namespace SKIT.FlurlHttpClient.Wechat.Api.Models
{
/// <summary>
/// <para>表示 [POST] /wxa/msg_sec_check 接口的请求。</para>
/// </summary>
public class WxaMessageSecurityCheckRequest : WechatApiRequest, IInferable<WxaMessageSecurityCheckRequest, WxaMessageSecurityCheckResponse>
{
/// <summary>
/// 获取或设置用户 OpenId。
/// </summary>
[Newtonsoft.Json.JsonProperty("openid")]
[System.Text.Json.Serialization.JsonPropertyName("openid")]
public string? OpenId { get; set; }
/// <summary>
/// 获取或设置用户昵称。
/// </summary>
@ -46,12 +53,5 @@
[Newtonsoft.Json.JsonProperty("scene")]
[System.Text.Json.Serialization.JsonPropertyName("scene")]
public int? Scene { get; set; }
/// <summary>
/// 获取或设置用户 OpenId。
/// </summary>
[Newtonsoft.Json.JsonProperty("openid")]
[System.Text.Json.Serialization.JsonPropertyName("openid")]
public string? OpenId { get; set; }
}
}

View File

@ -1,4 +1,4 @@
namespace SKIT.FlurlHttpClient.Wechat.Api.Models
namespace SKIT.FlurlHttpClient.Wechat.Api.Models
{
/// <summary>
/// <para>表示 [POST] /wxa/msg_sec_check 接口的响应。</para>
@ -78,7 +78,7 @@
}
/// <summary>
/// 获取或设置任务 ID
/// 获取或设置请求跟踪标识
/// </summary>
[Newtonsoft.Json.JsonProperty("trace_id")]
[System.Text.Json.Serialization.JsonPropertyName("trace_id")]

View File

@ -0,0 +1,44 @@
namespace SKIT.FlurlHttpClient.Wechat.Api.Models
{
/// <summary>
/// <para>表示 [POST] /wxa/game/content_spam/media_check_sync 接口的请求。</para>
/// </summary>
public class WxaGameContentSpamMediaCheckSyncRequest : WechatApiRequest, IInferable<WxaGameContentSpamMediaCheckSyncRequest, WxaGameContentSpamMediaCheckSyncResponse>
{
/// <summary>
/// 获取或设置用户 OpenId。
/// </summary>
[Newtonsoft.Json.JsonProperty("openid")]
[System.Text.Json.Serialization.JsonPropertyName("openid")]
public string OpenId { get; set; } = string.Empty;
/// <summary>
/// 获取或设置多媒体 URL。
/// </summary>
[Newtonsoft.Json.JsonProperty("media_url")]
[System.Text.Json.Serialization.JsonPropertyName("media_url")]
public string MediaUrl { get; set; } = string.Empty;
/// <summary>
/// 获取或设置多媒体类型。
/// </summary>
[Newtonsoft.Json.JsonProperty("media_type")]
[System.Text.Json.Serialization.JsonPropertyName("media_type")]
public int MediaType { get; set; }
/// <summary>
/// 获取或设置版本号。
/// <para>默认值2</para>
/// </summary>
[Newtonsoft.Json.JsonProperty("version")]
[System.Text.Json.Serialization.JsonPropertyName("version")]
public int Version { get; set; } = 2;
/// <summary>
/// 获取或设置场景值。
/// </summary>
[Newtonsoft.Json.JsonProperty("scene")]
[System.Text.Json.Serialization.JsonPropertyName("scene")]
public int Scene { get; set; }
}
}

View File

@ -0,0 +1,87 @@
namespace SKIT.FlurlHttpClient.Wechat.Api.Models
{
/// <summary>
/// <para>表示 [POST] /wxa/game/content_spam/media_check_sync 接口的响应。</para>
/// </summary>
public class WxaGameContentSpamMediaCheckSyncResponse : WechatApiResponse
{
public static class Types
{
public class Result
{
/// <summary>
/// 获取或设置建议类型。
/// </summary>
[Newtonsoft.Json.JsonProperty("suggest")]
[System.Text.Json.Serialization.JsonPropertyName("suggest")]
public string SuggestType { get; set; } = default!;
/// <summary>
/// 获取或设置命中标签枚举值。
/// </summary>
[Newtonsoft.Json.JsonProperty("label")]
[System.Text.Json.Serialization.JsonPropertyName("label")]
public int Label { get; set; }
}
public class Detail
{
/// <summary>
/// 获取或设置错误码。
/// </summary>
[Newtonsoft.Json.JsonProperty("errcode")]
[System.Text.Json.Serialization.JsonPropertyName("errcode")]
public int ErrorCode { get; set; }
/// <summary>
/// 获取或设置策略类型。
/// </summary>
[Newtonsoft.Json.JsonProperty("strategy")]
[System.Text.Json.Serialization.JsonPropertyName("strategy")]
public string Strategy { get; set; } = default!;
/// <summary>
/// 获取或设置建议类型。
/// </summary>
[Newtonsoft.Json.JsonProperty("suggest")]
[System.Text.Json.Serialization.JsonPropertyName("suggest")]
public string? SuggestType { get; set; }
/// <summary>
/// 获取或设置命中标签枚举值。
/// </summary>
[Newtonsoft.Json.JsonProperty("label")]
[System.Text.Json.Serialization.JsonPropertyName("label")]
public int? Label { get; set; }
/// <summary>
/// 获取或设置置信度。
/// </summary>
[Newtonsoft.Json.JsonProperty("prob")]
[System.Text.Json.Serialization.JsonPropertyName("prob")]
public int? Probability { get; set; }
}
}
/// <summary>
/// 获取或设置请求跟踪标识。
/// </summary>
[Newtonsoft.Json.JsonProperty("trace_id")]
[System.Text.Json.Serialization.JsonPropertyName("trace_id")]
public string TraceId { get; set; } = default!;
/// <summary>
/// 获取或设置综合结果信息。
/// </summary>
[Newtonsoft.Json.JsonProperty("result")]
[System.Text.Json.Serialization.JsonPropertyName("result")]
public Types.Result? Result { get; set; }
/// <summary>
/// 获取或设置详细结果列表。
/// </summary>
[Newtonsoft.Json.JsonProperty("detail")]
[System.Text.Json.Serialization.JsonPropertyName("detail")]
public Types.Detail[]? DetailList { get; set; }
}
}

View File

@ -0,0 +1,44 @@
namespace SKIT.FlurlHttpClient.Wechat.Api.Models
{
/// <summary>
/// <para>表示 [POST] /wxa/game/content_spam/msg_sec_check 接口的请求。</para>
/// </summary>
public class WxaGameContentSpamMessageSecurityCheckRequest : WechatApiRequest, IInferable<WxaGameContentSpamMessageSecurityCheckRequest, WxaGameContentSpamMessageSecurityCheckResponse>
{
/// <summary>
/// 获取或设置用户 OpenId。
/// </summary>
[Newtonsoft.Json.JsonProperty("openid")]
[System.Text.Json.Serialization.JsonPropertyName("openid")]
public string OpenId { get; set; } = string.Empty;
/// <summary>
/// 获取或设置用户昵称。
/// </summary>
[Newtonsoft.Json.JsonProperty("nickname")]
[System.Text.Json.Serialization.JsonPropertyName("nickname")]
public string? Nickname { get; set; }
/// <summary>
/// 获取或设置文本内容。
/// </summary>
[Newtonsoft.Json.JsonProperty("content")]
[System.Text.Json.Serialization.JsonPropertyName("content")]
public string Content { get; set; } = string.Empty;
/// <summary>
/// 获取或设置版本号。
/// <para>默认值2</para>
/// </summary>
[Newtonsoft.Json.JsonProperty("version")]
[System.Text.Json.Serialization.JsonPropertyName("version")]
public int Version { get; set; } = 2;
/// <summary>
/// 获取或设置场景值。
/// </summary>
[Newtonsoft.Json.JsonProperty("scene")]
[System.Text.Json.Serialization.JsonPropertyName("scene")]
public int Scene { get; set; }
}
}

View File

@ -0,0 +1,46 @@
namespace SKIT.FlurlHttpClient.Wechat.Api.Models
{
/// <summary>
/// <para>表示 [POST] /wxa/game/content_spam/msg_sec_check 接口的响应。</para>
/// </summary>
public class WxaGameContentSpamMessageSecurityCheckResponse : WechatApiResponse
{
public static class Types
{
public class Result : WxaMessageSecurityCheckResponse.Types.Result
{
/// <summary>
/// 获取或设置替换后的文本。
/// </summary>
[Newtonsoft.Json.JsonProperty("replaced_content")]
[System.Text.Json.Serialization.JsonPropertyName("replaced_content")]
public string ReplacedContent { get; set; } = default!;
}
public class Detail : WxaMessageSecurityCheckResponse.Types.Detail
{
}
}
/// <summary>
/// 获取或设置请求跟踪标识。
/// </summary>
[Newtonsoft.Json.JsonProperty("trace_id")]
[System.Text.Json.Serialization.JsonPropertyName("trace_id")]
public string TraceId { get; set; } = default!;
/// <summary>
/// 获取或设置综合结果信息。
/// </summary>
[Newtonsoft.Json.JsonProperty("result")]
[System.Text.Json.Serialization.JsonPropertyName("result")]
public Types.Result? Result { get; set; }
/// <summary>
/// 获取或设置详细结果列表。
/// </summary>
[Newtonsoft.Json.JsonProperty("detail")]
[System.Text.Json.Serialization.JsonPropertyName("detail")]
public Types.Detail[]? DetailList { get; set; }
}
}

View File

@ -1,6 +1,6 @@
namespace SKIT.FlurlHttpClient.Wechat.Api.Models
{
public abstract class WxaGameRequestBase : WechatApiRequest
public abstract class WxaGamePaymentRequestBase : WechatApiRequest
{
/// <summary>
/// 获取或设置虚拟支付应用 ID。如果不指定将使用构造 <see cref="WechatApiClient"/> 时的 <see cref="WechatApiClientOptions.MidasOfferIdV2"/> 参数。

View File

@ -3,7 +3,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Models
/// <summary>
/// <para>表示 [POST] /wxa/game/cancelpay 接口的请求。</para>
/// </summary>
public class WxaGameCancelPayRequest : WxaGameRequestBase, IInferable<WxaGameCancelPayRequest, WxaGameCancelPayResponse>
public class WxaGameCancelPayRequest : WxaGamePaymentRequestBase, IInferable<WxaGameCancelPayRequest, WxaGameCancelPayResponse>
{
/// <summary>
/// 获取或设置扣除游戏币的订单号。

View File

@ -3,7 +3,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Models
/// <summary>
/// <para>表示 [POST] /wxa/game/getbalance 接口的请求。</para>
/// </summary>
public class WxaGameGetBalanceRequest : WxaGameRequestBase, IInferable<WxaGameGetBalanceRequest, WxaGameGetBalanceResponse>
public class WxaGameGetBalanceRequest : WxaGamePaymentRequestBase, IInferable<WxaGameGetBalanceRequest, WxaGameGetBalanceResponse>
{
protected internal override string GetRequestPath()
{

View File

@ -3,7 +3,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Models
/// <summary>
/// <para>表示 [POST] /wxa/game/pay 接口的请求。</para>
/// </summary>
public class WxaGamePayRequest : WxaGameRequestBase, IInferable<WxaGamePayRequest, WxaGamePayResponse>
public class WxaGamePayRequest : WxaGamePaymentRequestBase, IInferable<WxaGamePayRequest, WxaGamePayResponse>
{
/// <summary>
/// 获取或设置扣除游戏币的订单号。

View File

@ -3,7 +3,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Models
/// <summary>
/// <para>表示 [POST] /wxa/game/present 接口的请求。</para>
/// </summary>
public class WxaGamePresentRequest : WxaGameRequestBase, IInferable<WxaGamePresentRequest, WxaGamePresentResponse>
public class WxaGamePresentRequest : WxaGamePaymentRequestBase, IInferable<WxaGamePresentRequest, WxaGamePresentResponse>
{
/// <summary>
/// 获取或设置赠送游戏币的订单号。

View File

@ -3,7 +3,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Models
/// <summary>
/// <para>表示 [POST] /wxa/game/queryorderinfo 接口的请求。</para>
/// </summary>
public class WxaGameQueryOrderInfoRequest : WxaGameRequestBase, IInferable<WxaGameQueryOrderInfoRequest, WxaGameQueryOrderInfoResponse>
public class WxaGameQueryOrderInfoRequest : WxaGamePaymentRequestBase, IInferable<WxaGameQueryOrderInfoRequest, WxaGameQueryOrderInfoResponse>
{
/// <summary>
/// 获取或设置外部订单号。

View File

@ -0,0 +1,7 @@
{
"openid": "OPENID",
"scene": 1,
"version": 2,
"media_type": 2,
"media_url": "https://res.wx.qq.com/wxdoc/dist/assets/img/3-3.9b4ebdf8.png"
}

View File

@ -0,0 +1,18 @@
{
"errcode": 0,
"errmsg": "ok",
"trace_id": "54bf091a-821t3794-237p1237",
"result": {
"suggest": "pass",
"label": 100
},
"detail": [
{
"strategy": "minigame_content_model",
"errcode": 0,
"suggest": "pass",
"label": 100,
"prob": 90
}
]
}

View File

@ -0,0 +1,6 @@
{
"openid": "OPENID",
"scene": 5,
"version": 2,
"content": "最新队换马嗖红胡子攻略团"
}

View File

@ -0,0 +1,27 @@
{
"errcode": 0,
"errmsg": "ok",
"trace_id": "54bf091a-821t3794-237p1237",
"result": {
"suggest": "risky",
"label": 10001,
"replaced_content": "最新***嗖红胡子攻略团"
},
"detail": [
{
"strategy": "minigame_content_model",
"errcode": 0,
"suggest": "risky",
"label": 10001,
"prob": 90
},
{
"strategy": "keyword",
"errcode": 0,
"suggest": "risky",
"label": 10001,
"level": 90,
"keyword": "命中的关键词1"
}
]
}