中控服务器的设计
我们知道公众号可以通过AppID和AppSecret生成AccessToken,用于调用公众号接口的
身份验证凭据。
和企业号不同,公众号的AccessToken每刷新一次,都会返回不不同的结果,如果你有多个电脑处理微信业务,这将引发冲突,导致程序不稳定。
例如假定A电脑已经刷新并缓存了AccessToken(因为AccessToken一天只能获取2000次,所以必须缓存),在未来1个小时内都不再刷新AccessToken,而是直接使用缓存的AccessToken。
如果后来B电脑开始处理业务,于是B电脑刷新并缓存AccessToken,这将导致A电脑已经缓存的AccessToken失效,使得A电脑无法继续处理业务。
显然如果有多个电脑处理业务,只能由其中一台电脑负责刷新并缓存AccessToken,其它业务电脑都向此电脑查询获得AccessToken,这台统一负责刷新和缓存AccessToken的电脑,
称为中控服务器。
中控服务器的设计,你可以考虑以下三种方案之一:
以上说的是多个电脑处理微信业务,如果是同一台电脑的多个项目处理微信业务,一样需要将其中一个项目作为中控项目,统一负责AccessToken的刷新和缓存。
中控服务器(或中控项目)的设计非常简单,以第三种方案为例:
1、在中控服务器
(或中控项目)新建一个自定义函数,名称为GetAccessToken,用于刷新和缓存AccessToken,代码为:
Static
CreateTime As
Date
'记录最近一次生成access_token的时间
Static
AccessTocken As
String
'记录最近一次生成的access_token
Dim
AppId As
String=
"wx8acdb7df5beb68fd"
'开发者ID
Dim
AppSecret As
String =
"a5a3b06a790d4200a151e6b13c3dc263"
'开发者密匙
Dim
tp As
TimeSpan = Date.Now
- CreateTime
Dim
url As
String =
"https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}"
If
tp.TotalSeconds
> 3600 Then
Dim hc
As New
HttpClient(CExp(url,AppId,AppSecret))
Dim ret
As String =
hc.GetData()
If ret =
"" Then
'如果失败,再尝试一次
hc.GetData()
End If
CreateTime =
Date.Now()
Dim jo
As JObject =
JObject.Parse(ret)
If jo("errcode")
Is Nothing
Then
AccessTocken
= jo("access_token")
Else
MessageBox.show("获取access_token失败,原因:"
& vbcrlf
& jo("errmsg").ToString)
End
If
End
If
Return
AccessTocken
这个函数之前就已经存在,实际上设计中控服务器的代码,只是接下来第2步和第3步中的几行代码而已.
2、在中控服务器(或中控项目)开启HttpServer,在HttpRequest事件加上代码:
Select
Case e.path
Case "GetToken"
Dim
UserName As
String = e.PostValues("name")
Dim Password
As String =
e.PostValues("password")
'验证用户身份
e.WriteString(Functions.Execute("GetAccessToken"))
End
Select
3、其它业务电脑(或其它项目)可通过下面的代码获取AccessToken:
Dim
hc As
New HttpClient("http://127.0.0.1/GetToken/") '请改为中控服务器的实际IP
hc.FormData.Add("UserName","老三")
'添加用户名和密码
hc.FormData.Add("Password","888")
Dim
Token = hc.GetData
'获取AccessToken
MessageBox.Show(Token)
上面的代码采用了用户名和密码来避免AccessToken被非法获取,实际开发的时候,也可以采用字符串加密解密的方式保护AccessToken,或者两种方式都用。
关于字符串的加密和解密,可以参考:EncryptText