WeiXinMPSDK
WeiXinMPSDK copied to clipboard
企业微信订阅OA审批申请状态变化回调通知(sys_approval_change)事件,RequestMessageEvent_SysApprovalChange对象上的ApprovalInfo属性为null
问题描述
当在自定义的WorkCustomMessageHandler里重写OnEvent_Sys_Approval_Change_Status_ChangeRequest(RequestMessageEvent_SysApprovalChange requestMessage)方法时,从RequestMessageEvent_SysApprovalChange上取ApprovalInfo,当审批刚刚新建时,ApprovalInfo能正常取到值,但是当审批同意或者驳回时,ApprovalInfo为null
微信官方文档 URL
https://developer.work.weixin.qq.com/document/path/91815
发现问题的模块
- [x] Senparc.Weixin.Work 版本:3.14.10.0
模块对应的 .net 版本
- [x] .net core 3.x
开发环境
- [x] Visual Studio 2019
缓存环境
- [x] 服务器内存缓存(默认)
系统环境
- [x] Windows,版本:
联系方式
Email:[email protected]
(也可将问题地址及联系方式发送到 [email protected])
发布问题后,请保持对 issue 的关注,有时会有需要进一步沟通的信息,很长时间内没有得到答复的 issue 将被关闭。
经过测试是可用的,您可以根据这个单元测试跑一下自己的数据:
https://github.com/JeffreySu/WeiXinMPSDK/blob/0f3d11fb0d421c20a8cad4c4cdcf5ff594f21385/src/Senparc.Weixin.Work/Senparc.Weixin.Work.Test/MessageHandlers/WorkMessageHandlerTest.Approval.cs#L24-L24
用你测试提供的数据没问题,可是用微信实际返回的xml就有问题。
你用这个数据测一下:
<xml> <ToUserName><![CDATA[ww347c3f221bdb85ad]]></ToUserName> <FromUserName><![CDATA[sys]]></FromUserName> <CreateTime>1652167771</CreateTime> <MsgType><![CDATA[event]]></MsgType> <Event><![CDATA[sys_approval_change]]></Event> <AgentID>3010040</AgentID> <ApprovalInfo> <SpNo>202205100003</SpNo> <SpName><![CDATA[物品领用]]></SpName> <SpStatus>2</SpStatus> <TemplateId><![CDATA[3TmmDEDyvCbnHeLiszG5rBwUB9dhVNcMU3qxwH1K]]></TemplateId> <ApplyTime>1652167758</ApplyTime> <Applyer> <UserId><![CDATA[JiangYueYe]]></UserId> <Party><![CDATA[3]]></Party> </Applyer> <SpRecord> <SpStatus>2</SpStatus> <ApproverAttr>1</ApproverAttr> <Details> <Approver> <UserId><![CDATA[JiangYueYe]]></UserId> </Approver> <Speech><![CDATA[]]></Speech> <SpStatus>2</SpStatus> <SpTime>1652167770</SpTime> </Details> <Details> <Approver> <UserId><![CDATA[XuJianBing]]></UserId> </Approver> <Speech><![CDATA[]]></Speech> <SpStatus>1</SpStatus> <SpTime>0</SpTime> </Details> </SpRecord> <StatuChangeEvent>2</StatuChangeEvent> </ApprovalInfo> </xml>
会报异常
我用你上面的数据测试也没有问题:
那就奇怪了,麻烦你再用这个代码测试下:
[TestMethod]
public void TestFillEntityWithXml()
{
//客服回调
var doc = XDocument.Parse(@"
<xml>
<ToUserName><![CDATA[ww347c3f221bdb85ad]]></ToUserName>
<FromUserName><![CDATA[sys]]></FromUserName>
<CreateTime>1652167771</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[sys_approval_change]]></Event>
<AgentID>3010040</AgentID>
<ApprovalInfo>
<SpNo>202205100003</SpNo>
<SpName><![CDATA[物品领用]]></SpName>
<SpStatus>2</SpStatus>
<TemplateId><![CDATA[3TmmDEDyvCbnHeLiszG5rBwUB9dhVNcMU3qxwH1K]]></TemplateId>
<ApplyTime>1652167758</ApplyTime>
<Applyer>
<UserId><![CDATA[JiangYueYe]]></UserId>
<Party><![CDATA[3]]></Party>
</Applyer>
<SpRecord>
<SpStatus>2</SpStatus>
<ApproverAttr>1</ApproverAttr>
<Details>
<Approver>
<UserId><![CDATA[JiangYueYe]]></UserId>
</Approver>
<Speech><![CDATA[]]></Speech>
<SpStatus>2</SpStatus>
<SpTime>1652167770</SpTime>
</Details>
<Details>
<Approver>
<UserId><![CDATA[XuJianBing]]></UserId>
</Approver>
<Speech><![CDATA[]]></Speech>
<SpStatus>1</SpStatus>
<SpTime>0</SpTime>
</Details>
</SpRecord>
<StatuChangeEvent>2</StatuChangeEvent>
</ApprovalInfo>
</xml>");
RequestMessageEvent_SysApprovalChange reqPack = new RequestMessageEvent_SysApprovalChange();
reqPack.FillEntityWithXml(doc);
Assert.IsNotNull(reqPack.ApprovalInfo);
Assert.AreEqual((ulong)202205100003, reqPack.ApprovalInfo.SpNo);
}
看看测试能不能通过
也是正常的:
所有其他测试也是通过的(错误的是因为需要输入appId、secret进行解密):
那就奇怪了,我的一直会报错:
我用的是vs2019 17.0.1
运行环境.net core 3.1
nuget包版本
你的SDK是最新的吗?
是最新的啊
那就奇怪了,麻烦你再用这个代码测试下:
[TestMethod] public void TestFillEntityWithXml() { //客服回调 var doc = XDocument.Parse(@" <xml> <ToUserName><![CDATA[ww347c3f221bdb85ad]]></ToUserName> <FromUserName><![CDATA[sys]]></FromUserName> <CreateTime>1652167771</CreateTime> <MsgType><![CDATA[event]]></MsgType> <Event><![CDATA[sys_approval_change]]></Event> <AgentID>3010040</AgentID> <ApprovalInfo> <SpNo>202205100003</SpNo> <SpName><![CDATA[物品领用]]></SpName> <SpStatus>2</SpStatus> <TemplateId><![CDATA[3TmmDEDyvCbnHeLiszG5rBwUB9dhVNcMU3qxwH1K]]></TemplateId> <ApplyTime>1652167758</ApplyTime> <Applyer> <UserId><![CDATA[JiangYueYe]]></UserId> <Party><![CDATA[3]]></Party> </Applyer> <SpRecord> <SpStatus>2</SpStatus> <ApproverAttr>1</ApproverAttr> <Details> <Approver> <UserId><![CDATA[JiangYueYe]]></UserId> </Approver> <Speech><![CDATA[]]></Speech> <SpStatus>2</SpStatus> <SpTime>1652167770</SpTime> </Details> <Details> <Approver> <UserId><![CDATA[XuJianBing]]></UserId> </Approver> <Speech><![CDATA[]]></Speech> <SpStatus>1</SpStatus> <SpTime>0</SpTime> </Details> </SpRecord> <StatuChangeEvent>2</StatuChangeEvent> </ApprovalInfo> </xml>"); RequestMessageEvent_SysApprovalChange reqPack = new RequestMessageEvent_SysApprovalChange(); reqPack.FillEntityWithXml(doc); Assert.IsNotNull(reqPack.ApprovalInfo); Assert.AreEqual((ulong)202205100003, reqPack.ApprovalInfo.SpNo); }
看看测试能不能通过
这个是您收到的最原始的XML信息吗?
是的
那你直接运行一下这个单元测试,结果是什么?
你看一下源码是不是最新的,如果是最新的不应该有这个问题了。