4.自建应用审批状态变化通知回调
4.1概述
1、企业可以在管理后台-自建应用-设置API接收中,设置并开启审批状态通知事件。
2、开启后,自建应用每一个审批申请的审批状态变化,都会通知给开发者。查看事件回调详细说明
4.2代码实战
1、找到"自建审批应用"中的"接收消息",并作如下图所示的配置:
2、校验代码如下:
#region 5、自建审批应用申请状态变化回调通知
[Route("SelfAppCallback")]
public string SelfAppCallback(CallbackModel model)
{
//1、配置回调函数时使用该方法进行校验,校验通过后,界面上的配置才能保存成功
return Verify(model);
//var stream = HttpContext.Request.Body;
2、解析企业微信发过来的加密数据
//return await _jsonXmlHelper.DecryptMsg(model, stream);
}
/// <summary>
/// 校验信息有效性
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
public string Verify(CallbackModel model)
{
Tencent.WXBizMsgCrypt wxcpt = new Tencent.WXBizMsgCrypt(PublicParam.callbackToken, PublicParam.callbackAesKey, PublicParam.corpi);
// string sVerifyMsgSig = HttpUtils.ParseUrl("msg_signature");
string sVerifyMsgSig = model.msg_signature;
// string sVerifyTimeStamp = HttpUtils.ParseUrl("timestamp");
string sVerifyTimeStamp = model.timestamp;
// string sVerifyNonce = HttpUtils.ParseUrl("nonce");
string sVerifyNonce = model.nonce;
// string sVerifyEchoStr = HttpUtils.ParseUrl("echostr");
string sVerifyEchoStr = model.echostr;
int ret = 0;
string sEchoStr = "";
ret = wxcpt.VerifyURL(sVerifyMsgSig, sVerifyTimeStamp, sVerifyNonce, sVerifyEchoStr, ref sEchoStr);
if (ret != 0)
{
System.Console.WriteLine("ERR: VerifyURL fail, ret: " + ret);
}
return sEchoStr;
}
#endregion
3、此时点击"保存"按钮,看到"保存成功"即为校验通过(步骤与使用配置企业微信默认审批应用的回调一样,可参考前面的步骤)
4、校验通过后,将代码作如下更改:
[Route("SelfAppCallback")]
public async Task<string> SelfAppCallback(CallbackModel model)
{
//1、配置回调函数时使用该方法进行校验,校验通过后,界面上的配置才能保存成功
//return _jsonXmlHelper.Verify(model);
var stream = HttpContext.Request.Body;
2、解析企业微信发过来的加密数据
return await DecryptMsg(model, stream);
}
/// <summary>
/// 解析
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
public async Task<string> DecryptMsg(CallbackModel model,Stream context)
{
int ret = 0;
Tencent.WXBizMsgCrypt wxcpt = new Tencent.WXBizMsgCrypt(PublicParam.callbackToken, PublicParam.callbackAesKey, PublicParam.corpi);
// string sReqMsgSig = HttpUtils.ParseUrl("msg_signature");
string sReqMsgSig = model.msg_signature;
// string sReqTimeStamp = HttpUtils.ParseUrl("timestamp");
string sReqTimeStamp = model.timestamp;
// string sReqNonce = HttpUtils.ParseUrl("nonce");
string sReqNonce = model.nonce;
// Post请求的密文数据
// string sReqData = HttpUtils.PostData();
string sReqData = "";
using (var reader = new StreamReader(context))
{
sReqData = await reader.ReadToEndAsync();
}
string sMsg = ""; // 解析之后的明文
ret = wxcpt.DecryptMsg(sReqMsgSig, sReqTimeStamp, sReqNonce, sReqData, ref sMsg);
if (ret != 0)
{
System.Console.WriteLine("ERR: Decrypt Fail, ret: " + ret);
return "";
}
// ret==0表示解密成功,sMsg表示解密之后的明文xml串
// TODO: 对明文的处理
// For example:
XmlDocument doc = new XmlDocument();
doc.LoadXml(sMsg);
//XmlNode root = doc.FirstChild;
//string content = root["Content"].InnerText;
//System.Console.WriteLine(content);
//XmlNode root = doc.FirstChild;
//string content = root.InnerText;
System.Console.WriteLine(sMsg);
return sMsg;
}
5、重新运行项目,并在微信客户端中提交一条审批申请,可看到控制台中输出了如下图所示的数据(数据属性解析请看官方文档)
参数说明:
参数 | 说明 |
---|---|
ToUserName | 接收方企业Corpid |
FromUserName | 发送方:企业微信 |
CreateTime | 消息发送时间 |
MsgType | 消息类型 |
Event | 事件名称:审批状态变化 |
AgentID | 企业应用的id,整型。可在应用的设置页面查看 |
ApprovalInfo | 审批信息 |
ThirdNo | 审批单编号,由开发者在发起申请时自定义 |
OpenSpName | 审批模板名称 |
OpenTemplateId | 审批模板id |
OpenSpStatus | 申请单当前审批状态:1-审批中;2-已通过;3-已驳回;4-已撤销 |
ApplyTime | 提交申请时间 |
ApplyUserName | 提交者姓名 |
ApplyUserId | 提交者userid |
ApplyUserParty | 提交者所在部门 |
ApplyUserImage | 提交者头像 |
ApprovalNodes | 审批流程信息 |
ApprovalNode | 审批流程信息,可以有多个审批节点 |
NodeStatus | 节点审批操作状态:1-审批中;2-已同意;3-已驳回;4-已转审 |
NodeAttr | 审批节点属性:1-或签;2-会签 |
NodeType | 审批节点类型:1-固定成员;2-标签;3-上级 |
Items | 审批节点信息,当节点为标签或上级时,一个节点可能有多个分支 |
Item | 审批节点分支,当节点为标签或上级时,一个节点可能有多个分支 |
ItemName | 分支审批人姓名 |
ItemUserid | 分支审批人userid |
ItemParty | 分支审批人所在部门 |
ItemImage | 分支审批人头像 |
ItemStatus | 分支审批审批操作状态:1-审批中;2-已同意;3-已驳回;4-已转审 |
ItemSpeech | 分支审批人审批意见 |
ItemOpTime | 分支审批人操作时间 |
NotifyNodes | 抄送信息,可能有多个抄送人 |
NotifyNode | 抄送人信息 |
ItemName | 抄送人姓名 |
ItemUserid | 抄送人userid |
ItemParty | 抄送人所在部门 |
ItemImage | 抄送人头像 |
ApproverStep | 当前审批节点:0-第一个审批节点;1-第二个审批节点…以此类推 |
5.查询自建应用审批单当前状态
5.1概述
开发者也可主动查询审批单的当前审批状态。
请求方式: POST(HTTPS)
请求地址: https://qyapi.weixin.qq.com/cgi-bin/corp/getopenapprovaldata?access_token=ACCESS_TOKEN
请求示例:
{ "thirdNo": "201806010001"}
参数说明:
参数 | 必须 | 说明 |
---|---|---|
access_token | 是 | 调用接口凭证 |
thirdNo | 是 | 开发者发起申请时定义的审批单号 |
5.2代码实战
1、具体代码如下:
#region 6、查询第三方应用审批申请当前状态
/// <summary>
/// 查询第三方应用审批申请当前状态
/// </summary>
/// <param name="thirdNo">开发者发起申请时定义的审批单号</param>
/// <returns></returns>
[Route("OpenApprovalAgentStatus")]
public async Task<IActionResult> OpenApprovalAgentStatus(string thirdNo)
{
//request accessToken
var model = _tokenTicketHelper.GetSelfApprovalAccessToken();
string accessToken = "";
if (model != null)
accessToken = model.access_token;
//build request url
string url = string.Format(PublicParam.openApprovalAgentStatusUrl, accessToken);
//request
return Content(
await _httpUtils.Post(url, new JsonContent(new { thirdNo = thirdNo }))
);
}
#endregion
2、运行项目,并访问http://localhost:5001/api/SelfApproval/OpenApprovalAgentStatus?thirdNo=thirdNo,其中thirdNo是开发者发起申请时定义的审批单号,可看到如下的返回结果:
返回结果:
{
"errcode": 0,
"errmsg": "ok",
"data": {
"ThirdNo": "thirdNo",
"OpenTemplateId": "1aa556e88991520f9b2477e8f1d3a6e8_852697916",
"OpenSpName": "测试模版",
"OpenSpstatus": 1,
"ApplyTime": 1619078332,
"ApplyUsername": "申请人姓名",
"ApplyUserParty": "",
"ApplyUserImage": "http://wework.qpic.cn/bizmail/ib6dxHJZqkLnhzcHmBAMxY3np3qvm97ygM8ibsmmzmxgnOgtm9UZ37Lg/0",
"ApplyUserId": "申请人id",
"ApprovalNodes": {
"ApprovalNode": [{
"NodeStatus": 1,
"Items": {
"Item": [{
"ItemName": "审批人姓名",
"ItemParty": "",
"ItemImage": "",
"ItemUserId": "审批人id",
"ItemStatus": 1,
"ItemSpeech": "",
"ItemOpTime": 0
}]
},
"NodeAttr": 1,
"NodeType": 1
}]
},
"NotifyNodes": {
"NotifyNode": [{
"ItemName": "通知人姓名",
"ItemParty": "",
"ItemImage": "http://wework.qpic.cn/bizmail/ib6dxHJZqkLnhzcHmBAMxY3np3qvm97ygM8ibsmmzmxgnOgtm9UZ37Lg/0",
"ItemUserId": "通知人id"
}]
},
"approverstep": 0
}
}
参数说明:
参数 | 说明 |
---|---|
ToUserName | 接收方企业Corpid |
FromUserName | 发送方:企业微信 |
CreateTime | 消息发送时间 |
MsgType | 消息类型 |
Event | 事件名称:审批状态变化 |
ApprovalInfo | 审批信息 |
ThirdNo | 审批单编号,由开发者在发起申请时自定义 |
OpenSpName | 审批模板名称 |
OpenTemplateId | 审批模板id |
OpenSpStatus | 申请单当前审批状态:1-审批中;2-已通过;3-已驳回;4-已撤销 |
ApplyTime | 提交申请时间 |
ApplyUserName | 提交者姓名 |
ApplyUserId | 提交者userid |
ApplyUserParty | 提交者所在部门 |
ApplyUserImage | 提交者头像 |
ApprovalNodes | 审批流程信息 |
ApprovalNode | 审批流程信息,可以有多个审批节点 |
NodeStatus | 节点审批操作状态:1-审批中;2-已同意;3-已驳回;4-已转审 |
NodeAttr | 审批节点属性:1-或签;2-会签 |
NodeType | 审批节点类型:1-固定成员;2-标签;3-上级 |
Items | 审批节点信息,当节点为标签或上级时,一个节点可能有多个分支 |
Item | 审批节点分支,当节点为标签或上级时,一个节点可能有多个分支 |
ItemName | 分支审批人姓名 |
ItemUserid | 分支审批人userid |
ItemParty | 分支审批人所在部门 |
ItemImage | 分支审批人头像 |
ItemStatus | 分支审批审批操作状态:1-审批中;2-已同意;3-已驳回;4-已转审 |
ItemSpeech | 分支审批人审批意见 |
ItemOpTime | 分支审批人操作时间 |
NotifyNodes | 抄送信息,可能有多个抄送人 |
NotifyNode | 抄送人信息 |
ItemName | 抄送人姓名 |
ItemUserid | 抄送人userid |
ItemParty | 抄送人所在部门 |
ItemImage | 抄送人头像 |
ApproverStep | 当前审批节点:0-第一个审批节点;1-第二个审批节点…以此类推 |
源码
地址:https://gitee.com/wusuoweixgy/QiYeWeiXinCode
克隆:git clone https://gitee.com/wusuoweixgy/QiYeWeiXinCode.git
赞赏
如果您觉得文章还不错,那就请作者喝杯咖啡吧!