尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
游戏离线订阅功能实现
一、简要概述功能实现客户端发起的「订阅离线通知」请求。玩家离线后系统可按订阅类型推送微信/抖音小程序订阅消息例如体力恢复、现金相关、上线提醒。调用流程二、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 }
RELATED

相关推荐

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

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

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

📅 2026/9/16 16:14:30
线下资金车手视角下 AI 语音钓鱼全链路风险与智能检测防御研究

线下资金车手视角下 AI 语音钓鱼全链路风险与智能检测防御研究

摘要 本文以 2026 年 7 月韩国 SBS 曝光的出租车司机识破语音钓鱼取现车手、协助警方抓获涉案人员案件为核心实证样本,系统拆解 AI 语音钓鱼黑产分层组织架构、线下资金中转 “车手” 运作模式、跨环节犯罪闭环流程。案件涉案车手累计 7 次为诈骗团伙转移赃款 7750 …

📅 2026/8/22 18:38:28
ARM Cortex-M3 NVIC中断机制深度解析与Stellaris实战指南

ARM Cortex-M3 NVIC中断机制深度解析与Stellaris实战指南

1. 项目概述:为什么我们需要深入理解NVIC? 在嵌入式系统开发,尤其是基于ARM Cortex-M3内核的项目中,中断是保障系统实时性的生命线。想象一下,你正在编写一个电机控制程序,主循环正平稳地执行着速度计算&am…

📅 2026/8/22 18:38:28
MORE NEWS

更多资讯

📰

使用 Lingo CLI 实现 Markdown 内容本地化:frontmatter 字段翻译与 push/pull 工作流实战

使用 Lingo CLI 实现 Markdown 内容本地化:frontmatter 字段翻译与 push/pull 工作流实战 【免费下载链接】replexica Open-source localization engineering tools. Connects to Lingo.dev localization engineering platform for consistent, quality translation…

📰

Basilisk航天仿真框架:可编程、可审计的高保真动力学内核

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

📰

k-skill seoul-weather-risk 行政洞解析设计:如何把「행정동 이름 + 자연어」确定性转换为 ASK Seoul 的 place_id

k-skill seoul-weather-risk 行政洞解析设计:如何把「행정동 이름 자연어」确定性转换为 ASK Seoul 的 place_id 【免费下载链接】k-skill 한국인을 위한 스킬 모음집 - 에이전트를 한국인으로 项目地址: https://gitcode.com/GitHub_Trending/ks/k-skill 本…

📰

Notepad-- 跨平台文本编辑器指南:如何在 Windows、Linux、macOS 上三步搞定中文编码与文件对比

Notepad-- 跨平台文本编辑器指南:如何在 Windows、Linux、macOS 上三步搞定中文编码与文件对比 【免费下载链接】notepad-- 一个支持windows/linux/mac的文本编辑器,目标是做中国人自己的编辑器,来自中国。 项目地址: https://gitcode.com/…

📰

AI-Infra-Guard mcp-scan 报告格式化提示词深度解析:format_report 模板的设计、调用链与落地实践

AI-Infra-Guard mcp-scan 报告格式化提示词深度解析:format_report 模板的设计、调用链与落地实践 【免费下载链接】AI-Infra-Guard A full-stack AI Red Teaming platform securing AI ecosystems via Agent Scan, Skills Scan, MCP scan, AI Infra scan and LLM j…

📰

通达信主力建仓指标源码解析与实战优化

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

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