在微信开发中,我一直强调需要建立一个比较统一的Web API接口体系,以便实现数据的集中化,这样我们在常规的Web业务系统,Winform业务系统、微信应用、微信小程序、APP等方面,都可以直接调用基于JSON数据格式的Web API接口,在我之前的几篇随笔中,对这方面都有一定的介绍,本篇继续这个主题,细致深入的阐述如何在接口和源码的基础上整合Web API、微信后台管理及前端微信小程序的应用方案。
1、基于Web API的微信开发框架
首先我们各个业务模块,都应该围绕着Web API进行展开,如果是都部署在同一个服务器或者局域网内的系统,考虑到开发的复杂性,退而求其次,也可以基于同一个数据库进行开发。
总体而言,我们是以Web API为核心进行的应用框架构建的,如下图所示。
在项目场景中,我们这里的微信后台管理系统,是一个独立维护微信后台数据的管理系统,对于操作微信相关API所需要的接口调用凭证(token),我们可以通过Web API接口获得,这样保证各个平台(如Winform界面、其他Web界面),操作的接口token都保持一致
而后台管理系统,我们通过下面的来了解整体功能,整个后台管理系统使用了Bootstrap的框架进行前端处理。
2、整合Web API、微信后台管理及前端微信小程序应用
首先我们在Web API平台上,创建一个AccountController的MVC控制器来提供对应的API接口,实现对账号相关的信息查询,接口访问凭证的获取等业务。
/// <summary>
/// 微信公众号、小程序、企业号的账号配置
/// </summary>
public class AccountController : BusinessController<Account, AccountInfo>
然后增加获取token的方法
/// <summary>
/// 获取公众号/企业号/小程序操作的访问令牌AccessToken
/// </summary>
/// <param name="accountId">账号ID</param>
/// <returns></returns>
[HttpGet]
public string GetAccessTokenByAccount(string accountId)
{
var result = MyMemoryCache.GetAccessTokenByAccount(accountId);
return result;
}
这个token的生成,是存储在内存缓存里面的,定期刷新的,这样我们可以避免频繁的请求接口凭证token,可以统一生成给各个业务系统使用 。
/// <summary>
/// 获取公众号(或企业号)操作的访问令牌AccessToken
/// </summary>
/// <param name="accountId">账号ID</param>
/// <returns></returns>
public static string GetAccessTokenByAccount(string accountId)
{
var key = string.Format("{0}_{1}", System.Reflection.MethodBase.GetCurrentMethod().Name, accountId);
var token = MemoryCacheHelper.GetCacheItem<string>(key, delegate()
{
string result = "";
AccountInfo info = MyMemoryCache.GetAccountByID(accountId);
if (info != null)
{
if (info.AccountType == AccountType.企业号.ToString())
{
// 获取微信企业号操作的访问令牌AccessToken
ICorpBasicApi baseBLL = new CorpBasicApi();
result = baseBLL.GetAccessToken(info.CorpID, info.CorpSecret);
}
else
{
//小程序、订阅号、服务器号共享一个逻辑
// 获取微信操作的访问令牌AccessToken
WHC.Weixin.Interface.IBasicApi baseBLL = new WHC.Weixin.API.BasicApi();
result = baseBLL.GetAccessToken(info.AppID, info.AppSecret);
}
}
return result;
},
new TimeSpan(0, 5, 0)//5分钟过期
);
return token;
}
解决了token的统一生成和存储外,我们就可以在各个不同的系统中使用这个token 接口获取并使用来操作微信对应接口了。
//客户端调试和服务端应用统一采用一个AccessToken的方式
//避免客户端测试的时候,替换更新了服务端的AccessToken,从而导致服务端的AccessToken无效。
HttpHelper helper = new HttpHelper();
var tokenWebSiteUrl = string.Format("https://www.youdomain.com/api/Framework/Account/GetAccessTokenByAccount?accountId={0}", accountId);
var result = helper.GetHtml(tokenWebSiteUrl);
if(!string.IsNullOrEmpty(result))
{
result = result.Trim('"');
}
Console.WriteLine("通过Web API 获取到的Token为:" + result);
this.token = result;
关于微信后台管理系统,这个是对微信相关数据,如账号配置、菜单、事件、权限控制、业务数据定义等方面的综合管理,通过基于Bootstrap的MVC的技术进行Web端的数据维护,如下界面所示。
系统登录后,通过水平菜单进行后台功能管理。
系统支持多微信账号的接入管理和使用,同时支持订阅号、公众号、企业号、小程序的账号配置。
在系统中管理菜单,并通过把菜单提交到服务器上,实现菜单的动态配置和生成,能够为我们系统适应各种的需要,实现灵活的处理。
在微信服务账号的门户上,菜单的表现效果如下所示。
为了更有效管