基于SQLServer数据库实现微信推送消息
小标 2018-07-18 来源 : 阅读 2392 评论 0

摘要:本文主要向大家介绍了基于SQLServer数据库实现微信推送消息,通过具体的内容向大家展现,希望对大家学习SQLServer数据库有所帮助。

本文主要向大家介绍了基于SQLServer数据库实现微信推送消息,通过具体的内容向大家展现,希望对大家学习SQLServer数据库有所帮助。

最近新上了一个项目,需要监控设备数据,增加一个报警功能。
短信要收费,邮件不方便,需要查看,微信是一个非常好的消息报警推送的手段。
微信目前不提供单独的用户推送消息接口,面向应用的话,就只有从订阅号、服务号、企业号当中选择一个。这里不在解释这三个号的区别,请自行查看微信公众平台说明。
显然,企业号是一个比较好的选择。企业号的通讯录可以把公司所有人加入进来,并且划分部门。同时企业号还支持创建独立应用,应用相当于一个独立的群,可以对通讯录设定用户可见,实现群聊功能,同时也支持各种二次开发。
这里我的思路是首先把技术部的人员加入到企业号,然后创建一个项目应用,将预警信息推送到这个项目中,同时设置技术部可见。
1. 那么首先需要注册微信企业号。这里不在说明,请按照提示注册。实际使用发现,不认证(交300)也可以正常使用,用户上限受限制。
2. 然后在通讯录中创建技术部,加入技术人员信息(关联微信号),同时让他们关注企业号。
3. 在应用中心创建应用,设置可见范围技术部,启用回调模式,并获取Token,和EncodingAESKey。这里由于不需要处理交互消息,所以部在说明接口页面实现,我是直接把Senparc.Weixin.QY的Sample网站挂上去用了。当然想着把其中的Token,CorpID,EncodingAESKey这些换成自己企业号的。
4. 在设置-》权限管理->普通管理组中新建一个组。用来执行应用使用。(需要管理组的 Secret)
5. 使用VS2015新建项目,其他语言-Sqlserver-数据库项目。
6. 项目中右键,新建项,SQL CLR C# 存储过程。
7. 实现代码如下,测试代码,比较乱,见谅。

[csharp] view plain copy

1. using System;  

2. using System.Data;  

3. using System.Data.SqlClient;  

4. using System.Data.SqlTypes;  

5. using Microsoft.SqlServer.Server;  

6. using System.Net;  

7. using System.Text;  

8. using System.Net.Security;  

9. using System.Security.Cryptography.X509Certificates;  

10. using System.IO;  

11.   

12.   

13. public partial class StoredProcedures  

14. {  

15.     public static readonly string Token = "0Eh7xxxxxxxxxfPm";//与微信企业账号后台的Token设置保持一致,区分大小写。  

16.     public static readonly string EncodingAESKey = "pA4xxxxxxxxxxxwKzoP";//与微信企业账号后台的EncodingAESKey设置保持一致,区分大小写。  

17.     public static readonly string CorpId = "wx8exxxx7300";//与微信企业账号后台的EncodingAESKey设置保持一致,区分大小写。  

18.     public static readonly string CorpSecret = "N__IpQrxxxxxxxxxQxYGuaFw6DpGpM7dF0-K";  

19.   

20.   

21.     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)";  

22.   

23.   

24.     private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)  

25.     {  

26.         return true; //总是接受       

27.     }  

28.   

29.   

30.     public static HttpWebResponse CreatePostHttpResponse(string url, string postData, Encoding charset)  

31.     {  

32.         HttpWebRequest request = null;  

33.         //HTTPSQ请求    

34.         ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);  

35.         request = WebRequest.Create(url) as HttpWebRequest;  

36.         request.ProtocolVersion = HttpVersion.Version10;  

37.         request.Method = "POST";  

38.         request.ContentType = "application/x-www-form-urlencoded";  

39.         request.UserAgent = DefaultUserAgent;  

40.   

41.   

42.         byte[] data = charset.GetBytes(postData);  

43.         using (Stream stream = request.GetRequestStream())  

44.         {  

45.             stream.Write(data, 0, data.Length);  

46.         }  

47.         return request.GetResponse() as HttpWebResponse;  

48.     }  

49.   

50.   

51.     [Microsoft.SqlServer.Server.SqlProcedure]  

52.     public static void SendWxMessage2Part (SqlString partid, SqlString message)  

53.     {  

54.         // 在此处放置代码  

55.         string access_token = GetAccess_Token();  

56.         string url = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=" + access_token;  

57.         string postData = "{\"touser\":\"\",\"toparty\": \""+ partid.ToString() + "\",\"totag\": \"\",\"msgtype\": \"text\",\"agentid\": 1,\"text\": {\"content\": \""+ message .ToString()+ "\"},\"safe\":0}";  

58.         Encoding encoding = Encoding.GetEncoding("utf-8");  

59.   

60.   

61.         HttpWebResponse response = CreatePostHttpResponse(url, postData, encoding);  

62.     }  

