验证消息真假
由于HTTP服务在网路世界是公开的,因此第三方可以按照微信消息格式,向Foxtable端的HTTP服务提交虚假的微信消息。
所以对于非常注重安全的系统,有必要验证消息是否来自微信服务器。
方法和接入验证是一样的,不管是get方式还是post方式,微信服务器都都会包括signature、timestamp、nonce和echostr等4个用于真实性验证的参数。
微信服务器在进行接入验证的时候,是用get方式访问Foxtable端的HTTP服务,提交消息的时候,用的则是Post方式。
我们之前只对接入提供了验证,如果要加上消息的真伪验证,只需将代码改为:
Select
Case e.path
Case "wefox"
If
Functions.Execute("VerifySignature",e)
= False Then
'如果验证失败,直接返回
Return
End
If
If e.Request.HttpMethod
= "GET"
e.WriteString(e.GetValues("echostr"))
ElseIf e.Request.HttpMethod
= "Post"
Dim
xo As
Foxtable.XObject =
Foxtable.XObject.Parse(e.PlainText)
Dim st
As New
Date(1970,1,1,8,0,0)
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")
dr.Save()
End
Select
End
If
End
Select
需要注意的是,本节接下来的例子,都只会对接入进行验证,而不会验证消息真伪。
此外如果开启了安全模式,消息的收发都将采用密文形式,此时就没必要验证消息的真实性了,因为伪造的消息肯定无法正常解密。