diff --git a/B3WeChat.Web/Pages/WeChatReceive.cs b/B3WeChat.Web/Pages/WeChatReceive.cs index f732d5e..3a2280b 100644 --- a/B3WeChat.Web/Pages/WeChatReceive.cs +++ b/B3WeChat.Web/Pages/WeChatReceive.cs @@ -74,7 +74,7 @@ namespace BWP.Web.Pages { QRCodeMessage msg = result as QRCodeMessage; int scene_id; - if (!int.TryParse(msg.EventKey, out scene_id)) + if (!msg.TryGetSceneID(out scene_id)) { return; } diff --git a/B3WeChat.sln b/B3WeChat.sln index 7dc392c..1d594b1 100644 --- a/B3WeChat.sln +++ b/B3WeChat.sln @@ -7,7 +7,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "B3WeChat", "B3WeChat\B3WeCh EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "B3WeChat.Web", "B3WeChat.Web\B3WeChat.Web.csproj", "{4A56A7F3-DFF5-4FB0-AE5F-0DEF57E49AB8}" EndProject -Project("{E24C65DC-7377-472B-9ABA-BC803B73C61A}") = "WebFolder(17)", "http://localhost:39331", "{3ED5FB57-EE55-43B7-BCB0-CA959C3C9DA7}" +Project("{E24C65DC-7377-472B-9ABA-BC803B73C61A}") = "WebFolder(42)", "http://localhost:39331", "{3ED5FB57-EE55-43B7-BCB0-CA959C3C9DA7}" ProjectSection(WebsiteProperties) = preProject UseIISExpress = "true" TargetFrameworkMoniker = ".NETFramework,Version%3Dv4.0" @@ -29,6 +29,8 @@ Project("{E24C65DC-7377-472B-9ABA-BC803B73C61A}") = "WebFolder(17)", "http://loc DefaultWebSiteLanguage = "Visual C#" EndProjectSection EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Test", "Test\Test.csproj", "{73699A65-4D9C-4199-86AB-39A421119AC1}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -47,6 +49,10 @@ Global {3ED5FB57-EE55-43B7-BCB0-CA959C3C9DA7}.Debug|Any CPU.Build.0 = Debug|Any CPU {3ED5FB57-EE55-43B7-BCB0-CA959C3C9DA7}.Release|Any CPU.ActiveCfg = Debug|Any CPU {3ED5FB57-EE55-43B7-BCB0-CA959C3C9DA7}.Release|Any CPU.Build.0 = Debug|Any CPU + {73699A65-4D9C-4199-86AB-39A421119AC1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {73699A65-4D9C-4199-86AB-39A421119AC1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {73699A65-4D9C-4199-86AB-39A421119AC1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {73699A65-4D9C-4199-86AB-39A421119AC1}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/B3WeChat/Entities/QRCodeMessage.cs b/B3WeChat/Entities/QRCodeMessage.cs index 803fb46..4368061 100644 --- a/B3WeChat/Entities/QRCodeMessage.cs +++ b/B3WeChat/Entities/QRCodeMessage.cs @@ -48,5 +48,38 @@ namespace BWP.B3WeChat.Entities /// [XmlElement("Ticket")] public string Ticket { get; set; } + + public bool IsSubscribeEvent() + { + return Event == "subscribe"; + } + + public bool IsScanEvent() + { + return Event == "SCAN"; + } + + public bool TryGetSceneID(out int sceneid) + { + sceneid = default(int); + if (string.IsNullOrEmpty(EventKey)) + { + return false; + } + if (IsSubscribeEvent()) + { + sceneid = int.Parse(EventKey.Substring("qrscene_".Length)); + } + else if (IsScanEvent()) + { + sceneid = int.Parse(EventKey); + } + else + { + return false; + } + + return true; + } } } \ No newline at end of file diff --git a/B3WeChat/Utils/InOutMessageUtil.cs b/B3WeChat/Utils/InOutMessageUtil.cs index a2ad198..37f7e25 100644 --- a/B3WeChat/Utils/InOutMessageUtil.cs +++ b/B3WeChat/Utils/InOutMessageUtil.cs @@ -199,6 +199,11 @@ namespace BWP.B3WeChat.Utils { StreamReader reader = new StreamReader(request.InputStream); String xmlData = reader.ReadToEnd(); + return ParseWeChatMessage(xmlData); + } + + public static object ParseWeChatMessage(String xmlData) + { object obj = null; MessageType type = XmlUtil.Deserialize(xmlData); if (type.MsgType == MsgType.文本) diff --git a/Test/Properties/AssemblyInfo.cs b/Test/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..312fa90 --- /dev/null +++ b/Test/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的常规信息通过以下特性集 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("Test")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Test")] +[assembly: AssemblyCopyright("Copyright © 2016")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 会使此程序集中的类型 +// 对 COM 组件不可见。 如果需要从 COM 访问此程序集中的类型, +// 请将该类型上的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("245c53d7-fa35-4304-93d4-5b966cc6df81")] + +// 程序集的版本信息由以下四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +// 可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值, +// 方法是按如下所示使用“*”: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Test/Test.csproj b/Test/Test.csproj new file mode 100644 index 0000000..50d6794 --- /dev/null +++ b/Test/Test.csproj @@ -0,0 +1,99 @@ + + + + Debug + AnyCPU + {73699A65-4D9C-4199-86AB-39A421119AC1} + Library + Properties + Test + Test + v4.0 + 512 + {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + 10.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + $(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages + False + UnitTest + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\..\..\tsref\Debug\Forks.Utils.dll + + + + 3.5 + + + + + + + + + + + + + + + + + + + + + {4a56a7f3-dff5-4fb0-ae5f-0def57e49ab8} + B3WeChat.Web + + + {9e680662-8323-494f-8140-237db0a9f0d9} + B3WeChat + + + + + + + False + + + False + + + False + + + False + + + + + + + + \ No newline at end of file diff --git a/Test/UnitTest1.cs b/Test/UnitTest1.cs new file mode 100644 index 0000000..b1c1648 --- /dev/null +++ b/Test/UnitTest1.cs @@ -0,0 +1,111 @@ +using System; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using BWP.B3WeChat.Utils; +using BWP.B3WeChat.Entities; + + +namespace Test +{ + [TestClass] + public class UnitTest1 + { + [TestMethod] + public void TestTextMessageParser() + { + var xml = @" + + + 1348831860 + + + 1234567890123456 + "; + + var message = InOutMessageUtil.ParseWeChatMessage(xml) as ReceivedMsg; + + Assert.IsNotNull(message); + Assert.AreEqual("toUser", message.ToUserName); + Assert.AreEqual("fromUser", message.FromUserName); + Assert.AreEqual("1348831860", message.CreateTime); + Assert.AreEqual("text", message.MsgType); + Assert.AreEqual("1234567890123456", message.MsgId); + } + + + [TestMethod] + public void TestSubscribeEventParser() + { + var xml = @" + + +123456789 + + +"; + + var message = InOutMessageUtil.ParseWeChatMessage(xml) as QRCodeMessage; + + Assert.IsNotNull(message); + Assert.AreEqual("toUser", message.ToUserName); + Assert.AreEqual("fromUser", message.FromUserName); + Assert.AreEqual("123456789", message.CreateTime); + Assert.AreEqual("event", message.MsgType); + Assert.AreEqual("subscribe", message.Event); + int sceneid; + Assert.AreEqual(false, message.TryGetSceneID(out sceneid)); + + } + + [TestMethod] + public void TestSubscribeWithSceneEventParser() + { + var xml = @" + +123456789 + + + + +"; + + var message = InOutMessageUtil.ParseWeChatMessage(xml) as QRCodeMessage; + + Assert.IsNotNull(message); + Assert.AreEqual("toUser", message.ToUserName); + Assert.AreEqual("fromUser", message.FromUserName); + Assert.AreEqual("123456789", message.CreateTime); + Assert.AreEqual("event", message.MsgType); + Assert.AreEqual("subscribe", message.Event); + int sceneid; + Assert.AreEqual(true, message.TryGetSceneID(out sceneid)); + Assert.AreEqual(123123, sceneid); + + } + + + [TestMethod] + public void TestScanEventParser() + { + var xml = @" + + +123456789 + + + + +"; + var message = InOutMessageUtil.ParseWeChatMessage(xml) as QRCodeMessage; + Assert.IsNotNull(message); + Assert.AreEqual("toUser", message.ToUserName); + Assert.AreEqual("fromUser", message.FromUserName); + Assert.AreEqual("123456789", message.CreateTime); + Assert.AreEqual("event", message.MsgType); + Assert.AreEqual("SCAN", message.Event); + int sceneid; + Assert.AreEqual(true, message.TryGetSceneID(out sceneid)); + Assert.AreEqual(123123, sceneid); + Assert.AreEqual("TICKET", message.Ticket); + } + } +}