63.     [Microsoft.SqlServer.Server.SqlProcedure]  

64.     public static void SendWxMessage2User(SqlString userid, SqlString message)  

65.     {  

66.         // 在此处放置代码  

67.         string access_token = GetAccess_Token();  

68.         string url = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=" + access_token;  

69.         string postData = "{\"touser\":\""+ userid .ToString()+ "\",\"toparty\": \"\",\"totag\": \"\",\"msgtype\": \"text\",\"agentid\": 1,\"text\": {\"content\": \""+ message .ToString()+ "\"},\"safe\":0}";  

70.         Encoding encoding = Encoding.GetEncoding("utf-8");  

71.   

72.   

73.         HttpWebResponse response = CreatePostHttpResponse(url, postData, encoding);  

74.     }  

75.     [Microsoft.SqlServer.Server.SqlProcedure]  

76.     public static void SendWxMessage2Tag(SqlString tagid, SqlString message)  

77.     {  

78.         // 在此处放置代码  

79.         string access_token = GetAccess_Token();  

80.         string url = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=" + access_token;  

81.         string postData = "{\"touser\":\"\",\"toparty\": \"\",\"totag\": \""+ tagid .ToString()+ "\",\"msgtype\": \"text\",\"agentid\": 1,\"text\": {\"content\": \"" + message.ToString() + "\"},\"safe\":0}";  

82.         Encoding encoding = Encoding.GetEncoding("utf-8");  

83.   

84.   

85.         HttpWebResponse response = CreatePostHttpResponse(url, postData, encoding);  

86.     }  

87.   

88.   

89.     public static string GetAccess_Token()  

90.     {  

91.         var url1 = string.Format("https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={0}&corpsecret={1}", CorpId, CorpSecret);  

92.         Encoding encoding = Encoding.GetEncoding("utf-8");  

93.         HttpWebResponse response1 = CreatePostHttpResponse(url1, "", encoding);  

94.         Stream stream1 = response1.GetResponseStream();   //获取响应的字符串流    

95.         StreamReader sr1 = new StreamReader(stream1); //创建一个stream读取流  

96.         string jsonText = sr1.ReadToEnd();   //从头读到尾,放到字符串html    

97.         sr1.Close();  

98.         stream1.Close();  

99.   

100.   

101.         string access_token = jsonText.Substring(17, 64);  

102.         return access_token;  

103.   

104.   

105.     }  

106.       

107. }  

8. 生成项目,到Debug下将dll文件复制到服务器上去。
9. 执行如下脚本,启用clr,然后配置一下权限,导入dll到程序集,然后定义对应的存储过程。

[sql] view plain copy

1. ---开启所有服务器配置选项  

2. EXEC sp_configure N'show advanced options', N'1'   

3. RECONFIGURE WITH OVERRIDE  

4. --开启clr enabled 选项  

5. EXEC sp_configure N'clr enabled', N'1'  

6. RECONFIGURE WITH OVERRIDE   

7. --关闭所有服务器配置选项  

8. EXEC sp_configure N'show advanced options', N'0'   

9. RECONFIGURE WITH OVERRIDE  

10. --如果存在权限问题,执行下面一段脚本  

11. alter database CloudPF set TRUSTWORTHY on  

12. EXEC sp_changedbowner 'sa'  

13.   

14.   

15. ALTER DATABASE CloudPF SET TRUSTWORTHY ON    

16. GO    

17. CREATE ASSEMBLY [Wx]    

18. AUTHORIZATION [dbo]    

19. FROM     

20. 'E:\DATA\Microsoft SQL Server\CLR\Wx.Common.dll'    

21. WITH PERMISSION_SET = UNSAFE    

22. GO  

23.   

24.   

25. create proc dbo.SendWxMessage2Part  

26. (@partid nvarchar(200),  

27. @message nvarchar(2000))  

28. AS   

29. ---sql c# clr 程序集文件名.类名.方法名  

30. EXTERNAL NAME Wx.StoredProcedures.SendWxMessage2Part  

31. go  

32.   

33.   

34. create proc dbo.SendWxMessage2User  

35. (@userid nvarchar(200),  

36. @message nvarchar(2000))  

37. AS   

38. ---sql c# clr 程序集文件名.类名.方法名  

39. EXTERNAL NAME Wx.StoredProcedures.SendWxMessage2User  

40. go  

41.   

42.   

43. create proc dbo.SendWxMessage2Tag  

44. (@tagid nvarchar(200),  

45. @message nvarchar(2000))  

46. AS   

47. ---sql c# clr 程序集文件名.类名.方法名  

48. EXTERNAL NAME Wx.StoredProcedures.SendWxMessage2Tag  

49. go  

10. 在数据库可编程性下面,程序集和存储过程中,就能看到我们新加的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这样的专用类型,不然无法部署。


这样就可以直接在触发器或者存储过程,计划任务中直接发微信消息了,省去好多事。

本文由职坐标整理并发布,了解更多内容,请关注职坐标SQL Server数据库频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程