加密解密消息
要学习本节内容,必须有正式的微信公众号。
测试号只有明文模式,正式的公众号可以用选择明文模式还是安全模式收发消息:
需要说明的是,安全模式是针对回调方式(包括消息和事件),我们只需调整Foxtable端的HttpRequest事件代码,对消息进行加密或解密,而主动发送消息的代码不需要做任何调整。
关于微信消息的加密和解密,请参考:
https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Message_encryption_and_decryption_instructions.html
我们已经将腾讯提供的C#算法代码编译成DLL,并整合在Foxtable中,命名空间为"Tencent.WXBizMsgCrypt",如果你熟悉用.net进行微信开发,你可以直接调用。
但是对多数用户来说,直接使用封装在DLL总的函数进行加解密还是比较麻烦的,我个人就曾经因为一个参数顺序问题,浪费了一个多小时。
为方便普通用户的使用,我们另外提供了一个类WXBizCrypt,将相关方法进行了简写,请参考:WXBizCrypt类
定义WXBizCrypt的语法为:
Dim wbiz As New WXBizCrypt(AppId, Token, EncodingAESKey)
AppId | 公众号的的开发者ID。 |
Token | 上图中指定的Token。 |
EncodingAESKey | 上图中指定的EncodingAESKey。 |
一个示例
下面是安全模式下HttpRequest事件的一个简单示例,包括对收到消息的解密,以及对要发送消息的加密:
Select
Case e.path
Case
"wefox"
If e.Request.HttpMethod
= "GET"
If
Functions.Execute("VerifySignature",e)
Then
e.WriteString(e.GetValues("echostr"))
End If
ElseIf
e.Request.HttpMethod
= "Post"
'
Dim
wbiz As New
WXBizCrypt("wxdd6b45ebecd2f81e","foxtable","1f3JudIWHWXTkFa880d1ZXOVbVsZParNEj4uI15wfF6")
Dim st
As New
Date(1970,1,1,8,0,0)
Dim msg
As String =
wbiz.DecryptMsg(e)
'解密收到的消息
If
IsNumeric(msg)
Then '如果解密失败
Dim
err As String
= wbiz.GetErorDesc(CInt(msg))
'获取错误描述
Return
End
If
Dim
xo As
Foxtable.XObject
= Foxtable.XObject.Parse(msg)
Select Case
xo("MsgType")
Case "text","image","voice","video","shortvideo"
Dim
dr As
DataRow = DataTables("Message").AddNew()
dr("FromUserName")
= xo("FromUserName")
dr("CreateTime")
= st.AddSeconds(xo("CreateTime"))
dr("MsgType")
= xo("MsgType")
dr("MsgId")
= xo("MsgId")
dr("MediaId")
= xo("MediaId")
dr("ThumbMediaId")
= xo("ThumbMediaId")
dr("PicUrl")
= xo("PicUrl")
dr("Content")
= xo("Content")
dr("Format")
= xo("Format")
dr("Recognition")
= xo("Recognition")
'被动回复消息
Dim
so As
New Foxtable.XObject()
so("ToUserName")
= xo("FromUserName")
so("FromUserName")
= xo("ToUserName")
so("CreateTime")
= (Date.Now
- st).TotalSeconds()
so("MsgType")=
"text"
so("Content")
= "您好,我是Foxtable,今天是"
& Format(Date.Today,"yyyy年MM月dd日")
msg =
wbiz .EncryptMsg(e,so.ToXML
) '加密要发送的消息
If
IsNumeric(msg)
Then
'如果加密失败
Dim
err As
String = wbiz.GetErorDesc(CInt(msg))
'获取错误描述
Else
e.WriteString(msg)
End
If
End
Select
End
If
End
Select