diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/README.md b/src/SKIT.FlurlHttpClient.Wechat.Ads/README.md
new file mode 100644
index 00000000..42fba951
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/README.md
@@ -0,0 +1,31 @@
+## SKIT.FlurlHttpClient.Wechat.TenpayV2
+
+[](https://github.com/fudiwei/DotNetCore.SKIT.FlurlHttpClient.Wechat)
+[](https://github.com/fudiwei/DotNetCore.SKIT.FlurlHttpClient.Wechat)
+[](https://www.nuget.org/packages/SKIT.FlurlHttpClient.Wechat.TenpayV2)
+[](https://mit-license.org/)
+
+基于 `Flurl.Http` 的微信商户平台 API v2 版客户端。
+
+**注意**:本库仅仅包含微信支付未提供 v3 版 API 的部分功能,如需微信支付 v3 版 API 客户端,欢迎使用 [`SKIT.FlurlHttpClient.Wechat.TenpayV3`](https://www.nuget.org/packages/SKIT.FlurlHttpClient.Wechat.TenpayV3)。
+
+---
+
+### 【功能特性】
+
+- 基于微信支付 v2 版 API 封装。
+- 支持直连商户、服务商两种模式。
+- 请求时自动生成签名,无需开发者手动干预。
+- 提供了微信支付所需的 MD5、HMAC-SHA-256 等算法工具类。
+
+---
+
+### 【开发文档】
+
+[点此查看](https://github.com/fudiwei/DotNetCore.SKIT.FlurlHttpClient.Wechat)。
+
+---
+
+### 【更新日志】
+
+[点此查看](https://github.com/fudiwei/DotNetCore.SKIT.FlurlHttpClient.Wechat/blob/main/CHANGELOG.md)。
\ No newline at end of file
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/SKIT.FlurlHttpClient.Wechat.Ads.csproj b/src/SKIT.FlurlHttpClient.Wechat.Ads/SKIT.FlurlHttpClient.Wechat.Ads.csproj
index 9d322380..13c14202 100644
--- a/src/SKIT.FlurlHttpClient.Wechat.Ads/SKIT.FlurlHttpClient.Wechat.Ads.csproj
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/SKIT.FlurlHttpClient.Wechat.Ads.csproj
@@ -9,6 +9,8 @@
SKIT.FlurlHttpClient.Wechat.Ads
+ LOGO.png
+ README.md
MIT
https://github.com/fudiwei/DotNetCore.SKIT.FlurlHttpClient.Wechat
Flurl.Http Wechat Weixin MicroMessage WechatAds WechatAdvertisting 微信 广告平台 微信广告平台 腾讯广告平台 广点通 微信广点通 腾讯广点通
@@ -17,17 +19,28 @@
Fu Diwei
git
https://github.com/fudiwei/DotNetCore.SKIT.FlurlHttpClient.Wechat.git
- true
- true
- snupkg
+
+ true
+ true
+ true
+ true
+ true
+ snupkg
+
+
+
+
+
+
+
-
+
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Ads/Utilities/MD5Utility.cs b/src/SKIT.FlurlHttpClient.Wechat.Ads/Utilities/MD5Utility.cs
index a3444174..bcc31109 100644
--- a/src/SKIT.FlurlHttpClient.Wechat.Ads/Utilities/MD5Utility.cs
+++ b/src/SKIT.FlurlHttpClient.Wechat.Ads/Utilities/MD5Utility.cs
@@ -10,7 +10,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Ads.Utilities
public static class MD5Utility
{
///
- /// 获取信息摘要。
+ /// 获取 MD5 信息摘要。
///
/// 信息字节数组。
/// 信息摘要。
@@ -24,7 +24,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Ads.Utilities
}
///
- /// 获取信息摘要。
+ /// 获取 MD5 信息摘要。
///
/// 文本信息。
/// 信息摘要。
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Ads.UnitTests/SKIT.FlurlHttpClient.Wechat.Ads.UnitTests.csproj b/test/SKIT.FlurlHttpClient.Wechat.Ads.UnitTests/SKIT.FlurlHttpClient.Wechat.Ads.UnitTests.csproj
index 6a6f3027..7e11db16 100644
--- a/test/SKIT.FlurlHttpClient.Wechat.Ads.UnitTests/SKIT.FlurlHttpClient.Wechat.Ads.UnitTests.csproj
+++ b/test/SKIT.FlurlHttpClient.Wechat.Ads.UnitTests/SKIT.FlurlHttpClient.Wechat.Ads.UnitTests.csproj
@@ -1,8 +1,11 @@
- netcoreapp3.1; net6.0
- 9.0
+ net472; netcoreapp3.1; net6.0
+ latest
+ enable
+ true
+ false
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Ads.UnitTests/TestCase_CodeReviewAnalyzer.cs b/test/SKIT.FlurlHttpClient.Wechat.Ads.UnitTests/TestCase_CodeReviewAnalyzer.cs
new file mode 100644
index 00000000..67eb5b8b
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Ads.UnitTests/TestCase_CodeReviewAnalyzer.cs
@@ -0,0 +1,57 @@
+using System.IO;
+using System.Reflection;
+using Xunit;
+
+namespace SKIT.FlurlHttpClient.Wechat.Ads.UnitTests
+{
+ public class TestCase_CodeReviewAnalyzer
+ {
+ private Assembly SourceAssembly { get; } = Assembly.Load("SKIT.FlurlHttpClient.Wechat.Ads");
+
+ [Fact(DisplayName = "代码评审:分析 API 模型命名")]
+ public void TestApiModelsNaming()
+ {
+ CodeStyleUtil.VerifyApiModelsNaming(SourceAssembly, out var ex);
+
+ if (ex != null)
+ throw ex;
+
+ Assert.Null(ex);
+ }
+
+ [Fact(DisplayName = "代码评审:分析 API 模型定义")]
+ public void TestApiModelsDefinition()
+ {
+ string workdir = Path.Combine(TestConfigs.ProjectTestDirectory, "ModelSamples");
+ CodeStyleUtil.VerifyApiModelsDefinition(SourceAssembly, workdir, out var ex);
+
+ if (ex != null)
+ throw ex;
+
+ Assert.Null(ex);
+ }
+
+ [Fact(DisplayName = "代码评审:分析 API 接口命名")]
+ public void TestApiExtensionsNaming()
+ {
+ CodeStyleUtil.VerifyApiExtensionsNaming(SourceAssembly, out var ex);
+
+ if (ex != null)
+ throw ex;
+
+ Assert.Null(ex);
+ }
+
+ [Fact(DisplayName = "代码评审:分析代码规范")]
+ public void TestCodeStyle()
+ {
+ string workdir = Path.Combine(TestConfigs.ProjectSourceDirectory);
+ CodeStyleUtil.VerifySourceCodeStyle(workdir, out var ex);
+
+ if (ex != null)
+ throw ex;
+
+ Assert.Null(ex);
+ }
+ }
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Ads.UnitTests/WechatAdsSecurityTests.cs b/test/SKIT.FlurlHttpClient.Wechat.Ads.UnitTests/TestCase_HashUtilityTests.cs
similarity index 59%
rename from test/SKIT.FlurlHttpClient.Wechat.Ads.UnitTests/WechatAdsSecurityTests.cs
rename to test/SKIT.FlurlHttpClient.Wechat.Ads.UnitTests/TestCase_HashUtilityTests.cs
index c2ed584c..ea2b0c88 100644
--- a/test/SKIT.FlurlHttpClient.Wechat.Ads.UnitTests/WechatAdsSecurityTests.cs
+++ b/test/SKIT.FlurlHttpClient.Wechat.Ads.UnitTests/TestCase_HashUtilityTests.cs
@@ -1,17 +1,11 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading;
-using System.Threading.Tasks;
-using Xunit;
+using Xunit;
namespace SKIT.FlurlHttpClient.Wechat.Ads.UnitTests
{
- public class WechatAdsSecurityTests
+ public class TestCase_HashUtilityTests
{
- [Fact(DisplayName = "信息摘要(MD5)")]
- public void Md5HashTest()
+ [Fact(DisplayName = "测试用例:MD5 信息摘要")]
+ public void TestMD5Hash()
{
string rawData = "spidbff89d5138160943040012345678901234567890uFolxxiZbrZ/PRbyen5uK5D1kgIB2yHyDsfDGxxgeG";
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Ads.UnitTests/TestClients.cs b/test/SKIT.FlurlHttpClient.Wechat.Ads.UnitTests/TestClients.cs
index ac2e757f..970b4371 100644
--- a/test/SKIT.FlurlHttpClient.Wechat.Ads.UnitTests/TestClients.cs
+++ b/test/SKIT.FlurlHttpClient.Wechat.Ads.UnitTests/TestClients.cs
@@ -1,6 +1,4 @@
-using System;
-
-namespace SKIT.FlurlHttpClient.Wechat.Ads.UnitTests
+namespace SKIT.FlurlHttpClient.Wechat.Ads.UnitTests
{
class TestClients
{
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Ads.UnitTests/TestConfigs.cs b/test/SKIT.FlurlHttpClient.Wechat.Ads.UnitTests/TestConfigs.cs
index eb5dd41c..508e1764 100644
--- a/test/SKIT.FlurlHttpClient.Wechat.Ads.UnitTests/TestConfigs.cs
+++ b/test/SKIT.FlurlHttpClient.Wechat.Ads.UnitTests/TestConfigs.cs
@@ -8,8 +8,9 @@ namespace SKIT.FlurlHttpClient.Wechat.Ads.UnitTests
{
static TestConfigs()
{
- // NOTICE: 请在项目根目录下按照 appsettings.json 的格式新建 appsettings.local.json 填入测试参数。
- // WARN: 敏感信息请不要提交到 git!
+ // NOTICE: 请在项目根目录下按照 appsettings.json 的格式新建 appsettings.local.json 填入测试参数。
+ // WARNING: 请在 DEBUG 模式下运行测试用例。
+ // WARNING: 敏感信息请不要提交到 git!
try
{
@@ -17,13 +18,13 @@ namespace SKIT.FlurlHttpClient.Wechat.Ads.UnitTests
using var jdoc = JsonDocument.Parse(stream);
var config = jdoc.RootElement.GetProperty("TestConfig");
- WechatAgencyId = config.GetProperty("AgencyId").GetString();
- WechatAgencyAppId = config.GetProperty("AgencyAppId").GetString();
- WechatAgencyApiKey = config.GetProperty("AgencyApiKey").GetString();
- WechatAccessToken = config.GetProperty("AccessToken").GetString();
+ WechatAgencyId = config.GetProperty("AgencyId").GetString()!;
+ WechatAgencyAppId = config.GetProperty("AgencyAppId").GetString()!;
+ WechatAgencyApiKey = config.GetProperty("AgencyApiKey").GetString()!;
+ WechatAccessToken = config.GetProperty("AccessToken").GetString()!;
- ProjectSourceDirectory = jdoc.RootElement.GetProperty("ProjectSourceDirectory").GetString();
- ProjectTestDirectory = jdoc.RootElement.GetProperty("ProjectTestDirectory").GetString();
+ ProjectSourceDirectory = jdoc.RootElement.GetProperty("ProjectSourceDirectory").GetString()!;
+ ProjectTestDirectory = jdoc.RootElement.GetProperty("ProjectTestDirectory").GetString()!;
}
catch (Exception ex)
{
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Ads.UnitTests/WechatAdsDeclarationTests.cs b/test/SKIT.FlurlHttpClient.Wechat.Ads.UnitTests/WechatAdsDeclarationTests.cs
deleted file mode 100644
index bdc22400..00000000
--- a/test/SKIT.FlurlHttpClient.Wechat.Ads.UnitTests/WechatAdsDeclarationTests.cs
+++ /dev/null
@@ -1,62 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Linq;
-using System.Reflection;
-using System.Threading;
-using System.Threading.Tasks;
-using Xunit;
-
-namespace SKIT.FlurlHttpClient.Wechat.Ads.UnitTests
-{
- public class WechatAdsDeclarationTests
- {
- private static readonly Assembly _assembly = Assembly.Load("SKIT.FlurlHttpClient.Wechat.Ads");
-
- [Fact(DisplayName = "验证 API 模型命名")]
- public void ApiModelsNamingTest()
- {
- CodeStyleUtil.VerifyApiModelsNaming(_assembly, out var ex);
-
- if (ex != null)
- throw ex;
-
- Assert.Null(ex);
- }
-
- [Fact(DisplayName = "验证 API 模型定义")]
- public void ApiModelsDefinitionTest()
- {
- string workdir = Path.Combine(TestConfigs.ProjectTestDirectory, "ModelSamples");
- CodeStyleUtil.VerifyApiModelsDefinition(_assembly, workdir, out var ex);
-
- if (ex != null)
- throw ex;
-
- Assert.Null(ex);
- }
-
- [Fact(DisplayName = "验证 API 接口命名")]
- public void ApiExtensionsNamingTest()
- {
- CodeStyleUtil.VerifyApiExtensionsNaming(_assembly, out var ex);
-
- if (ex != null)
- throw ex;
-
- Assert.Null(ex);
- }
-
- [Fact(DisplayName = "验证代码规范")]
- public void CodeStyleTest()
- {
- string workdir = Path.Combine(TestConfigs.ProjectSourceDirectory);
- CodeStyleUtil.VerifySourceCodeStyle(workdir, out var ex);
-
- if (ex != null)
- throw ex;
-
- Assert.Null(ex);
- }
- }
-}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.TestTools/SKIT.FlurlHttpClient.Wechat.TestTools.csproj b/test/SKIT.FlurlHttpClient.Wechat.TestTools/SKIT.FlurlHttpClient.Wechat.TestTools.csproj
index 9117e429..e2262421 100644
--- a/test/SKIT.FlurlHttpClient.Wechat.TestTools/SKIT.FlurlHttpClient.Wechat.TestTools.csproj
+++ b/test/SKIT.FlurlHttpClient.Wechat.TestTools/SKIT.FlurlHttpClient.Wechat.TestTools.csproj
@@ -7,7 +7,7 @@
-
+