游戏离线订阅功能实现
一、简要概述功能实现客户端发起的「订阅离线通知」请求。玩家离线后系统可按订阅类型推送微信/抖音小程序订阅消息例如体力恢复、现金相关、上线提醒。调用流程二、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/7/23 16:05:39 阅读更多 →
TM4C123 GPIO保护机制与寄存器配置详解:从锁存提交到功能复用

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

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

2026/7/23 16:04:38 阅读更多 →
2026年AI学术写作工具实测与深度评测

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

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

2026/7/23 16:04:38 阅读更多 →

最新新闻

AI自动化实施失败真相(被高管忽视的3个底层逻辑)

AI自动化实施失败真相(被高管忽视的3个底层逻辑)

更多请点击: https://kaifayun.com 第一章:AI自动化实施失败真相(被高管忽视的3个底层逻辑) AI自动化项目在企业落地时,超68%未能达到预期ROI——不是技术不成熟,而是决策层对三个隐性系统性约束缺乏认知。…

2026/7/23 16:12:47 阅读更多 →
DP83848 RMII接口配置与实战:精简以太网PHY-MAC连接方案

DP83848 RMII接口配置与实战:精简以太网PHY-MAC连接方案

1. 项目概述:为什么我们需要RMII?在嵌入式网络设备的设计中,以太网物理层收发器(PHY)与媒体访问控制器(MAC)之间的接口选择,直接关系到硬件成本、PCB布局复杂度和系统性能。如果你设…

2026/7/23 16:12:47 阅读更多 →
API限流技术解析:从算法原理到生产实践

API限流技术解析:从算法原理到生产实践

1. API限流的核心价值与场景解析 当API接口面临突发流量时,系统往往会像早高峰的地铁站一样陷入瘫痪。我在实际工作中见过太多因为缺乏有效限流措施导致的惨案——某电商平台大促期间因未做接口限流,每秒10万的请求直接击穿数据库;某AI服务提…

2026/7/23 16:12:47 阅读更多 →
FPD-Link III远程I2C通信:时钟拉伸与BCC通道实战解析

FPD-Link III远程I2C通信:时钟拉伸与BCC通道实战解析

1. 项目概述与核心价值在汽车电子、工业视觉和高端显示系统里,我们常常遇到一个头疼的问题:一个主控制器(比如车机里的SoC或者工控机)需要去控制一个物理上离得很远的设备,比如安装在车尾的摄像头模组或者生产线上的图…

2026/7/23 16:12:47 阅读更多 →
《时光代理人》MV技术解析:实时渲染与音画同步全流程

《时光代理人》MV技术解析:实时渲染与音画同步全流程

时光代理人全新单曲「A Web of Lies」原版MV技术解析与创作幕后最近国产动画《时光代理人》发布了全新单曲「A Web of Lies」的原版MV,作为技术开发者,我们不仅能欣赏精彩的音乐和画面,更能从技术角度深入分析这部作品的制作工艺。本文将带你…

2026/7/23 16:12:47 阅读更多 →
B2B外贸询盘管理白皮书:询盘接收·智能回复·客户跟进全流程

B2B外贸询盘管理白皮书:询盘接收·智能回复·客户跟进全流程

摘要 B2B外贸询盘管理正在经历从"人工驱动"到"AI智能体驱动"的范式转移。据IDC发布的《2026年全球智能客服市场半年报》数据,2026年全球智能客服市场规模预计达186亿美元,年复合增长率58%。与此同时,Gartner 2026年企业采…

2026/7/23 16:11:47 阅读更多 →

日新闻

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

更多请点击: https://intelliparadigm.com 第一章:从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表) 当AI副业主理人不再仅满足于单次服务交付,而是主动构建可复用、可裂变、可…

2026/7/23 0:00:25 阅读更多 →
AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

更多请点击: https://codechina.net 第一章:AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析 在对2,346篇跨行业AI生成文案的A/B测试数据进行聚类分析后,我们发现&#xff1…

2026/7/23 0:01:26 阅读更多 →
Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具 【免费下载链接】chitchatter Secure peer-to-peer chat that is serverless, decentralized, and ephemeral 项目地址: https://gitcode.com/gh_mirrors/ch/chitchatter Chitchatter是一款革命性的安…

2026/7/23 0:01:26 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/22 8:58:19 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/22 19:43:43 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/22 12:54:44 阅读更多 →

月新闻