diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/Internal/WechatTenpayClientSignExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/Internal/WechatTenpayClientSignExtensions.cs index 376e8421..07798909 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/Internal/WechatTenpayClientSignExtensions.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/Internal/WechatTenpayClientSignExtensions.cs @@ -21,7 +21,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 var entry = client.PlatformCertificateManager.GetEntry(strSerialNumber); if (!entry.HasValue) { - error = new Exception($"There is no platform certificate matched the serial number: \"{strSerialNumber}\", please make sure you have downloaded platform certificates first."); + error = new Exception($"There is no platform certificate matched the serial number: \"{strSerialNumber}\". Please make sure you have downloaded platform certificates first."); return false; } @@ -58,7 +58,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 var entry = client.PlatformCertificateManager.GetEntry(strSerialNumber); if (!entry.HasValue) { - error = new Exception($"There is no platform certificate matched the serial number: \"{strSerialNumber}\", please make sure you have downloaded platform certificates first."); + error = new Exception($"There is no platform certificate matched the serial number: \"{strSerialNumber}\". Please make sure you have downloaded platform certificates first."); return false; } diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteHKPartnerTransactionsExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteHKPartnerTransactionsExtensions.cs index 70ef0d7e..889dee0d 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteHKPartnerTransactionsExtensions.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteHKPartnerTransactionsExtensions.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Net.Http; using System.Threading; using System.Threading.Tasks; @@ -186,9 +186,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 request.MerchantId = client.Credentials.MerchantId; IFlurlRequest flurlReq = client - .CreateRequest(request, HttpMethod.Post, "transactions", "out-trade-no", request.OutTradeNumber, "close") - .SetQueryParam("sp_mchid", request.MerchantId) - .SetQueryParam("sub_mchid", request.SubMerchantId); + .CreateRequest(request, HttpMethod.Post, "transactions", "out-trade-no", request.OutTradeNumber, "close"); return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); } diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteHKTransactionsExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteHKTransactionsExtensions.cs index d0b43da6..8e8c62ff 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteHKTransactionsExtensions.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientExecuteHKTransactionsExtensions.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Net.Http; using System.Threading; using System.Threading.Tasks; @@ -184,8 +184,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 request.MerchantId = client.Credentials.MerchantId; IFlurlRequest flurlReq = client - .CreateRequest(request, HttpMethod.Post, "transactions", "out-trade-no", request.OutTradeNumber, "close") - .SetQueryParam("mchid", request.MerchantId); + .CreateRequest(request, HttpMethod.Post, "transactions", "out-trade-no", request.OutTradeNumber, "close"); return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken); } diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientRequestEncryptionExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientRequestEncryptionExtensions.cs index dacddbca..76cb97a5 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientRequestEncryptionExtensions.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Extensions/WechatTenpayClientRequestEncryptionExtensions.cs @@ -1,7 +1,6 @@ using System; using System.Linq; using System.Reflection; -using System.Text; namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 { @@ -33,7 +32,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 .OrderByDescending(e => e.ExpireTime); if (!entries.Any()) { - throw new Exceptions.WechatTenpayEventVerificationException("Failed to encrypt request, because there is no platform certificate in the manager, please make sure you have downloaded platform certificates first."); + throw new Exceptions.WechatTenpayEventVerificationException("Failed to encrypt request, because there is no platform certificate in the manager. Please make sure you have downloaded platform certificates first."); } var entry = entries.First(); @@ -46,7 +45,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 var entry = client.PlatformCertificateManager.GetEntry(request.WechatpayCertificateSerialNumber!); if (!entry.HasValue) { - throw new Exceptions.WechatTenpayEventVerificationException($"Failed to encrypt request, because there is no platform certificate matched the serial number: \"{request.WechatpayCertificateSerialNumber}\", please make sure you have downloaded platform certificates first."); + throw new Exceptions.WechatTenpayEventVerificationException($"Failed to encrypt request, because there is no platform certificate matched the serial number: \"{request.WechatpayCertificateSerialNumber}\". Please make sure you have downloaded platform certificates first."); } certificate = entry.Value.Certificate; @@ -108,7 +107,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 .OrderByDescending(e => e.ExpireTime); if (!entries.Any()) { - throw new Exceptions.WechatTenpayEventVerificationException("Failed to encrypt request, because there is no platform certificate in the manager, please make sure you have downloaded platform certificates first."); + throw new Exceptions.WechatTenpayEventVerificationException("Failed to encrypt request, because there is no platform certificate in the manager. Please make sure you have downloaded platform certificates first."); } var entry = entries.First(); @@ -121,7 +120,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 var entry = client.PlatformCertificateManager.GetEntry(request.WechatpayCertificateSerialNumber!); if (!entry.HasValue) { - throw new Exceptions.WechatTenpayEventVerificationException($"Failed to encrypt request, because there is no platform certificate matched the serial number: \"{request.WechatpayCertificateSerialNumber}\", please make sure you have downloaded platform certificates first."); + throw new Exceptions.WechatTenpayEventVerificationException($"Failed to encrypt request, because there is no platform certificate matched the serial number: \"{request.WechatpayCertificateSerialNumber}\". Please make sure you have downloaded platform certificates first."); } certificate = entry.Value.Certificate; diff --git a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Settings/CertificateEntry.cs b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Settings/CertificateEntry.cs index fa3cfb45..b0721681 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Settings/CertificateEntry.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.TenpayV3/Settings/CertificateEntry.cs @@ -130,7 +130,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Settings if (AlgorithmType == null) { - throw new ArgumentException("Unrecognized certificate algorithm type, please make sure you have decrypted the certificate content first."); + throw new ArgumentException("Unrecognized certificate algorithm type. Please make sure you have decrypted the certificate content first."); } } diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Extensions/WechatWorkClientExecuteCgibinIdConvertExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Extensions/WechatWorkClientExecuteCgibinIdConvertExtensions.cs index 326c8d2a..369b2f06 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.Work/Extensions/WechatWorkClientExecuteCgibinIdConvertExtensions.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Extensions/WechatWorkClientExecuteCgibinIdConvertExtensions.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Net.Http; using System.Threading; using System.Threading.Tasks; @@ -91,5 +91,25 @@ namespace SKIT.FlurlHttpClient.Wechat.Work return await client.SendRequestWithJsonAsync(flurlReq, cancellationToken: cancellationToken); } + + /// + /// 异步调用 [POST] /cgi-bin/idconvert/convert_tmp_external_userid 接口。 + /// REF: https://developer.work.weixin.qq.com/document/path/98729 + /// + /// + /// + /// + /// + public static async Task ExecuteCgibinIdConvertConvertTempExternalUserIdAsync(this WechatWorkClient client, Models.CgibinIdConvertConvertTempExternalUserIdRequest 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, "cgi-bin", "idconvert", "convert_tmp_external_userid") + .SetQueryParam("access_token", request.AccessToken); + + return await client.SendRequestWithJsonAsync(flurlReq, cancellationToken: cancellationToken); + } } } diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinIdConvert/CgibinIdConvertBatchExternalUserIdToPendingIdResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinIdConvert/CgibinIdConvertBatchExternalUserIdToPendingIdResponse.cs index c77a111c..826a2302 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinIdConvert/CgibinIdConvertBatchExternalUserIdToPendingIdResponse.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinIdConvert/CgibinIdConvertBatchExternalUserIdToPendingIdResponse.cs @@ -17,7 +17,7 @@ public string ExternalUserId { get; set; } = default!; /// - /// 获取或设置临时部联系人账号 ID。 + /// 获取或设置临时外部联系人账号 ID。 /// [Newtonsoft.Json.JsonProperty("pending_id")] [System.Text.Json.Serialization.JsonPropertyName("pending_id")] diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinIdConvert/CgibinIdConvertConvertTempExternalUserIdRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinIdConvert/CgibinIdConvertConvertTempExternalUserIdRequest.cs new file mode 100644 index 00000000..761d3d31 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinIdConvert/CgibinIdConvertConvertTempExternalUserIdRequest.cs @@ -0,0 +1,31 @@ +using System.Collections.Generic; + +namespace SKIT.FlurlHttpClient.Wechat.Work.Models +{ + /// + /// 表示 [POST] /cgi-bin/idconvert/convert_tmp_external_userid 接口的请求。 + /// + public class CgibinIdConvertConvertTempExternalUserIdRequest : WechatWorkRequest + { + /// + /// 获取或设置业务类型。 + /// + [Newtonsoft.Json.JsonProperty("business_type")] + [System.Text.Json.Serialization.JsonPropertyName("business_type")] + public int BusinessType { get; set; } + + /// + /// 获取或设置目标用户类型。 + /// + [Newtonsoft.Json.JsonProperty("user_type")] + [System.Text.Json.Serialization.JsonPropertyName("user_type")] + public int UserType { get; set; } + + /// + /// 获取或设置外部联系人临时 ID 列表。 + /// + [Newtonsoft.Json.JsonProperty("tmp_external_userid_list")] + [System.Text.Json.Serialization.JsonPropertyName("tmp_external_userid_list")] + public IList TempExternalUserIdList { get; set; } = new List(); + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinIdConvert/CgibinIdConvertConvertTempExternalUserIdResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinIdConvert/CgibinIdConvertConvertTempExternalUserIdResponse.cs new file mode 100644 index 00000000..9029b091 --- /dev/null +++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinIdConvert/CgibinIdConvertConvertTempExternalUserIdResponse.cs @@ -0,0 +1,56 @@ +namespace SKIT.FlurlHttpClient.Wechat.Work.Models +{ + /// + /// 表示 [POST] /cgi-bin/idconvert/convert_tmp_external_userid 接口的响应。 + /// + public class CgibinIdConvertConvertTempExternalUserIdResponse : WechatWorkResponse + { + public static class Types + { + public class Result + { + /// + /// 获取或设置外部联系人临时 ID ID。 + /// + [Newtonsoft.Json.JsonProperty("tmp_external_userid")] + [System.Text.Json.Serialization.JsonPropertyName("tmp_external_userid")] + public string TempExternalUserId { get; set; } = default!; + + /// + /// 获取或设置外部联系人账号 ID。 + /// + [Newtonsoft.Json.JsonProperty("external_userid")] + [System.Text.Json.Serialization.JsonPropertyName("external_userid")] + public string? ExternalUserId { get; set; } + + /// + /// 获取或设置企业 CorpId。 + /// + [Newtonsoft.Json.JsonProperty("corpid")] + [System.Text.Json.Serialization.JsonPropertyName("corpid")] + public string? CorpId { get; set; } + + /// + /// 获取或设置成员账号 ID。 + /// + [Newtonsoft.Json.JsonProperty("userid")] + [System.Text.Json.Serialization.JsonPropertyName("userid")] + public string? UserId { get; set; } + } + } + + /// + /// 获取或设置转换结果列表。 + /// + [Newtonsoft.Json.JsonProperty("results")] + [System.Text.Json.Serialization.JsonPropertyName("results")] + public Types.Result[] ResultList { get; set; } = default!; + + /// + /// 获取或设置无效的外部联系人临时 ID 列表。 + /// + [Newtonsoft.Json.JsonProperty("invalid_tmp_external_userid_list")] + [System.Text.Json.Serialization.JsonPropertyName("invalid_tmp_external_userid_list")] + public string[]? InvalidTempExternalUserIdList { get; set; } + } +} diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinIdConvert/CgibinIdConvertUnionIdToExternalUserIdResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinIdConvert/CgibinIdConvertUnionIdToExternalUserIdResponse.cs index 006f0cc6..fe29fb0f 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinIdConvert/CgibinIdConvertUnionIdToExternalUserIdResponse.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinIdConvert/CgibinIdConvertUnionIdToExternalUserIdResponse.cs @@ -13,7 +13,7 @@ public string? ExternalUserId { get; set; } /// - /// 获取或设置临时部联系人账号 ID。 + /// 获取或设置临时外部联系人账号 ID。 /// [Newtonsoft.Json.JsonProperty("pending_id")] [System.Text.Json.Serialization.JsonPropertyName("pending_id")] diff --git a/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinService/CgibinIdConvertConvertTempExternalUserIdRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinService/CgibinIdConvertConvertTempExternalUserIdRequest.json new file mode 100644 index 00000000..d43b98c0 --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinService/CgibinIdConvertConvertTempExternalUserIdRequest.json @@ -0,0 +1,9 @@ +{ + "business_type": 1, + "user_type": 1, + "tmp_external_userid_list": [ + "ouXXX1", + "ouXXX2", + "ouXXX3" + ] +} diff --git a/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinService/CgibinIdConvertConvertTempExternalUserIdResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinService/CgibinIdConvertConvertTempExternalUserIdResponse.json new file mode 100644 index 00000000..1e017c4d --- /dev/null +++ b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinService/CgibinIdConvertConvertTempExternalUserIdResponse.json @@ -0,0 +1,18 @@ +{ + "errcode": 0, + "errmsg": "ok", + "results": [ + { + "tmp_external_userid": "ouXXX1", + "external_userid": "EXTERNAL_USER_ID" + }, + { + "tmp_external_userid": "ouXXX2", + "corpid": "CORPID", + "userid": "USERID" + } + ], + "invalid_tmp_external_userid_list": [ + "ouXXX3" + ] +}