diff --git a/docs/WechatTenpayV3/Advanced_EventDataSignatureVerification.md b/docs/WechatTenpayV3/Advanced_EventDataSignatureVerification.md index 01f50532..9260b26f 100644 --- a/docs/WechatTenpayV3/Advanced_EventDataSignatureVerification.md +++ b/docs/WechatTenpayV3/Advanced_EventDataSignatureVerification.md @@ -6,6 +6,8 @@ 同样的,你既然可以利用本库提供的 `RSAUtility` 工具类自行进行签名验证,也可以通过 `CertificateManager` 尝试自动完成签名验证: +注意,有关 `CertificateManager` 的具体用法,请务必阅读上方给出的相关文档。 + ```csharp bool ret = client.VerifyEventSignature( callbackTimestamp: "微信回调通知中的 Wechatpay-Timestamp 字段", diff --git a/docs/WechatTenpayV3/Advanced_ResponseSignatureVerification.md b/docs/WechatTenpayV3/Advanced_ResponseSignatureVerification.md index 370926de..48502f0a 100644 --- a/docs/WechatTenpayV3/Advanced_ResponseSignatureVerification.md +++ b/docs/WechatTenpayV3/Advanced_ResponseSignatureVerification.md @@ -60,6 +60,8 @@ var client = new WechatTenpayClient(options); 你应在后台周期性地调用 `QueryCertificatesAsync()` 方法,并在解密得到证书内容后,记录到证书管理器中: ```csharp +/* 注意:QueryCertificatesAsync() 接口返回值需解密后再存入 */ +/* 强调:存入的证书式请参考上一小节给出的 CER 证书文件示例 */ certManager.SetCertificate("CER 证书序列号", "CER 证书内容"); ``` diff --git a/src/SKIT.FlurlHttpClient.Wechat.Api/Utilities/AESUtility.cs b/src/SKIT.FlurlHttpClient.Wechat.Api/Utilities/AESUtility.cs index dea4c248..40239248 100644 --- a/src/SKIT.FlurlHttpClient.Wechat.Api/Utilities/AESUtility.cs +++ b/src/SKIT.FlurlHttpClient.Wechat.Api/Utilities/AESUtility.cs @@ -1,26 +1,26 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Security; -using System.Security.Cryptography; -using System.Text; - -namespace SKIT.FlurlHttpClient.Wechat.Api.Utilities -{ - public static class AESUtility - { - /// - /// 解密数据。 - /// - /// AES 密钥字节数组。 - /// 加密使用的初始化向量字节数组。 - /// 待解密数据字节数组。 - /// 解密后的数据字节数组。 +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Security; +using System.Security.Cryptography; +using System.Text; + +namespace SKIT.FlurlHttpClient.Wechat.Api.Utilities +{ + public static class AESUtility + { + /// + /// 解密数据。 + /// + /// AES 密钥字节数组。 + /// 加密使用的初始化向量字节数组。 + /// 待解密数据字节数组。 + /// 解密后的数据字节数组。 public static byte[] Decrypt(byte[] keyBytes, byte[] ivBytes, byte[] cipherBytes) - { - if (keyBytes == null) throw new ArgumentNullException(nameof(keyBytes)); - if (ivBytes == null) throw new ArgumentNullException(nameof(ivBytes)); + { + if (keyBytes == null) throw new ArgumentNullException(nameof(keyBytes)); + if (ivBytes == null) throw new ArgumentNullException(nameof(ivBytes)); if (cipherBytes == null) throw new ArgumentNullException(nameof(cipherBytes)); using (SymmetricAlgorithm aes = Aes.Create()) @@ -35,27 +35,27 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Utilities cs.Read(plainBytes, 0, plainBytes.Length); return plainBytes; } - } - } - - /// - /// 解密数据。 - /// - /// 经 Base64 编码后的 AES 密钥。 - /// 经 Base64 编码后的 AES 初始化向量。 - /// 经 Base64 编码后的待解密数据。 - /// 解密后的文本数据。 + } + } + + /// + /// 解密数据。 + /// + /// 经 Base64 编码后的 AES 密钥。 + /// 经 Base64 编码后的 AES 初始化向量。 + /// 经 Base64 编码后的待解密数据。 + /// 解密后的文本数据。 public static string Decrypt(string encodingKey, string encodingIV, string encodingCipherText) - { - if (encodingKey == null) throw new ArgumentNullException(nameof(encodingKey)); + { + if (encodingKey == null) throw new ArgumentNullException(nameof(encodingKey)); if (encodingCipherText == null) throw new ArgumentNullException(nameof(encodingCipherText)); - byte[] plainBytes = Decrypt( - keyBytes: Convert.FromBase64String(encodingKey), - ivBytes: Convert.FromBase64String(encodingIV), - cipherBytes: Convert.FromBase64String(encodingCipherText) - ); - return Encoding.UTF8.GetString(plainBytes); - } - } -} + byte[] plainBytes = Decrypt( + keyBytes: Convert.FromBase64String(encodingKey), + ivBytes: Convert.FromBase64String(encodingIV), + cipherBytes: Convert.FromBase64String(encodingCipherText) + ); + return Encoding.UTF8.GetString(plainBytes); + } + } +}