登录https://mp.weixin.qq.com/ 后,在公众平台后台管理页面 – 开发者中心页,点击“修改配置”按钮,填写URL、Token和EncodingAESKey,其中URL是开发者用来接收微信服务器数据的接口URL。Token可由开发者可以任意填写,用作生成签名(该Token会和接口URL中包含的Token进行比对,从而验证安全性)。EncodingAESKey由开发者手动填写或随机生成,将用作消息体加解密密钥。同时,开发者可选择消息加解密方式:明文模式、兼容模式和安全模式。模式的选择与服务器配置在提交后都会立即生效,请开发者谨慎填写及选择。加解密方式的默认状态为明文模式,选择兼容模式和安全模式需要提前配置好相关加解密代码,详情请参考消息体签名及加解密部分的文档。
上图说的这个URL就是微信公众平台服务器后台和我们二次开发的网站后台的通信地址,所有微信方向我们二次开发的站网通信都由这个地址来完成,所以这里我建议使用.net 的一般处理程序ashx页面来做这个通信页面。
Token就是这个通信验证的钥匙,必须为英文或数字,长度为3-32字符。
微信公众平台服务器后端会提交 4个参数到我们的ashx页面,我们的ashx就要完成安全验证。安全验证的方式是sha1加密
此外请注意,微信公众号接口只支持80接口。通信方式为Get
OK,我们来说说具体的代码
Dim Token As String = "arctichome"
Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
Dim httpMethod As String = context.Request.HttpMethod.ToUpper()
If httpMethod = "GET" Then
context.Response.ContentType = "text/plain"
Dim echoStr As String = context.Request("echoStr")
If Not String.IsNullOrEmpty(echoStr) Then
Dim signature As String = context.Request.QueryString("signature") ' 微信加密签名
Dim timestamp As String = context.Request.QueryString("timestamp") ' 时间戳
Dim nonce As String = context.Request.QueryString("nonce") ' 随机数
echoStr = context.Request.QueryString("echostr") ' 随机字符串
' 微信请求参数非空验证
If Not String.IsNullOrEmpty(signature) AndAlso Not String.IsNullOrEmpty(timestamp) AndAlso Not String.IsNullOrEmpty(nonce) AndAlso Not String.IsNullOrEmpty(echoStr) Then
If CheckSignature(signature, timestamp, nonce, Token) Then
context.Response.Write(echoStr) '验证通过,响应微信公众平台后台服务器
Exit Sub
End If
End If
End If
End If
End Sub
Token验证通过后马上就对微信公众平台的后台服务进行响应,对这个响应时间微信方要求是速度是很快的。
那对Sha1加密进程如下:
Public Function CheckSignature(ByVal signature As String, ByVal timestamp As String, ByVal nonce As String, ByVal WeiXinToken As String) As Boolean
Dim stringList As New List(Of String)() From {WeiXinToken, timestamp, nonce}
' 字典排序
stringList.Sort()
Return Sha1Encrypt(String.Join("", stringList)) = signature
End Function
''' <summary>
''' 对字符串SHA1加密
''' </summary>
''' <param name="targetString">源字符串</param>
''' <returns>加密后的十六进制字符串</returns>
Private Function Sha1Encrypt(ByVal targetString As String) As String
Dim byteArray As Byte() = Encoding.[Default].GetBytes(targetString)
Dim hashAlgorithm As HashAlgorithm = New SHA1CryptoServiceProvider()
byteArray = hashAlgorithm.ComputeHash(byteArray)
Dim stringBuilder As New StringBuilder()
For Each item As Byte In byteArray
stringBuilder.AppendFormat("{0:x2}", item)
Next
Return stringBuilder.ToString()
End Function
以上就是这个VB.net 对微信公众平台的Token验证过程。