EasyWeChat 小程序动态消息(Activity Message)开发指南:创建活动ID与实时更新消息
后端即时通讯【免费下载链接】easywechat 一个 PHP 微信 SDK项目地址https://gitcode.com/gh_mirrors/ea/easywechat点击查看免费下载导读本文是 EasyWeChat 微信 PHP SDK 中小程序动态消息Activity Message模块的完整实战指南。动态消息允许开发者发送一条可被多次更新的小程序消息例如游戏房间人数、拼团进度、直播间热度等实时状态变化都能在下发后的消息卡片中动态刷新。读完本文你将掌握通过$app-activity_message创建动态消息活动 ID、更新消息内容的核心 API 用法并基于仓库源码理解其底层调用链路与错误处理机制可直接落地到多人协作、实时状态同步类的小程序业务中。本文主体内容来源于仓库文档 docs/src/5.x/mini-program/activity_message.md并结合 EasyWeChat 小程序源码 与 小程序模块索引文档 进行深化说明。动态消息是什么小程序动态消息是微信为需要消息内容可变的场景提供的能力开发者可以先创建一条动态消息获得一个活动 IDactivity_id把这条消息发送给用户之后在特定业务条件下如拼团人数变化、竞赛开始、房间满员通过活动 ID 反复更新该消息的展示内容。用户无需再次订阅或接收新消息就能看到同一条消息卡片上的最新状态。这与模板消息的一次性发送有本质区别动态消息的核心价值在于可变更、可持续更新。初始化应用实例动态消息归属于小程序模块。在 EasyWeChat 5.x 中通过Factory::miniProgram($config)创建应用实例配置项与 docs/src/5.x/mini-program/index.md 保持一致use EasyWeChat\Factory; $config [ app_id wx3cf0f39249eb0exx, secret f1c242f4f28f735d4687abb469072axx, // 下面为可选项 // 指定 API 调用返回结果的类型array(default)/collection/object/raw/自定义类名 response_type array, log [ level debug, file __DIR__./wechat.log, ], ]; $app Factory::miniProgram($config);在后续所有示例中$app均指Factory::miniProgram得到的实例。获取动态消息实例$activityMessage $app-activity_message;activity_message作为小程序应用模块的快捷服务入口负责封装动态消息的创建与更新两个核心操作。在仓库的 MiniApp/Application.php 中小程序应用通过createClient()统一构建带 access_token 自动注入的 HTTP 客户端详见下文底层调用链路一节动态消息的所有请求都经由该客户端发出。基础功能创建动态消息活动 ID创建用于发送动态消息的活动 ID$result $activityMessage-createActivityId();返回结果{ errcode: 0, errmsg: ok, activity_id: xxx, expiration_time: 1635724800 }参数说明参数类型说明errcodeint错误码0 表示成功errmsgstring错误信息activity_idstring活动 ID用于后续消息更新expiration_timeint活动过期时间戳Unix 秒级时间戳过期后该活动 ID 无法再更新消息expiration_time决定了活动 ID 的存活周期超出该时间戳后调用更新接口会返回47502活动 ID 已过期因此创建后应尽快发送消息并规划好整个活动的更新窗口。更新动态消息更新已发送的动态消息内容$params [ member_count 2, // 参与人数 room_limit 4, // 房间人数上限 path pages/room?room_id123, // 页面路径 version_type develop // 版本类型develop, trial, release ]; $result $activityMessage-updateMessage( activity_id_xxx, // 活动ID 1, // 目标状态0-参与前 1-参与后 $params // 更新参数 );参数说明参数类型说明activityIdstring活动 ID由createActivityId()创建获得stateint目标状态0-参与前状态1-参与后状态paramsarray消息参数params.member_countint参与人数params.room_limitint房间人数上限params.pathstring小程序页面路径用户点击消息卡片时跳转params.version_typestring版本类型develop开发版、trial体验版、release正式版state与member_count/room_limit的组合是动态消息更新的核心逻辑member_count与room_limit的比值决定消息卡片上展示的参与进度state则决定消息处于参与前招募中还是参与后已开始/已满员的文案与样式。返回结果{ errcode: 0, errmsg: ok }errcode为0时表示更新成功其余非 0 值对应具体错误详见文末错误码说明。使用场景动态消息最典型的应用是人数实时变化型业务。以下场景均直接取自文档可直接复制运行use EasyWeChat\Factory;与$config初始化代码同上一节。游戏房间动态消息use EasyWeChat\Factory; $config [ app_id your-app-id, secret your-app-secret, // ... ]; $app Factory::miniProgram($config); $activityMessage $app-activity_message; // 1. 创建活动ID $activity $activityMessage-createActivityId(); if ($activity[errcode] 0) { $activityId $activity[activity_id]; echo 活动ID创建成功: {$activityId}\n; // 2. 用户发送消息时附带活动ID // 在发送消息接口中使用 activity_id // 3. 当房间状态变化时更新消息 // 例如有新用户加入房间 $updateParams [ member_count 3, // 当前3人 room_limit 4, // 最多4人 path pages/game/room?idroom_123 ]; $updateResult $activityMessage-updateMessage($activityId, 1, $updateParams); if ($updateResult[errcode] 0) { echo 消息更新成功房间现在有3人\n; } }拼团活动动态消息// 创建拼团活动的动态消息 $activity $activityMessage-createActivityId(); if ($activity[errcode] 0) { $activityId $activity[activity_id]; // 模拟拼团过程中的状态更新 $groupBuyingStates [ [member_count 1, room_limit 5, state 0], // 发起拼团 [member_count 3, room_limit 5, state 0], // 3人参与 [member_count 5, room_limit 5, state 1], // 拼团成功 ]; foreach ($groupBuyingStates as $index $stateData) { $params [ member_count $stateData[member_count], room_limit $stateData[room_limit], path pages/group-buy/detail?group_idgb_123 ]; $result $activityMessage-updateMessage($activityId, $stateData[state], $params); if ($result[errcode] 0) { echo 拼团状态更新: {$stateData[member_count]}/{$stateData[room_limit]}人\n; } // 模拟时间间隔 sleep(1); } }该场景清晰展示了state的用法拼团进行中一直使用state 0参与前直到满员成功切换为state 1参与后。实时竞赛动态消息// 创建竞赛活动的动态消息 $activity $activityMessage-createActivityId(); if ($activity[errcode] 0) { $activityId $activity[activity_id]; // 竞赛报名阶段 $registrationParams [ member_count 8, // 已报名8人 room_limit 20, // 最多20人 path pages/contest/detail?contest_idc_123 ]; $activityMessage-updateMessage($activityId, 0, $registrationParams); echo 竞赛报名中: 8/20人\n; // 竞赛开始阶段 $startParams [ member_count 20, // 满员开始 room_limit 20, path pages/contest/live?contest_idc_123 ]; $activityMessage-updateMessage($activityId, 1, $startParams); echo 竞赛开始: 20/20人 已开始\n; }注意报名阶段与开始阶段使用了不同的path报名阶段跳转详情页开始阶段跳转直播页——动态消息的path是可随状态切换的。直播间动态消息// 直播间观众数量变化 $activity $activityMessage-createActivityId(); if ($activity[errcode] 0) { $activityId $activity[activity_id]; // 模拟直播间观众数量变化 $viewerCounts [10, 25, 50, 100, 250]; foreach ($viewerCounts as $count) { $params [ member_count $count, room_limit 1000, // 直播间容量 path pages/live/room?live_idlive_123 ]; // 根据观众数量决定状态 $state $count 100 ? 1 : 0; // 超过100人为热门状态 $result $activityMessage-updateMessage($activityId, $state, $params); if ($result[errcode] 0) { $status $state ? 热门 : 直播中; echo 直播间更新: {$status} {$count}人观看\n; } sleep(2); // 模拟时间间隔 } }队伍组建动态消息function updateTeamMessage($activityMessage, $activityId, $currentMembers, $maxMembers, $teamId) { $params [ member_count $currentMembers, room_limit $maxMembers, path pages/team/detail?team_id{$teamId} ]; // 队伍满员时切换到完成状态 $state ($currentMembers $maxMembers) ? 1 : 0; $result $activityMessage-updateMessage($activityId, $state, $params); if ($result[errcode] 0) { $status $state ? ✅已满员 : 招募中; echo 队伍状态: {$status} {$currentMembers}/{$maxMembers}人\n; return true; } return false; } // 使用示例 $activity $activityMessage-createActivityId(); if ($activity[errcode] 0) { $activityId $activity[activity_id]; // 模拟队伍成员逐渐加入 for ($i 1; $i 5; $i) { updateTeamMessage($activityMessage, $activityId, $i, 5, team_abc123); sleep(1); } }该场景给出一个可复用的封装函数把人数/上限/路径/状态的换算逻辑收敛到函数内部业务侧只需传入当前人数与上限state由函数根据是否满员自动推导适合作为生产代码的参考范式。底层调用链路从方法到微信 API从仓库源码可以确认动态消息请求的完整调用链路帮助开发者理解 SDK 如何处理鉴权与错误。1. access_token 自动注入在 src/MiniApp/Application.php 中createClient()构建了AccessTokenAwareClientreturn (new AccessTokenAwareClient( client: $httpClient, accessToken: $this-getAccessToken(), failureJudge: fn ( Response $response ) ($response-toArray()[errcode] ?? 0) || ! is_null($response-toArray()[error] ?? null), throw: (bool) $this-config-get(http.throw, true), ))-setPresets($this-config-all());这意味着鉴权透明化调用createActivityId()/updateMessage()时无需手动传入 access_tokenAccessTokenAwareClient会自动携带access_token 由getAccessToken()提供并通过缓存InteractWithCache复用缓存失效时自动刷新。失败判定failureJudge以响应 JSON 中的errcode非 0或error字段作为请求失败的判据动态消息返回的errcode非 0 时即被认为调用失败。2. 请求域与重试同一文件中getHttpClientDefaultOptions()设置了基础域名https://api.weixin.qq.com/动态消息的所有请求均发往该域名。此外通过配置项http.retry可开启自动重试默认关闭http.max_retries控制最大重试次数默认 2 次重试策略由AccessTokenExpiredRetryStrategy实现详见 src/Kernel/HttpClient/AccessTokenExpiredRetryStrategy.php。3. 响应解析默认response_type为array因此示例代码中可以直接以$result[errcode]、$activity[activity_id]的数组形式访问返回值若在配置中将response_type改为collection或object访问方式需相应调整。注意事项活动ID有效期活动 ID 有过期时间对应返回中的expiration_time过期后无法更新消息错误码47502。更新频率限制消息更新有频率限制不要过于频繁调用高频调用可能触发45009接口调用超过限额。状态一致性确保传递的参数与实际业务状态一致避免消息内容与真实数据不符。页面路径有效性确保path参数指向的页面存在且可访问否则用户点击消息卡片将跳转失败。版本类型根据小程序发布状态选择正确的version_typedevelop/trial/release与当前可访问的小程序版本匹配。最佳实践合理使用场景动态消息适用于多人协作、实时状态变化的场景房间、拼团、竞赛、直播、组队不适用于一次性静态通知。状态管理清晰定义参与前state 0与参与后state 1的状态差异包括文案、跳转路径与展示数据。用户体验确保消息更新能够提供有价值的信息如人数进度、开始/结束状态避免无意义的高频刷新。错误处理做好活动 ID 过期47502和更新失败如47503状态值错误的处理建议对updateMessage的返回errcode做统一检查并记录日志。数据同步保持消息内容与实际业务数据同步更新时机应紧跟业务状态变更如用户加入房间、拼团成团而非定时轮询。错误码说明错误码说明0成功-1系统繁忙此时请开发者稍候再试40001获取access_token时AppSecret错误40013不合法的AppID41001缺少access_token参数45009接口调用超过限额47001参数错误47501一天只能创建100个活动ID47502活动ID已过期47503状态值错误其中47501表明创建活动 ID 有每日数量上限100 个对高并发场景需提前规划活动 ID 的复用策略避免把每个用户都当作一个独立活动来创建47503说明state只能取0或1传其他值将直接失败。延伸阅读动态消息服务入口与依赖注入小程序应用实现 src/MiniApp/Application.php、应用契约 src/MiniApp/Contracts/Application.php小程序模块配置与初始化docs/src/5.x/mini-program/index.md其他小程序服务能力订阅消息 docs/src/5.x/mini-program/subscribe_message.md、模板消息 docs/src/5.x/mini-program/template_message.md赞分享后端即时通讯【免费下载链接】easywechat 一个 PHP 微信 SDK项目地址https://gitcode.com/gh_mirrors/ea/easywechat点击查看免费下载相关推荐EasyWeChat 4.x 小程序订阅消息开发指南模板管理与消息发送全流程EasyWeChat 4.x 小程序订阅消息开发指南模板管理与消息发送全流程 订阅消息是小程序向用户推送服务通知的核心能力本指南以 EasyWeChat 4后端即时通讯EasyWeChat 小程序订阅消息完整接入指南模板管理与消息下发实战EasyWeChat 小程序订阅消息完整接入指南模板管理与消息下发实战 导读 本指南聚焦 EasyWeChatPHP 微信 SDK5.x 版本中 小程序订后端即时通讯OBS Studio三步掌握专业级直播录制的全能解决方案OBS Studio三步掌握专业级直播录制的全能解决方案 OBS Studio是一款功能强大的开源软件专为视频内容的捕捉、合成、编码、录制和流媒体传输而设计音视频直播屏幕录制桌面应用视频上一篇ARuler创新测量工具利用AR技术精准量距下一篇探索Carbon Fields轻松打造WordPress自定义字段的终极指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考