企业微信开发实战(六、自建应用-审批流程引擎之配置可信任域名、创建审批模版、发起审批)

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

赞赏

​ 如果您觉得文章还不错,那就请作者喝杯咖啡吧!
在这里插入图片描述

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值