Browse Source

解决微信首次关注未和用户绑定的问题

master
yashen 9 years ago
parent
commit
989d358251
7 changed files with 292 additions and 2 deletions
  1. +1
    -1
      B3WeChat.Web/Pages/WeChatReceive.cs
  2. +7
    -1
      B3WeChat.sln
  3. +33
    -0
      B3WeChat/Entities/QRCodeMessage.cs
  4. +5
    -0
      B3WeChat/Utils/InOutMessageUtil.cs
  5. +36
    -0
      Test/Properties/AssemblyInfo.cs
  6. +99
    -0
      Test/Test.csproj
  7. +111
    -0
      Test/UnitTest1.cs

+ 1
- 1
B3WeChat.Web/Pages/WeChatReceive.cs View File

@ -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;
}


+ 7
- 1
B3WeChat.sln View File

@ -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


+ 33
- 0
B3WeChat/Entities/QRCodeMessage.cs View File

@ -48,5 +48,38 @@ namespace BWP.B3WeChat.Entities
/// </summary>
[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;
}
}
}

+ 5
- 0
B3WeChat/Utils/InOutMessageUtil.cs View File

@ -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<MessageType>(xmlData);
if (type.MsgType == MsgType.)


+ 36
- 0
Test/Properties/AssemblyInfo.cs View File

@ -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")]

+ 99
- 0
Test/Test.csproj View File

@ -0,0 +1,99 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{73699A65-4D9C-4199-86AB-39A421119AC1}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Test</RootNamespace>
<AssemblyName>Test</AssemblyName>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<ProjectTypeGuids>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
<ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages</ReferencePath>
<IsCodedUITest>False</IsCodedUITest>
<TestProjectType>UnitTest</TestProjectType>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="Forks.Utils">
<HintPath>..\..\..\tsref\Debug\Forks.Utils.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
</ItemGroup>
<Choose>
<When Condition="('$(VisualStudioVersion)' == '10.0' or '$(VisualStudioVersion)' == '') and '$(TargetFrameworkVersion)' == 'v3.5'">
<ItemGroup>
<Reference Include="Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=10.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />
</ItemGroup>
</When>
<Otherwise>
<ItemGroup>
<Reference Include="Microsoft.VisualStudio.QualityTools.UnitTestFramework" />
</ItemGroup>
</Otherwise>
</Choose>
<ItemGroup>
<Compile Include="UnitTest1.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\B3WeChat.Web\B3WeChat.Web.csproj">
<Project>{4a56a7f3-dff5-4fb0-ae5f-0def57e49ab8}</Project>
<Name>B3WeChat.Web</Name>
</ProjectReference>
<ProjectReference Include="..\B3WeChat\B3WeChat.csproj">
<Project>{9e680662-8323-494f-8140-237db0a9f0d9}</Project>
<Name>B3WeChat</Name>
</ProjectReference>
</ItemGroup>
<Choose>
<When Condition="'$(VisualStudioVersion)' == '10.0' And '$(IsCodedUITest)' == 'True'">
<ItemGroup>
<Reference Include="Microsoft.VisualStudio.QualityTools.CodedUITestFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<Private>False</Private>
</Reference>
<Reference Include="Microsoft.VisualStudio.TestTools.UITest.Common, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<Private>False</Private>
</Reference>
<Reference Include="Microsoft.VisualStudio.TestTools.UITest.Extension, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<Private>False</Private>
</Reference>
<Reference Include="Microsoft.VisualStudio.TestTools.UITesting, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<Private>False</Private>
</Reference>
</ItemGroup>
</When>
</Choose>
<Import Project="$(VSToolsPath)\TeamTest\Microsoft.TestTools.targets" Condition="Exists('$(VSToolsPath)\TeamTest\Microsoft.TestTools.targets')" />
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>

+ 111
- 0
Test/UnitTest1.cs View File

@ -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 = @"<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1348831860</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[this is a test]]></Content>
<MsgId>1234567890123456</MsgId>
</xml>";
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 = @"<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>123456789</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[subscribe]]></Event>
</xml>";
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 = @"<xml><ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>123456789</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[subscribe]]></Event>
<EventKey><![CDATA[qrscene_123123]]></EventKey>
<Ticket><![CDATA[TICKET]]></Ticket>
</xml>";
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 = @"<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>123456789</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[SCAN]]></Event>
<EventKey><![CDATA[123123]]></EventKey>
<Ticket><![CDATA[TICKET]]></Ticket>
</xml>";
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);
}
}
}

Loading…
Cancel
Save