基于SqlServer实现微信推送消息
发布时间:2020-12-12 13:50:39 所属栏目:MsSql教程 来源:网络整理
导读:最近新上了一个项目,需要监控设备数据,增加一个报警功能。 短信要收费,邮件不方便,需要查看,微信是一个非常好的消息报警推送的手段。 微信目前不提供单独的用户推送消息接口,面向应用的话,就只有从订阅号、服务号、企业号当中选择一个。这里不在解释
最近新上了一个项目,需要监控设备数据,增加一个报警功能。 短信要收费,邮件不方便,需要查看,微信是一个非常好的消息报警推送的手段。 微信目前不提供单独的用户推送消息接口,面向应用的话,就只有从订阅号、服务号、企业号当中选择一个。这里不在解释这三个号的区别,请自行查看微信公众平台说明。 显然,企业号是一个比较好的选择。企业号的通讯录可以把公司所有人加入进来,并且划分部门。同时企业号还支持创建独立应用,应用相当于一个独立的群,可以对通讯录设定用户可见,实现群聊功能,同时也支持各种二次开发。 这里我的思路是首先把技术部的人员加入到企业号,然后创建一个项目应用,将预警信息推送到这个项目中,同时设置技术部可见。 1. 那么首先需要注册微信企业号。这里不在说明,请按照提示注册。实际使用发现,不认证(交300)也可以正常使用,用户上限受限制。 2. 然后在通讯录中创建技术部,加入技术人员信息(关联微信号),同时让他们关注企业号。 3. 在应用中心创建应用,设置可见范围技术部,启用回调模式,并获取Token,和EncodingAESKey。这里由于不需要处理交互消息,所以部在说明接口页面实现,我是直接把Senparc.Weixin.QY的Sample网站挂上去用了。当然想着把其中的Token,CorpID,EncodingAESKey这些换成自己企业号的。 4. 在设置-》权限管理->普通管理组中新建一个组。用来执行应用使用。(需要管理组的 Secret) 5. 使用VS2015新建项目,其他语言-Sqlserver-数据库项目。 6. 项目中右键,新建项,SQL CLR C# 存储过程。 7. 实现代码如下,测试代码,比较乱,见谅。 using System; using System.Data; using System.Data.SqlClient; using System.Data.SqlTypes; using Microsoft.SqlServer.Server; using System.Net; using System.Text; using System.Net.Security; using System.Security.Cryptography.X509Certificates; using System.IO; public partial class StoredProcedures { public static readonly string Token = "0Eh7xxxxxxxxxfPm";//与微信企业账号后台的Token设置保持一致,区分大小写。 public static readonly string EncodingAESKey = "pA4xxxxxxxxxxxwKzoP";//与微信企业账号后台的EncodingAESKey设置保持一致,区分大小写。 public static readonly string CorpId = "wx8exxxx7300";//与微信企业账号后台的EncodingAESKey设置保持一致,区分大小写。 public static readonly string CorpSecret = "N__IpQrxxxxxxxxxQxYGuaFw6DpGpM7dF0-K"; private static readonly string DefaultUserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)"; private static bool CheckValidationResult(object sender,X509Certificate certificate,X509Chain chain,SslPolicyErrors errors) { return true; //总是接受 } public static HttpWebResponse CreatePostHttpResponse(string url,string postData,Encoding charset) { HttpWebRequest request = null; //HTTPSQ请求 ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult); request = WebRequest.Create(url) as HttpWebRequest; request.ProtocolVersion = HttpVersion.Version10; request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; request.UserAgent = DefaultUserAgent; byte[] data = charset.GetBytes(postData); using (Stream stream = request.GetRequestStream()) { stream.Write(data,data.Length); } return request.GetResponse() as HttpWebResponse; } [Microsoft.SqlServer.Server.SqlProcedure] public static void SendWxMessage2Part (SqlString partid,SqlString message) { // 在此处放置代码 string access_token = GetAccess_Token(); string url = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=" + access_token; string postData = "{"touser":"","toparty": ""+ partid.ToString() + "","totag": "","msgtype": "text","agentid": 1,"text": {"content": ""+ message .ToString()+ ""},"safe":0}"; Encoding encoding = Encoding.GetEncoding("utf-8"); HttpWebResponse response = CreatePostHttpResponse(url,postData,encoding); } [Microsoft.SqlServer.Server.SqlProcedure] public static void SendWxMessage2User(SqlString userid,SqlString message) { // 在此处放置代码 string access_token = GetAccess_Token(); string url = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=" + access_token; string postData = "{"touser":""+ userid .ToString()+ "","toparty": "",encoding); } [Microsoft.SqlServer.Server.SqlProcedure] public static void SendWxMessage2Tag(SqlString tagid,"totag": ""+ tagid .ToString()+ "","text": {"content": "" + message.ToString() + ""},encoding); } public static string GetAccess_Token() { var url1 = string.Format("https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={0}&corpsecret={1}",CorpId,CorpSecret); Encoding encoding = Encoding.GetEncoding("utf-8"); HttpWebResponse response1 = CreatePostHttpResponse(url1,"",encoding); Stream stream1 = response1.GetResponseStream(); //获取响应的字符串流 StreamReader sr1 = new StreamReader(stream1); //创建一个stream读取流 string jsonText = sr1.ReadToEnd(); //从头读到尾,放到字符串html sr1.Close(); stream1.Close(); string access_token = jsonText.Substring(17,64); return access_token; } }8. 生成项目,到Debug下将dll文件复制到服务器上去。 9. 执行如下脚本,启用clr,然后配置一下权限,导入dll到程序集,然后定义对应的存储过程。 ---开启所有服务器配置选项 EXEC sp_configure N'show advanced options',N'1' RECONFIGURE WITH OVERRIDE --开启clr enabled 选项 EXEC sp_configure N'clr enabled',N'1' RECONFIGURE WITH OVERRIDE --关闭所有服务器配置选项 EXEC sp_configure N'show advanced options',N'0' RECONFIGURE WITH OVERRIDE --如果存在权限问题,执行下面一段脚本 alter database CloudPF set TRUSTWORTHY on EXEC sp_changedbowner 'sa' ALTER DATABASE CloudPF SET TRUSTWORTHY ON GO CREATE ASSEMBLY [Wx] AUTHORIZATION [dbo] FROM 'E:DATAMicrosoft SQL ServerCLRWx.Common.dll' WITH PERMISSION_SET = UNSAFE GO create proc dbo.SendWxMessage2Part (@partid nvarchar(200),@message nvarchar(2000)) AS ---sql c# clr 程序集文件名.类名.方法名 EXTERNAL NAME Wx.StoredProcedures.SendWxMessage2Part go create proc dbo.SendWxMessage2User (@userid nvarchar(200),@message nvarchar(2000)) AS ---sql c# clr 程序集文件名.类名.方法名 EXTERNAL NAME Wx.StoredProcedures.SendWxMessage2User go create proc dbo.SendWxMessage2Tag (@tagid nvarchar(200),@message nvarchar(2000)) AS ---sql c# clr 程序集文件名.类名.方法名 EXTERNAL NAME Wx.StoredProcedures.SendWxMessage2Tag go10. 在数据库可编程性下面,程序集和存储过程中,就能看到我们新加的C#的接口了。 11. 自行测试一下就好了?exec dbo.SendWxMessage2Part '2','ttttttt' 这样,partID在公众平台企业号管理里面修改那可以看到,具体自行查说明。 PS:这里说一下遇到的一些问题。 1. 微信的权限,需要确认管理组,应用两部分的通讯录的可见性,如果出现交叉,可能会存在权限问题,报82001的错误。 2. SqlClr在编译的时候平台选择要根据数据库来选择,如果是2012需要选3.5,2016才可以选4.0,具体可以自行尝试。 3. 数据库项目属性中的sqlserver平台要与实际平台一致。 4. vs2015自带的发布,除非是safe,不然无法发布成功,建议使用脚本自行将程序集导入数据库。 5. 里面没用其他的类库,之前试过使用Newtonsoft的类库,发现要自己导入一堆的dll,包括.net自带的dll,很麻烦,于是直接用字符串截取方法获取的access_token。这样任何三方dll都没用,只导入自己就好了。 6. 注意C#存储过程定义的时候,参数类型要用SQLString这样的专用类型,不然无法部署。 这样就可以直接在触发器或者存储过程,计划任务中直接发微信消息了,省去好多事。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- MySQL主从同步、读写分离配置步骤
- sql – 接收错误“函数中包含的Select语句无法将数据返回给
- SqlServer数据库全角转换成半角
- sql – numeric(38,0)作为主键列;好,坏,谁在乎?
- CQL(Cassandra)中是否有“IF EXISTS UPDATE ELSE INSERT”命
- f# – SqlDataConnection类型提供程序 – 使用脚本参数设置
- sql – 在多对多关系中查找具有完全匹配的记录
- sql-server – 使用Aggregate值连接表
- sqlserver 对比数据库表是否完全一致的简单方法
- sql-server-2008 – 开发人员是否有“最佳实践”类型的流程