游戏离线订阅功能实现
一、简要概述功能实现客户端发起的「订阅离线通知」请求。玩家离线后系统可按订阅类型推送微信/抖音小程序订阅消息例如体力恢复、现金相关、上线提醒。调用流程二、client向game服务进行离线消息推送订阅逻辑1、接收客户端订阅请求并向data持久化服务发信息进行存储并接受data服务传来的响应请求(1) 客户端发送订阅请求给game服务端(2) game验证之后向data传该用户订阅消息类型的信息进行持久化(3) data成功持久化之后发送一个结果请求game接收到请求后再将玩家订阅的状态写入到内存里面Tipgame使用位图进行存储存储类型为uint642、single服务进行消息通知的逻辑(1) game服务在离线的时候将PlayerId、用户名、订阅服务种类并根据计算消息推送的具体时间戳依次遍历发送请求传给single服务(2) single接收到game传过来的玩家离线订阅请求后将请求放入内存列表,根据推送时间进行排序(3) 定时器每秒遍历将到达时间戳的消息发送给玩家三、微信、抖音消息推送方法微信侧入口微信公众平台小游戏后台注册/登录主体创建或进入你们的微信小游戏开发设置里拿到AppIdAppSecret→ 对应single配置里的Wechat.AppId / AppSecret / Url换 token开通订阅消息后台选模板体力恢复、现金、上线提醒等拿到template_id→ 写进example/template/wechat_*.json的template_id客户端玩家勾选订阅 → 拿到该用户openid你们存成accountName并消耗一次订阅额度服务端access_tokentouser(openid)template_id→ 调subscribe/send抖音侧入口抖音开放平台小游戏创建/进入抖音小游戏应用拿到AppIdAppSecret→ 对应TikTok.AppId / AppSecret / Url开通订阅通知在后台申请模板拿到tpl_id客户端拉起订阅授权拿到用户open_id服务端access_tokenopen_idtpl_id→ 调subscribe_notification/.../notifyOpenID和玩家账号对应package internal type ITemplate interface { SendNotify(mgr IOfflineNotifyMgr, nowUnix int64) (err error) } type WechatTemplate struct { Touser string json:touser Template_id string json:template_id Miniprogram_state string json:miniprogram_state Lang string json:lang Data map[string]interface{} json:data } type WechatNotifyTokenRsp struct { ErrCode int json:errcode ErrMsg string json:errmsg } func (tpl *WechatTemplate) SendNotify(server *SingleServer, nowUnix int64, notifyData *pb.OfflineNotifyData) (err error) { if server nil { return errors.New(server nil) } if notifyData nil { return errors.New(notifyData nil) } tpl.Touser notifyData.AccountName var token string var expiretime int64 token, expiretime, err server.GetAccessToken(pb.OfflineNotifyPlatType_OfflineNotifyPlatType_WECHAT, nowUnix) if err ! nil { log.Error(get AccessToken fail, log.Int64(nowtime, nowUnix), log.Int64(id, int64(notifyData.UserId)), log.String(openid, notifyData.AccountName), log.Uint32(notifyType, notifyData.NotifyType), log.Int64(expiretime, expiretime), log.Err(err), ) return err } if token { return errors.New(token nil) } url : https://api.weixin.qq.com/cgi-bin/message/subscribe/send? access_token token var rsp *WechatNotifyTokenRsp rsp, err util.SendHttpReq[WechatTemplate, WechatNotifyTokenRsp](url, tpl) if err ! nil { log.Error(send http req fail, log.Err(err), log.String(openid, tpl.Touser)) return err } if rsp.ErrCode ! 0 { log.Error(send notify fail, log.Int(errorCode, rsp.ErrCode), log.String(errmsg, rsp.ErrMsg), log.Int64(nowtime, nowUnix), log.String(token, token), log.Int64(id, int64(notifyData.UserId)), log.String(openid, notifyData.AccountName), log.Uint32(notifyType, notifyData.NotifyType), ) return errors.New(send notify fail) } return nil } type TiktokTemplate struct { OpenId string json:open_id AccessToken string json:access_token AppID string json:app_id TplId string json:tpl_id Data map[string]interface{} json:data } type TiktokNotifyTokenRsp struct { ErrNo int64 json:err_no ErrTips string json:err_tips } https://developer.open-douyin.com/docs/resource/zh-CN/mini-game/develop/server/notify func (tpl *TiktokTemplate) SendNotify(server *SingleServer, nowUnix int64, notifyData *pb.OfflineNotifyData) (err error) { if server nil { return errors.New(server nil) } if notifyData nil { return errors.New(notifyData nil) } var expiretime int64 tpl.OpenId notifyData.AccountName tpl.AccessToken, expiretime, err server.GetAccessToken(pb.OfflineNotifyPlatType_OfflineNotifyPlatType_TIKTOK, nowUnix) if err ! nil { log.Error(get AccessToken fail, log.Int64(nowtime, nowUnix), log.Int64(id, int64(notifyData.UserId)), log.String(openid, notifyData.AccountName), log.Uint32(notifyType, notifyData.NotifyType), log.Int64(expiretime, expiretime), log.Err(err), ) return err } if tpl.AccessToken { return errors.New(token nil) } url : https://minigame.zijieapi.com/mgplatform/api/apps/subscribe_notification/developer/v1/notify var rsp *TiktokNotifyTokenRsp rsp, err util.SendHttpReq[TiktokTemplate, TiktokNotifyTokenRsp](url, tpl) if err ! nil { log.Error(send http req fail, log.Err(err), log.String(openid, tpl.OpenId)) return err } if rsp.ErrNo ! 0 { log.Error(send notify fail, log.Int64(errorCode, rsp.ErrNo), log.String(errTips, rsp.ErrTips), log.Int64(nowtime, nowUnix), log.String(token, tpl.AccessToken), log.Int64(id, int64(notifyData.UserId)), log.String(openid, notifyData.AccountName), log.Uint32(notifyType, notifyData.NotifyType), ) return errors.New(send notify fail) } return nil }

相关新闻

本科生必备AIGC工具:千笔AI与云笔AI对比评测

本科生必备AIGC工具:千笔AI与云笔AI对比评测

1. 项目概述:两款本科生友好的AIGC工具对比作为一名在数字创作领域摸爬滚打多年的老鸟,我最近被不少本科生朋友问到同一个问题:"有没有适合我们这种非技术背景使用的AI绘画工具?"经过深度测试市面上20余款工具后&#x…

2026/10/16 8:44:57 阅读更多 →
TM4C123 GPIO保护机制与寄存器配置详解:从锁存提交到功能复用

TM4C123 GPIO保护机制与寄存器配置详解:从锁存提交到功能复用

1. 项目概述与核心价值 在嵌入式开发的日常工作中,我们常常会听到“把某个引脚配置成GPIO输出,然后拉高”这样的简单指令。对于初学者或者使用高级HAL库的开发者来说,这背后可能只是一行函数调用。但当你真正深入到寄存器级别,尤其…

2026/10/17 3:54:52 阅读更多 →
2026年AI学术写作工具实测与深度评测

2026年AI学术写作工具实测与深度评测

1. 2026年AI论文写作工具实测全景报告作为一名在学术圈摸爬滚打十年的科研老狗,我完整经历了从Word手打到AI辅助的写作进化史。2026年的学术工具市场已经彻底重新洗牌,那些只会改语法的初级工具早就被淘汰出局。这次我自掏腰包测试了市面上23款标榜"…

2026/10/17 1:11:59 阅读更多 →

最新新闻

基于协同过滤的个性化电影推荐研究

基于协同过滤的个性化电影推荐研究

前言今天所阅读的这一个人, 是《电脑知识与技术》这本期刊在2019年的9月份所发表的一篇文章。这篇文章的标题叫做《基于的协同过滤算法的研究与应用实现》, 文章内容是关于协同过滤算法的一个研究与实际应用的呈现。摘要随着科学技术快速地发展, 并且知识产权变得日益重要, 绝大…

2026/10/18 6:33:52 阅读更多 →
Rust重写文字处理内核,开放AI可调用的文档处理库wordcraft实践

Rust重写文字处理内核,开放AI可调用的文档处理库wordcraft实践

最近在 GitHub 上看到一个很有意思的项目,叫 wordcraft,一句话概括就是:用 Rust 重写了一套兼容主流文档格式的文字处理内核,并且把编辑能力以库和接口的形式开放出来,让 AI Agent 可以直接调用。这个方向的想象力很大…

2026/10/18 6:33:52 阅读更多 →
Claude Code权限配置实战:用启动参数与规则告别确认弹窗,实现批量重构自动化

Claude Code权限配置实战:用启动参数与规则告别确认弹窗,实现批量重构自动化

用 Claude Code 做批量重构之前,我以为最大的成本是模型“理不理解需求”。真正上手之后才发现,成本是终端里一个接一个的确认弹窗:改一个文件弹一次,跑一条命令再弹一次,有时候同一个操作还会被拆成两次确认。本来是几…

2026/10/18 6:33:52 阅读更多 →
OpenClaw龙虾养殖指南精读:参数化养殖与水质管理实操

OpenClaw龙虾养殖指南精读:参数化养殖与水质管理实操

简介:面向AI从业者、开发者和普通用户的OpenClaw入门指南,以2026年初爆火的开源自主智能体项目为对象,系统讲解其产品定位、出圈原因、整体架构、Agent调度层、通讯层、记忆系统、技能工具链与运行流程,并覆盖国内平替、安全挑战和…

2026/10/18 6:33:52 阅读更多 →
Python 如何统一处理不同复权方式的 K 线?从 Pandas 数据处理到 QuantDash API 实战

Python 如何统一处理不同复权方式的 K 线?从 Pandas 数据处理到 QuantDash API 实战

一句话结论: 统一处理不同复权方式的 K 线,关键不是简单地把多个 DataFrame 拼在一起,而是明确价格口径、统一数据结构,并确保指标计算和回测使用的价格序列具有一致的复权规则。 摘要 在 Python 量化开发中,同一只股…

2026/10/18 6:33:52 阅读更多 →
跨境电商前端HTML模板:多语言多币种可落地骨架

跨境电商前端HTML模板:多语言多币种可落地骨架

简介:这是一套面向前端初学者与电商项目开发者的跨境电商网站前端模板代码,基于HTMLCSSJS构建,可快速搭建具备商品展示、购物车、响应式布局等基础功能的电商页面。资源共188个文件,包含26个结构清晰的HTML页面、7个核心CSS样式表…

2026/10/18 6:32:52 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →