近期将出个系列讲解开发过程,同时作为此系统的开发记录吧,万能的博客园,本边讲解如何发送模板消息,并且能够定时发送,下一篇讲解如何处理多个公众号的网页授权登录问题

【后台】http://xiaoshuo.qqsiot.cn/manager

管理员账号:admin

渠道商账号:channel

代理商账号:agent

演示密码:123456

【前台】http://y6.qqsiot.cn

我的独立博客:http://www.yxxrui.cn

先讲一下系统的功能,整个系统总共有四种角色:管理员  ->  渠道商  ->  代理商  ->  读者

【管理员】管理员拥有最高权限。可以发布通知公告(不同可见度的通知)、查看整个平台数据统计、订单明细、管理小说分类、管理小说、管理章节、管理渠道商、管理员管理、处理渠道打款、修改个人资料、修改密码、清空数据库、安全域名自动配置,每个渠道商拥有一个专属的子域名,支付域名也单独拿出来,防微信封杀功能、导入ApiKey设置与刷新、;

【渠道商】查看公告,本渠道的数据统计、读者统计、订单明细、定时群发微信模板消息、查看小说、查看章节、内容、推广小说、文案编辑、复制链接、推广首页、当前渠道商的代理商管理、我的结算单、处理代理打款事项、查看所有读者、读者充值记录、公众号设置、关键字回复、创建微信自定义菜单、自定义关注章节、简易扫码支付(减少有风险环境下无法支付的问题)、修改个人资料、修改密码等;

【代理商】查看公告、本代理的数据统计、用户统计、订单统计、查看小说、查看章节、内容、推广小说、文案编辑、复制链接、推广首页、我的结算单、修改个人资料、修改密码等;代理商无需公众号即可赚钱。

【读   者】首页、搜索书库、男频、女频、排行、书库、分类、书签、历史记录、签到、首次阅读自动签到、签到自动回复客服消息、关注推送文章链接、关键字图文回复、分享赚书币(3次)、看书、充值书币、充值年费会员等。

前台(部分):

          

     

后台(部分):

批量导入工具:

还有一个配套的高级导入工具,选择一次,遍历所有文件夹中的小说,批量导入到系统中

定时发送模板消息,目前比较简单,在网站开始运行的时候,启动定时器,每隔x时间则检测一下是否有定时需要发送的模板消息:

public static void SetOndDayTimer()
{
//第一次开始的时间,两秒执行一次
DateTime startTime = DateTime.Now;
/*if (startTime < DateTime.Now)
startTime = startTime.AddDays(1.0);*/
TimeSpan delayTime = (startTime - DateTime.Now); TimeSpan intervalTime = new TimeSpan(0, 0, 0, 1); //1秒执行一次 // OnOndDayTimer为你每天需要调用的方法
TimerCallback timerDelegate = new TimerCallback(DealTask); // Create a timer that signals the delegate to invoke
myTimer = new System.Threading.Timer(timerDelegate, null, delayTime, intervalTime);
}
上边的源码中的DealTask为处理数据库中定时消息的方法,此方法从数据库读取数据,并且处理,代码如下:
private static bool _isBusy = false;//是否正在工作中
public static void DealTask(object obj)
{
if (_isBusy) return;
_isBusy = true;
TimerTaskBll timerTaskBll = new TimerTaskBll();
var tts = timerTaskBll.Gets(null, 1);
if (tts.Count < 1)
{
_isBusy = false;
return;
}
UserBll userBll = new UserBll();
foreach (var task in tts)
{
//先处理掉
timerTaskBll.FinishThis(task.TaskId);
List<User> users = null;//需要发送消息的所有用户
if (task.AgentId == null||task.AgentId==0)
{
if (task.UserId == null || task.UserId == 0)
{
users = userBll.Gets(null, null, null, null, null);
}
else
{
users = new List<User>();
users.Add(userBll.Get(task.UserId ?? 0));
}
}
else
{
if (task.UserId == null || task.UserId == 0)
{
//2017-06-30 可能需修改
users = userBll.Gets(task.AgentId, task.AgentId, null, null, null);
}
else
{
users = new List<User>();
User user = userBll.Get(task.UserId ?? 0);
if (user.BelongToAgentId == task.AgentId)
{
users.Add(user);
}
}
}
try
{
var wexinTool = new WxNorFactory(task.AgentId ?? 5);
foreach (var user in users)
{
var data = task.TaskValue.Replace("{nickname}", user.Nickname)
.Replace("{coinnum}", user.CoinNum.ToString());
wexinTool.SendTemplateMsg(user.Openid, task.TemplateId, task.ClickUrl, data);
}
}
catch
{
timerTaskBll.FinishThisWithError(task.TaskId);
} }
_isBusy = false;
}
主要思路就是先统计需要发送的用户,然后拿到每个用户的openid,最后给每个用户发送一条消息即可。
wexinTool.SendTemplateMsg(user.Openid, task.TemplateId, task.ClickUrl, data);此方法为最终发送模板消息的,直接将提交到微信服务器

上边的WxNorFactory类中包含了多公众号接口操作的所有方法,具体讲解关注我的博客园账号,下次写多个微信公众号网页授权、多域名技术、跨公众号支付

我刚发现手机上看不到博客评论,抱歉,答案在此:1420213383

最新文章

  1. JavaWeb_day03_员工信息添加修改删除
  2. Lind.DDD.SSO单点登陆组件的使用(原创)
  3. [转]ExtJS Grid 分页时保持选中的简单实现方法
  4. Eclipse开发环境设置(Maven+Spring MVC+Flex)
  5. Comparator
  6. hdu 4283 You Are the One 区间dp
  7. Bluetooth RFCOMM介绍
  8. Pike的安装(Ubuntu环境)
  9. jdk 1.6 &amp; 1.7新特性
  10. 也谈http中get和post
  11. javascript全局对象
  12. Java NIO学习笔记七 Non-blocking Server
  13. 总结一下现在关于Design Support Library的几个博客
  14. 深入 JAVA里面关于byte数组和String之间的转换问题
  15. ajax 小练习
  16. GUI学习之一——PyQt5初识
  17. 干净的ssm框架项目
  18. Android面试、开发之高手 编码规范与细节
  19. MySQL里面的子查询
  20. android--------Popupwindow的使用

热门文章

  1. Eclipse的环境配置
  2. iOS 百度地图使用详解
  3. 区块链V1版本实现之一
  4. 【常见踩坑】】USB调试安装失败(Installation failed with message INSTALL_CANCELED_BY_USER)
  5. android studio问题备注
  6. 自学linux——20.Samba服务器的搭建
  7. moviepy音视频开发专栏文章目录
  8. moviepy音视频剪辑:视频变换处理与内容相关的变换函数headblur、mask_and/or、mirror_x/y、rotate、painting、scroll介绍
  9. 图像处理术语解释:什么是PRGBA和Alpha预乘(Premultiplied Alpha )
  10. PyQt(Python+Qt)学习随笔:枚举类QTreeWidgetItem.ItemType、QListWidgetItem.ItemType的取值及含义