中控服务器的设计

我们知道公众号可以通过AppID和AppSecret生成AccessToken,用于调用公众号接口的 身份验证凭据。

和企业号不同,公众号的AccessToken每刷新一次,都会返回不不同的结果,如果你有多个电脑处理微信业务,这将引发冲突,导致程序不稳定。

例如假定A电脑已经刷新并缓存了AccessToken(因为AccessToken一天只能获取2000次,所以必须缓存),在未来1个小时内都不再刷新AccessToken,而是直接使用缓存的AccessToken。

如果后来B电脑开始处理业务,于是B电脑刷新并缓存AccessToken,这将导致A电脑已经缓存的AccessToken失效,使得A电脑无法继续处理业务。

显然如果有多个电脑处理业务,只能由其中一台电脑负责刷新并缓存AccessToken,其它业务电脑都向此电脑查询获得AccessToken,这台统一负责刷新和缓存AccessToken的电脑, 称为中控服务器。

中控服务器的设计,你可以考虑以下三种方案之一:

  1. 在中控服务器开启一个计划,每小时刷新一次AccessToken,将最新的Access保存在数据库中,其它电脑通过查询数据库获取AccessToken。
  2. 在中控服务器开启QQServer或UDPClient,其它电脑发送约定格式的字符串到中控服务器,由中控服务器返回GetAccessToken函数的执行结果。
  3. 在中控服务器开启HttpServer,其它电脑通过HttpClient发送访问请求到约定地址,由中控服务器返回GetAccessToken函数的执行结果。

以上说的是多个电脑处理微信业务,如果是同一台电脑的多个项目处理微信业务,一样需要将其中一个项目作为中控项目,统一负责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
Tokenhc.GetData '获取AccessToken
MessageBox
.Show(Token)

上面的代码采用了用户名和密码来避免AccessToken被非法获取,实际开发的时候,也可以采用字符串加密解密的方式保护AccessToken,或者两种方式都用。

关于字符串的加密和解密,可以参考:
EncryptText


本页地址:http://www.foxtable.com/mobilehelp/topics/0233.htm