当咱们须要结合企业微信和业务系统的时候,咱们须要创建一个企业微信应用,而后在微信管理后台中绑定对应参数,这样能够利用企业微信的服务端API对接相关的功能,包括提交菜单,以及获取对应的企业微信组织机构、发送消息等常规操做;而业务系统则能够把对应的业务流程和企业微信进行对接,包括消息的推送,以及利用JSSDK对相关业务数据的展现和处理等。本篇随笔介绍在利用企业微信前的相关处理步骤,如建立企业应用,绑定企业应用信息,以及相关的业务处理交互等。html
首先咱们须要注册申请一个企业微信的帐号,注册申请须要提交相关的企业资质信息,这里就再也不赘述。小程序
有了企业微信帐号后,咱们扫码进入企业微信的管理后台,在【应用与小程序】模块中建立一个应用,这个就是咱们对应的业务应用了,企业微信能够建立多个不一样场景的业务应用,其自己也自带了不少相关的应用在里面。微信
建立应用,咱们须要录入相关的应用信息和Logo图标信息,以下界面所示。session
例如我建立的一个企业微信应用,咱们记住它的应用ID和它的秘钥,这个是一个很重要的信息,须要绑定在微信系统里面,咱们后面对相关的企业微信服务端API接口调用,都须要利用到这些参数的。app
若是咱们的企业微信应用设计到支付信息的,须要打开企业支付的应用得到对应的秘钥信息的,以下所示。post
打开【企业支付】就能够看到支付对应的密钥了,这个很重要,如咱们须要利用企业微信发送红包或者直接付款给员工的时候,这个就须要用到了,如我前面随笔介绍的《企业微信支付的发送红包及相关接口使用》微信支付
在企业微信后台建立对应的应用,并得到对应的应用ID、密钥等信息后,咱们能够在微信后台管理系统里面录入咱们得到的应用信息了。ui
通常来讲,微信后台管理系统可以管理不一样类型:公众号、企业微信、小程序等类型的帐号信息,咱们在对应的分类里面录入相关的企业应用信息,以下录入界面所示。url
有了这些对应的信息后,咱们能够对企业微信应用编辑相关的菜单信息,而后经过接口提交到微信服务端上去,这样咱们的应用就具备了咱们自定义的业务菜单了,以下是微信管理系统里面对菜单的管理。spa
菜单列表管理界面以下所示。
这样配置好菜单并设置了相关的处理事件或者对应的JSSDK页面路径后,咱们就能够提交到服务端上去,立刻就能够看到企业应用的菜单变化了。
以上就是实际应用的菜单界面效果,这样咱们企业应用就有了相关的处理入口了,有些是扫码事件,有些是自定义事件,有些则是JSSDK编写的业务入口,如资产录入、盘点任务等。
有了具体的菜单入口,咱们须要处理咱们入口的处理逻辑了,若是是扫码,咱们须要在后台进行必定的事件响应,如在资产查看里面扫码后发送一个文本信息,供跳转到相关的查看资产信息界面上去。
在以前随笔介绍过对这些事件的处理,如《C#开发微信门户及应用(21)-微信企业号的消息和事件的接收处理及解密》,若是须要了解企业微信发送消息的过程,能够参考下《企业微信发送应用消息的实现》随笔的介绍便可。
例如对于扫码入口,企业微信的后台对这些事件进行捕捉,并匹配到对应的处理模块上去处理,以下代码所示。
/// <summary> /// 扫码推事件且弹出“消息接收中”提示框的事件推送的处理 /// </summary> /// <param name="info">扫描信息</param> /// <returns></returns> public string HandleEventScancodeWaitmsg(RequestEventScancodeWaitmsg info, AccountInfo accountInfo) { string result = ""; try { var handler = AutoFactory.Instatnce.Container.Resolve<IQRCodeHandler>(); if (handler != null) { result = handler.HandleScancodeWaitmsg(info, accountInfo); } } catch (Exception ex) { LogHelper.Error(ex); } return result; }
经过 AutoFactory.Instatnce.Container.Resolve<IQRCodeHandler>(); 咱们能够看到业务的流程调整到了IOC的一个配置处理模块上去了,这里利用了Autofac的配置信息自动加载对应的处理模块。
对于扫码处理逻辑,咱们显示根据资产信息,构建一个文本消息发给企业微信客户端,而后引导用户打开响应的链接就能够跳转到对应的资产信息查看界面上去了,以下所示。
/// <summary> /// 处理扫码结果 /// </summary> /// <param name="info"></param> /// <returns></returns> private string HandleScanResult(RequestEventScanCode info, AccountInfo accountInfo) { ResponseText response = new ResponseText(info); if (info.ScanCodeInfo != null) { response.Content = string.Format("您的信息为:{0},能够结合后台进行数据查询。", info.ScanCodeInfo.ScanResult); var isUrl = ValidateUtil.IsURL(info.ScanCodeInfo.ScanResult); if (!isUrl) { string assetcode = info.ScanCodeInfo.ScanResult; if (!string.IsNullOrEmpty(assetcode)) { response.Content = ConvertAssetInfo(info, accountInfo, assetcode); } else { response.Content = string.Format("扫码内容为空。"); } } } var result = response.ToXml(); return result; } /// <summary> /// 转换资产信息为文本消息 /// </summary> /// <returns></returns> private string ConvertAssetInfo(RequestEventScanCode info, AccountInfo accountInfo, string assetcode) { StringBuilder sb = new StringBuilder(); BLLFactory<Asset>.Instance.SetConfigName("workflow"); var assetInfo = BLLFactory<Asset>.Instance.FindByCode(assetcode); if (assetInfo != null) { //~资产代码~、资产名称、管理部门、使用部门、使用人、存放地点、数量、资产动态、在用类型 sb.AppendFormat("资产代码:{0}", assetInfo.Code).Append("\n"); sb.AppendFormat("资产名称:{0}", assetInfo.Name).Append("\n"); sb.AppendFormat("管理部门:{0}", assetInfo.ChargeDept).Append("\n"); sb.AppendFormat("使用部门:{0}", assetInfo.CurrDept).Append("\n"); sb.AppendFormat("使用人:{0}", assetInfo.UsePerson).Append("\n"); sb.AppendFormat("存放地点:{0}", assetInfo.KeepAddr).Append("\n"); sb.AppendFormat("数量:{0}", assetInfo.Qty).Append("\n"); sb.AppendFormat("资产动态:{0}", assetInfo.Status).Append("\n"); sb.AppendFormat("在用类型:{0}", assetInfo.UseType).Append("\n"); sb.AppendFormat("<a href='{0}/QyH5/AssetInfo?code={1}' >点击查看详细信息</a>", WebsiteDomain, assetInfo.Code); } else { sb.AppendFormat("资产代码【{0}】不存在。", assetcode).Append("\n"); sb.AppendFormat("<a href='{0}/QyH5/Asset?devicecode={1}' >点击添加设备信息</a>", WebsiteDomain, assetcode); } return sb.ToString(); }
其余的部分入口是经过编写JSSDK页面的方式实现业务数据的处理的,在JSSDK编写里面,咱们有时候须要获取当前登陆的用户身份信息,如企业微信的userid,那么咱们就能够经过跳转的方式获取code,而后根据对应的code解析为userid便可。
//获取企业微信帐号信息 var accountInfo = GetAccount(ConfigData.CorpAccountNo); //若是传入了userid,使用传入的参数 if (string.IsNullOrEmpty(userid)) { //经过重定向的code获取对应的UserId userid = GetUserId(accountInfo.AppID, accountInfo.AppSecret); }
而为了不反复的解析code参数致使出错(code只能被用一次,后续再用会出错的),那么咱们能够把用户的userid存放在session里面,这样判断若是这个Session不存在了,咱们再解析code就没问题了。
/// <summary> /// 根据当前的Code获取对应的openid(获取获取openid的参数) /// </summary> /// <param name="accountInfo">登录帐号信息</param> /// <returns></returns> protected virtual string GetUserId(string appid, string appsecret) { string userId = Request.QueryString["userid"]; if (string.IsNullOrEmpty(userId)) { var user_id = Session["user_id"]; if (user_id != null) { userId = user_id.ToString(); } else { //若是没有传递userId,那么就根据code参数获取userId string code = Request.QueryString["code"]; if (!string.IsNullOrEmpty(code)) { string accessToken = baseApi.GetAccessToken(appid, appsecret); var result = baseApi.GetUserInfo(accessToken, code); if (result != null) { userId = result.UserId; Session["user_id"] = userId;//存储在Session } } } } return userId; }
下面是一个资产信息录入的界面效果,利用JSSDK进行编写的页面。
其中的一些选择框,咱们能够填写相关的字典数据,或者列表信息供选择。
这些数据最终能够提交到业务管理系统里面,从而实现了企业微信和业务管理系统的数据流对接。
还有一个如盘点任务同样的工做,咱们能够交给企业微信端进行处理,经过手机进行移动端的数据处理,更加方便。
以上就是企业微信和业务管理系统的交互过程的一部分,咱们具体能够根据本身的业务须要,扩展不少相关的处理页面。
经过整合企业微信和业务系统的数据流,咱们能够更加方便的了解企业业务信息,也更加方便的利用手机终端进行一些快捷的查询或者处理业务操做。