using System;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
using Flurl;
using Flurl.Http;
namespace SKIT.FlurlHttpClient.Wechat.Api
{
public static class WechatApiClientExecuteWxaGameExtensions
{
#region ContentSpam
///
/// 异步调用 [POST] /wxa/game/content_spam/msg_sec_check 接口。
///
/// REF:
///
///
///
///
///
///
///
public static async Task 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(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
}
///
/// 异步调用 [POST] /wxa/game/content_spam/media_check_sync 接口。
///
/// REF:
///
///
///
///
///
///
///
public static async Task 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(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
}
#endregion
#region Payment
private static T PreprocessRequest(WechatApiClient client, ref T request)
where T : Models.WxaGamePaymentRequestBase, new()
{
if (client is null) throw new ArgumentNullException(nameof(request));
if (request is null) throw new ArgumentNullException(nameof(request));
string? tmpRawData = null; // 用于缓存待签名数据中的请求正文部分,避免序列化多次浪费性能
if (request.OfferId is null)
{
request.OfferId = client.Credentials.MidasOfferIdV2;
}
if (request.Timestamp is null)
{
request.Timestamp = DateTimeOffset.Now.ToLocalTime().ToUnixTimeSeconds();
}
if (request.SignMethod is null)
{
request.SignMethod = Constants.MidasSignMethods.HMAC_SHA256;
}
if (request.Signature is null && request.SessionKey is not null)
{
tmpRawData = tmpRawData ?? client.JsonSerializer.Serialize(request);
switch (request.SignMethod)
{
case Constants.MidasSignMethods.HMAC_SHA256:
{
string msgText = tmpRawData;
request.Signature = Utilities.HMACUtility.HashWithSHA256(request.SessionKey, msgText).Value!.ToLower();
}
break;
default:
{
request.Signature = string.Empty;
}
break;
}
}
if (request.PaySign is null)
{
tmpRawData = tmpRawData ?? client.JsonSerializer.Serialize(request);
string msgText = $"{request.GetRequestPath()}&{tmpRawData}";
request.PaySign = Utilities.HMACUtility.HashWithSHA256(client.Credentials.MidasAppKeyV2 ?? string.Empty, msgText).Value!.ToLower();
}
return request;
}
///
/// 异步调用 [POST] /wxa/game/getbalance 接口。
///
/// REF:
///
///
///
///
///
///
///
///
public static async Task ExecuteWxaGameGetBalanceAsync(this WechatApiClient client, Models.WxaGameGetBalanceRequest request, CancellationToken cancellationToken = default)
{
if (client is null) throw new ArgumentNullException(nameof(client));
if (request is null) throw new ArgumentNullException(nameof(request));
PreprocessRequest(client, ref request);
IFlurlRequest flurlReq = client
.CreateFlurlRequest(request, HttpMethod.Post, "wxa", "game", "getbalance")
.SetQueryParam("access_token", request.AccessToken)
.SetQueryParam("sig_method", request.SignMethod)
.SetQueryParam("signature", request.Signature)
.SetQueryParam("pay_sig", request.PaySign);
return await client.SendFlurlRequestAsJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
}
///
/// 异步调用 [POST] /wxa/game/pay 接口。
///
/// REF:
///
///
///
///
///
///
///
///
public static async Task ExecuteWxaGamePayAsync(this WechatApiClient client, Models.WxaGamePayRequest request, CancellationToken cancellationToken = default)
{
if (client is null) throw new ArgumentNullException(nameof(client));
if (request is null) throw new ArgumentNullException(nameof(request));
PreprocessRequest(client, ref request);
IFlurlRequest flurlReq = client
.CreateFlurlRequest(request, HttpMethod.Post, "wxa", "game", "pay")
.SetQueryParam("access_token", request.AccessToken)
.SetQueryParam("sig_method", request.SignMethod)
.SetQueryParam("signature", request.Signature)
.SetQueryParam("pay_sig", request.PaySign);
return await client.SendFlurlRequestAsJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
}
///
/// 异步调用 [POST] /wxa/game/cancelpay 接口。
///
/// REF:
///
///
///
///
///
///
///
///
public static async Task ExecuteWxaGameCancelPayAsync(this WechatApiClient client, Models.WxaGameCancelPayRequest request, CancellationToken cancellationToken = default)
{
if (client is null) throw new ArgumentNullException(nameof(client));
if (request is null) throw new ArgumentNullException(nameof(request));
PreprocessRequest(client, ref request);
IFlurlRequest flurlReq = client
.CreateFlurlRequest(request, HttpMethod.Post, "wxa", "game", "cancelpay")
.SetQueryParam("access_token", request.AccessToken)
.SetQueryParam("sig_method", request.SignMethod)
.SetQueryParam("signature", request.Signature)
.SetQueryParam("pay_sig", request.PaySign);
return await client.SendFlurlRequestAsJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
}
///
/// 异步调用 [POST] /wxa/game/present 接口。
///
/// REF:
///
///
///
///
///
///
///
///
public static async Task ExecuteWxaGamePresentAsync(this WechatApiClient client, Models.WxaGamePresentRequest request, CancellationToken cancellationToken = default)
{
if (client is null) throw new ArgumentNullException(nameof(client));
if (request is null) throw new ArgumentNullException(nameof(request));
PreprocessRequest(client, ref request);
IFlurlRequest flurlReq = client
.CreateFlurlRequest(request, HttpMethod.Post, "wxa", "game", "present")
.SetQueryParam("access_token", request.AccessToken)
.SetQueryParam("sig_method", request.SignMethod)
.SetQueryParam("signature", request.Signature)
.SetQueryParam("pay_sig", request.PaySign);
return await client.SendFlurlRequestAsJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
}
///
/// 异步调用 [POST] /wxa/game/queryorderinfo 接口。
///
/// REF:
///
///
///
///
///
///
///
public static async Task ExecuteWxaGameQueryOrderInfoAsync(this WechatApiClient client, Models.WxaGameQueryOrderInfoRequest request, CancellationToken cancellationToken = default)
{
if (client is null) throw new ArgumentNullException(nameof(client));
if (request is null) throw new ArgumentNullException(nameof(request));
PreprocessRequest(client, ref request);
IFlurlRequest flurlReq = client
.CreateFlurlRequest(request, HttpMethod.Post, "wxa", "game", "queryorderinfo")
.SetQueryParam("access_token", request.AccessToken)
.SetQueryParam("sig_method", request.SignMethod)
.SetQueryParam("signature", request.Signature)
.SetQueryParam("pay_sig", request.PaySign);
return await client.SendFlurlRequestAsJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
}
#endregion
}
}