mirror of
https://gitee.com/fudiwei/DotNetCore.SKIT.FlurlHttpClient.Wechat.git
synced 2025-09-19 01:58:14 +08:00
feat(work): 升级公共组件
This commit is contained in:
@@ -1,8 +1,11 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFrameworks>netcoreapp3.1; net6.0</TargetFrameworks>
|
||||
<LangVersion>9.0</LangVersion>
|
||||
<TargetFrameworks>net472; netcoreapp3.1; net6.0</TargetFrameworks>
|
||||
<LangVersion>latest</LangVersion>
|
||||
<Nullable>enable</Nullable>
|
||||
<NullableReferenceTypes>true</NullableReferenceTypes>
|
||||
<IsPackable>false</IsPackable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
@@ -7,10 +7,10 @@ using Xunit;
|
||||
|
||||
namespace SKIT.FlurlHttpClient.Wechat.Work.UnitTests
|
||||
{
|
||||
public class WechatWorkExecuteCgibinTests
|
||||
public class TestCase_ApiExecuteCgibinTests
|
||||
{
|
||||
[Fact(DisplayName = "[GET] /cgi-bin/gettoken")]
|
||||
public async Task CgibinTokenTest()
|
||||
[Fact(DisplayName = "测试用例:调用 API [GET] /cgi-bin/gettoken")]
|
||||
public async Task TestExecuteCgibinToken()
|
||||
{
|
||||
var request = new Models.CgibinGetTokenRequest();
|
||||
var response = await TestClients.Instance.ExecuteCgibinGetTokenAsync(request);
|
@@ -9,25 +9,25 @@ using Xunit;
|
||||
|
||||
namespace SKIT.FlurlHttpClient.Wechat.Work.UnitTests
|
||||
{
|
||||
public class WechatWorkDeclarationTests
|
||||
public class TestCase_CodeReviewAnalyzer
|
||||
{
|
||||
private static readonly Assembly _assembly = Assembly.Load("SKIT.FlurlHttpClient.Wechat.Work");
|
||||
private Assembly SourceAssembly { get; } = Assembly.Load("SKIT.FlurlHttpClient.Wechat.Work");
|
||||
|
||||
[Fact(DisplayName = "验证 API 模型命名")]
|
||||
public void ApiModelsNamingTest()
|
||||
[Fact(DisplayName = "代码评审:分析 API 模型命名")]
|
||||
public void TestApiModelsNaming()
|
||||
{
|
||||
CodeStyleUtil.VerifyApiModelsNaming(_assembly, out var ex);
|
||||
CodeStyleUtil.VerifyApiModelsNaming(SourceAssembly, out var ex);
|
||||
if (ex != null)
|
||||
throw ex;
|
||||
|
||||
Assert.Null(ex);
|
||||
}
|
||||
|
||||
[Fact(DisplayName = "验证 API 模型定义")]
|
||||
public void ApiModelsDefinitionTest()
|
||||
[Fact(DisplayName = "代码评审:分析 API 模型定义")]
|
||||
public void TestApiModelsDefinition()
|
||||
{
|
||||
string workdir = Path.Combine(TestConfigs.ProjectTestDirectory, "ModelSamples");
|
||||
CodeStyleUtil.VerifyApiModelsDefinition(_assembly, workdir, out var ex);
|
||||
CodeStyleUtil.VerifyApiModelsDefinition(SourceAssembly, workdir, out var ex);
|
||||
|
||||
if (ex != null)
|
||||
throw ex;
|
||||
@@ -35,11 +35,11 @@ namespace SKIT.FlurlHttpClient.Wechat.Work.UnitTests
|
||||
Assert.Null(ex);
|
||||
}
|
||||
|
||||
[Fact(DisplayName = "验证 API 事件定义")]
|
||||
public void ApiEventsDefinitionTest()
|
||||
[Fact(DisplayName = "代码评审:分析 API 事件定义")]
|
||||
public void TestApiEventsDefinition()
|
||||
{
|
||||
string workdir = Path.Combine(TestConfigs.ProjectTestDirectory, "EventSamples");
|
||||
CodeStyleUtil.VerifyApiEventsDefinition(_assembly, workdir, out var ex);
|
||||
CodeStyleUtil.VerifyApiEventsDefinition(SourceAssembly, workdir, out var ex);
|
||||
|
||||
if (ex != null)
|
||||
throw ex;
|
||||
@@ -47,10 +47,10 @@ namespace SKIT.FlurlHttpClient.Wechat.Work.UnitTests
|
||||
Assert.Null(ex);
|
||||
}
|
||||
|
||||
[Fact(DisplayName = "验证 API 接口命名")]
|
||||
public void ApiExtensionsNamingTest()
|
||||
[Fact(DisplayName = "代码评审:分析 API 接口命名")]
|
||||
public void TestApiExtensionsNaming()
|
||||
{
|
||||
CodeStyleUtil.VerifyApiExtensionsNaming(_assembly, out var ex);
|
||||
CodeStyleUtil.VerifyApiExtensionsNaming(SourceAssembly, out var ex);
|
||||
|
||||
if (ex != null)
|
||||
throw ex;
|
||||
@@ -58,8 +58,8 @@ namespace SKIT.FlurlHttpClient.Wechat.Work.UnitTests
|
||||
Assert.Null(ex);
|
||||
}
|
||||
|
||||
[Fact(DisplayName = "验证代码规范")]
|
||||
public void CodeStyleTest()
|
||||
[Fact(DisplayName = "代码评审:分析代码规范")]
|
||||
public void TestCodeStyle()
|
||||
{
|
||||
string workdir = Path.Combine(TestConfigs.ProjectSourceDirectory);
|
||||
CodeStyleUtil.VerifySourceCodeStyle(workdir, out var ex);
|
@@ -8,10 +8,10 @@ using Xunit;
|
||||
|
||||
namespace SKIT.FlurlHttpClient.Wechat.Work.UnitTests
|
||||
{
|
||||
public class WechatWorkEventDeserializationTests
|
||||
public class TestCase_EventTests
|
||||
{
|
||||
[Fact(DisplayName = "验签并解密回调数据")]
|
||||
public void GetEventMessageTypeTest()
|
||||
[Fact(DisplayName = "测试用例:验签并解密回调数据")]
|
||||
public void TestDeserializeEventFromXml()
|
||||
{
|
||||
string callbacMsgSig = "477715d11cdb4164915debcba66cb864d751f3e6";
|
||||
string callbacTimeStamp = "1409659813";
|
||||
@@ -33,5 +33,25 @@ namespace SKIT.FlurlHttpClient.Wechat.Work.UnitTests
|
||||
Assert.Equal("wx5823bf96d3bd56c7", eventModel.ToUserName);
|
||||
Assert.Equal("mycreate", eventModel.FromUserName);
|
||||
}
|
||||
|
||||
[Fact(DisplayName = "测试用例:验证微信服务器")]
|
||||
public void TestVerifyEventSignatureForEcho()
|
||||
{
|
||||
string callbacMsgSig = "5c45ff5e21c57e6ad56bac8758b79b1d9ac89fd3";
|
||||
string callbacTimeStamp = "1409659589";
|
||||
string callbacNonce = "263014780";
|
||||
string callbackEcho = "P9nAzCzyDtyTWESHep1vC5X9xho/qYX3Zpb4yKa9SKld1DsH3Iyt3tP3zNdtp+4RPcs8TgAE7OaBO+FZXvnaqQ==";
|
||||
|
||||
var options = new WechatWorkClientOptions()
|
||||
{
|
||||
CorpId = "wx5823bf96d3bd56c7",
|
||||
PushEncodingAESKey = "jWmYm7qr5nMoAUwZRjGtBxmz3KA1tkAj3ykkR6q2B2C",
|
||||
PushToken = "QDG6eK"
|
||||
};
|
||||
var client = new WechatWorkClient(options);
|
||||
|
||||
Assert.True(client.VerifyEventSignatureForEcho(callbacTimeStamp, callbacNonce, callbackEcho, callbacMsgSig, out string replyEcho));
|
||||
Assert.Equal("1616140317555161061", replyEcho);
|
||||
}
|
||||
}
|
||||
}
|
@@ -8,10 +8,10 @@ using Xunit;
|
||||
|
||||
namespace SKIT.FlurlHttpClient.Wechat.Work.UnitTests
|
||||
{
|
||||
public class WechatWorkUtilityTests
|
||||
public class TestCase_WxBizMsgCryptorUtilityTests
|
||||
{
|
||||
[Fact(DisplayName = "回调信息解析")]
|
||||
public void WxBizMsgCryptorParsingTest()
|
||||
[Fact(DisplayName = "测试用例:回调信息解析")]
|
||||
public void TestWxBizMsgCryptorParsing()
|
||||
{
|
||||
string xml = "<xml><ToUserName><![CDATA[wx5823bf96d3bd56c7]]></ToUserName><Encrypt><![CDATA[RypEvHKD8QQKFhvQ6QleEB4J58tiPdvo+rtK1I9qca6aM/wvqnLSV5zEPeusUiX5L5X/0lWfrf0QADHHhGd3QczcdCUpj911L3vg3W/sYYvuJTs3TUUkSUXxaccAS0qhxchrRYt66wiSpGLYL42aM6A8dTT+6k4aSknmPj48kzJs8qLjvd4Xgpue06DOdnLxAUHzM6+kDZ+HMZfJYuR+LtwGc2hgf5gsijff0ekUNXZiqATP7PF5mZxZ3Izoun1s4zG4LUMnvw2r+KqCKIw+3IQH03v+BCA9nMELNqbSf6tiWSrXJB3LAVGUcallcrw8V2t9EL4EhzJWrQUax5wLVMNS0+rUPA3k22Ncx4XXZS9o0MBH27Bo6BpNelZpS+/uh9KsNlY6bHCmJU9p8g7m3fVKn28H3KDYA5Pl/T8Z1ptDAVe0lXdQ2YoyyH2uyPIGHBZZIs2pDBS8R07+qN+E7Q==]]></Encrypt><AgentID><![CDATA[218]]></AgentID></xml>";
|
||||
|
||||
@@ -22,8 +22,22 @@ namespace SKIT.FlurlHttpClient.Wechat.Work.UnitTests
|
||||
Assert.Equal("RypEvHKD8QQKFhvQ6QleEB4J58tiPdvo+rtK1I9qca6aM/wvqnLSV5zEPeusUiX5L5X/0lWfrf0QADHHhGd3QczcdCUpj911L3vg3W/sYYvuJTs3TUUkSUXxaccAS0qhxchrRYt66wiSpGLYL42aM6A8dTT+6k4aSknmPj48kzJs8qLjvd4Xgpue06DOdnLxAUHzM6+kDZ+HMZfJYuR+LtwGc2hgf5gsijff0ekUNXZiqATP7PF5mZxZ3Izoun1s4zG4LUMnvw2r+KqCKIw+3IQH03v+BCA9nMELNqbSf6tiWSrXJB3LAVGUcallcrw8V2t9EL4EhzJWrQUax5wLVMNS0+rUPA3k22Ncx4XXZS9o0MBH27Bo6BpNelZpS+/uh9KsNlY6bHCmJU9p8g7m3fVKn28H3KDYA5Pl/T8Z1ptDAVe0lXdQ2YoyyH2uyPIGHBZZIs2pDBS8R07+qN+E7Q==", encryptedMsg);
|
||||
}
|
||||
|
||||
[Fact(DisplayName = "回调信息验签")]
|
||||
public void WxBizMsgCryptorSignatureTest()
|
||||
[Fact(DisplayName = "测试用例:回调信息解密")]
|
||||
public void TestWxBizMsgCryptorDecrypt()
|
||||
{
|
||||
string corpId = "wx5823bf96d3bd56c7";
|
||||
string encodingAESKey = "jWmYm7qr5nMoAUwZRjGtBxmz3KA1tkAj3ykkR6q2B2C";
|
||||
string cipherText = "RypEvHKD8QQKFhvQ6QleEB4J58tiPdvo+rtK1I9qca6aM/wvqnLSV5zEPeusUiX5L5X/0lWfrf0QADHHhGd3QczcdCUpj911L3vg3W/sYYvuJTs3TUUkSUXxaccAS0qhxchrRYt66wiSpGLYL42aM6A8dTT+6k4aSknmPj48kzJs8qLjvd4Xgpue06DOdnLxAUHzM6+kDZ+HMZfJYuR+LtwGc2hgf5gsijff0ekUNXZiqATP7PF5mZxZ3Izoun1s4zG4LUMnvw2r+KqCKIw+3IQH03v+BCA9nMELNqbSf6tiWSrXJB3LAVGUcallcrw8V2t9EL4EhzJWrQUax5wLVMNS0+rUPA3k22Ncx4XXZS9o0MBH27Bo6BpNelZpS+/uh9KsNlY6bHCmJU9p8g7m3fVKn28H3KDYA5Pl/T8Z1ptDAVe0lXdQ2YoyyH2uyPIGHBZZIs2pDBS8R07+qN+E7Q==";
|
||||
|
||||
string actualCipherText = Utilities.WxBizMsgCryptor.AESDecrypt(cipherText, encodingAESKey, out string actualCorpId);
|
||||
string expectedCipherText = "<xml><ToUserName><![CDATA[wx5823bf96d3bd56c7]]></ToUserName>\n<FromUserName><![CDATA[mycreate]]></FromUserName>\n<CreateTime>1409659813</CreateTime>\n<MsgType><![CDATA[text]]></MsgType>\n<Content><![CDATA[hello]]></Content>\n<MsgId>4561255354251345929</MsgId>\n<AgentID>218</AgentID>\n</xml>";
|
||||
|
||||
Assert.Equal(corpId, actualCorpId);
|
||||
Assert.Equal(expectedCipherText, actualCipherText, ignoreCase: true);
|
||||
}
|
||||
|
||||
[Fact(DisplayName = "测试用例:回调信息生成签名")]
|
||||
public void TestWxBizMsgCryptorGenerateSignature()
|
||||
{
|
||||
string token = "QDG6eK";
|
||||
string timestamp = "1409659813";
|
||||
@@ -37,18 +51,16 @@ namespace SKIT.FlurlHttpClient.Wechat.Work.UnitTests
|
||||
Assert.True(Utilities.WxBizMsgCryptor.VerifySignature(sToken: token, sTimestamp: timestamp, sNonce: nonce, sMsgEncrypt: cipherText, sMsgSign: expectedSignText));
|
||||
}
|
||||
|
||||
[Fact(DisplayName = "回调信息解密")]
|
||||
public void WxBizMsgCryptorDecryptTest()
|
||||
[Fact(DisplayName = "测试用例:回调信息验证签名")]
|
||||
public void TestWxBizMsgCryptorVerifySignature()
|
||||
{
|
||||
string corpId = "wx5823bf96d3bd56c7";
|
||||
string encodingAESKey = "jWmYm7qr5nMoAUwZRjGtBxmz3KA1tkAj3ykkR6q2B2C";
|
||||
string cipherText = "RypEvHKD8QQKFhvQ6QleEB4J58tiPdvo+rtK1I9qca6aM/wvqnLSV5zEPeusUiX5L5X/0lWfrf0QADHHhGd3QczcdCUpj911L3vg3W/sYYvuJTs3TUUkSUXxaccAS0qhxchrRYt66wiSpGLYL42aM6A8dTT+6k4aSknmPj48kzJs8qLjvd4Xgpue06DOdnLxAUHzM6+kDZ+HMZfJYuR+LtwGc2hgf5gsijff0ekUNXZiqATP7PF5mZxZ3Izoun1s4zG4LUMnvw2r+KqCKIw+3IQH03v+BCA9nMELNqbSf6tiWSrXJB3LAVGUcallcrw8V2t9EL4EhzJWrQUax5wLVMNS0+rUPA3k22Ncx4XXZS9o0MBH27Bo6BpNelZpS+/uh9KsNlY6bHCmJU9p8g7m3fVKn28H3KDYA5Pl/T8Z1ptDAVe0lXdQ2YoyyH2uyPIGHBZZIs2pDBS8R07+qN+E7Q==";
|
||||
string token = "ovAkP0Tb";
|
||||
string reqMsgSig = "8128e41a38892d814e4aa67753425da9dc8ec2b3";
|
||||
string reqTimeStamp = "1628737717";
|
||||
string reqNonce = "1811081856";
|
||||
string reqCipherText = "Q/jUxIL3/jRaFeTKesIr1QSq2SOEApDqlzcRrRM6Jlk4EbMBns3plPOR/W3gThOEq+zYI42fNSoIUb3cQwt9zyD1aLU/7D3WNLute7LQ9LSHjZEfVmx5zcIR9zvrUWGjhe1whTPH4e1WR6vbOYs8o/bDRF0vX/NcE4XK7P83Y6CzQiJoKbjVCne84s0zcw5eh+ZUDB55eaDHPSoS7kAC8kB00pfBoDF0jyfc8CUKLW97e72vJGyUWjZ0BvYN+R+tFjMgEzg/EN1imuuFnf40DMAcvB6y+C97TuaWjpgfRdowGWzn10JAFNukRfQqjdA0e2bfczJ7+t9w/t8/XSMADJOt1xbnP+I5cRX/r7ueBGmG/6ejP3myO9yTXHdujGvwrXHuWw+J7qD4VoUVjbm2vQ1qQKbrweKssr6O+3XSbanZ5R3n26EpN/gfgX+r6rcGViqsFop9Ai9xMnfJUubB6Q==";
|
||||
|
||||
string actualCipherText = Utilities.WxBizMsgCryptor.AESDecrypt(cipherText, encodingAESKey, out string actualCorpId);
|
||||
string expectedCipherText = "<xml><ToUserName><![CDATA[wx5823bf96d3bd56c7]]></ToUserName>\n<FromUserName><![CDATA[mycreate]]></FromUserName>\n<CreateTime>1409659813</CreateTime>\n<MsgType><![CDATA[text]]></MsgType>\n<Content><![CDATA[hello]]></Content>\n<MsgId>4561255354251345929</MsgId>\n<AgentID>218</AgentID>\n</xml>";
|
||||
|
||||
Assert.Equal(corpId, actualCorpId);
|
||||
Assert.Equal(expectedCipherText, actualCipherText, ignoreCase: true);
|
||||
Assert.True(Utilities.WxBizMsgCryptor.VerifySignature(token, reqTimeStamp, reqNonce, reqCipherText, reqMsgSig));
|
||||
}
|
||||
}
|
||||
}
|
@@ -8,8 +8,9 @@ namespace SKIT.FlurlHttpClient.Wechat.Work.UnitTests
|
||||
{
|
||||
static TestConfigs()
|
||||
{
|
||||
// NOTICE: 请在项目根目录下按照 appsettings.json 的格式新建 appsettings.local.json 填入测试参数。
|
||||
// WARN: 敏感信息请不要提交到 git!
|
||||
// NOTICE: 请在项目根目录下按照 appsettings.json 的格式新建 appsettings.local.json 填入测试参数。
|
||||
// WARNING: 请在 DEBUG 模式下运行测试用例。
|
||||
// WARNING: 敏感信息请不要提交到 git!
|
||||
|
||||
try
|
||||
{
|
||||
@@ -17,12 +18,12 @@ namespace SKIT.FlurlHttpClient.Wechat.Work.UnitTests
|
||||
using var jdoc = JsonDocument.Parse(stream);
|
||||
|
||||
var config = jdoc.RootElement.GetProperty("TestConfig");
|
||||
WechatCorpId = config.GetProperty("CorpId").GetString();
|
||||
WechatAgentId = int.Parse(config.GetProperty("AgentId").GetString());
|
||||
WechatAgentSecret = config.GetProperty("AgentSecret").GetString();
|
||||
WechatCorpId = config.GetProperty("CorpId").GetString()!;
|
||||
WechatAgentId = int.Parse(config.GetProperty("AgentId").GetString())!;
|
||||
WechatAgentSecret = config.GetProperty("AgentSecret").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)
|
||||
{
|
||||
|
@@ -1,33 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using System.Xml.Linq;
|
||||
using Xunit;
|
||||
|
||||
namespace SKIT.FlurlHttpClient.Wechat.Work.UnitTests
|
||||
{
|
||||
public class WechatWorkEventVerificationTests
|
||||
{
|
||||
[Fact(DisplayName = "验证微信服务器")]
|
||||
public void GetEventMessageTypeTest()
|
||||
{
|
||||
string callbacMsgSig = "5c45ff5e21c57e6ad56bac8758b79b1d9ac89fd3";
|
||||
string callbacTimeStamp = "1409659589";
|
||||
string callbacNonce = "263014780";
|
||||
string callbackEcho = "P9nAzCzyDtyTWESHep1vC5X9xho/qYX3Zpb4yKa9SKld1DsH3Iyt3tP3zNdtp+4RPcs8TgAE7OaBO+FZXvnaqQ==";
|
||||
|
||||
var options = new WechatWorkClientOptions()
|
||||
{
|
||||
CorpId = "wx5823bf96d3bd56c7",
|
||||
PushEncodingAESKey = "jWmYm7qr5nMoAUwZRjGtBxmz3KA1tkAj3ykkR6q2B2C",
|
||||
PushToken = "QDG6eK"
|
||||
};
|
||||
var client = new WechatWorkClient(options);
|
||||
|
||||
Assert.True(client.VerifyEventSignatureForEcho(callbacTimeStamp, callbacNonce, callbackEcho, callbacMsgSig, out string replyEcho));
|
||||
Assert.Equal("1616140317555161061", replyEcho);
|
||||
}
|
||||
}
|
||||
}
|
@@ -1,25 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using Xunit;
|
||||
|
||||
namespace SKIT.FlurlHttpClient.Wechat.Work.UnitTests
|
||||
{
|
||||
public class WechatWorkWxBizMsgCryptorTests
|
||||
{
|
||||
[Fact(DisplayName = "验签回调数据")]
|
||||
public void VerifyEventTest()
|
||||
{
|
||||
string token = "ovAkP0Tb";
|
||||
string reqMsgSig = "8128e41a38892d814e4aa67753425da9dc8ec2b3";
|
||||
string reqTimeStamp = "1628737717";
|
||||
string reqNonce = "1811081856";
|
||||
string reqCipherText = "Q/jUxIL3/jRaFeTKesIr1QSq2SOEApDqlzcRrRM6Jlk4EbMBns3plPOR/W3gThOEq+zYI42fNSoIUb3cQwt9zyD1aLU/7D3WNLute7LQ9LSHjZEfVmx5zcIR9zvrUWGjhe1whTPH4e1WR6vbOYs8o/bDRF0vX/NcE4XK7P83Y6CzQiJoKbjVCne84s0zcw5eh+ZUDB55eaDHPSoS7kAC8kB00pfBoDF0jyfc8CUKLW97e72vJGyUWjZ0BvYN+R+tFjMgEzg/EN1imuuFnf40DMAcvB6y+C97TuaWjpgfRdowGWzn10JAFNukRfQqjdA0e2bfczJ7+t9w/t8/XSMADJOt1xbnP+I5cRX/r7ueBGmG/6ejP3myO9yTXHdujGvwrXHuWw+J7qD4VoUVjbm2vQ1qQKbrweKssr6O+3XSbanZ5R3n26EpN/gfgX+r6rcGViqsFop9Ai9xMnfJUubB6Q==";
|
||||
|
||||
Assert.True(Utilities.WxBizMsgCryptor.VerifySignature(token, reqTimeStamp, reqNonce, reqCipherText, reqMsgSig));
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user