# api 数据依赖、外部依赖与迁移风险 ## 1. 数据表依赖 以下为 `application\api` 直接或间接高频出现的数据表和模型。命名中 `cy_`、`nw_`、`lr_`、`mw_` 混用,Go 迁移时建议统一 repository 命名,避免把表前缀散落到业务代码。 ### 账号与实名 | 表/模型 | 用途 | | --- | --- | | `cy_members` / `Members` | 主账号,用户名、密码、手机号、邮箱、平台币余额、冻结状态 | | `cy_memberstwo` / `MembersTwo` | 实名扩展、身份证、真实姓名等 | | `cy_member_history` / `MemberHistory` | 账号历史变更、渠道绑定、实名记录 | | `nw_subaccount` / `Subaccount` | 游戏子账号,子用户名、游戏、渠道、实名状态、中宣 PI、设备 | | `cy_member_channel_game_rel` / `MemberChannelGame` | 玩家、游戏、渠道归属关系 | | `cy_logininfo` / `Logininfo` | 登录日志和渠道归属记录 | | `nw_devices` | 设备信息 | | `nw_startup_devices` | 启动上报设备 | | `GameBanned` | 游戏级 IP/IMEI 封禁 | | `GameRestrict` | 游戏防沉迷/限制开关 | ### 游戏、渠道和包 | 表/模型 | 用途 | | --- | --- | | `cy_game` / `Game` | 游戏基础信息、状态、认证类型 | | `cy_gameinfo` / `GameInfo` | 游戏扩展配置、平台、AI 开关、注册/登录提示 | | `cy_app` / `App` | SDK App 配置,含 `appkey`、`client_appkey` | | `nw_channel` / `Channel` | 渠道信息,状态、层级、父渠道 | | `ChannelFrozen` | 渠道冻结配置 | | `cy_sdkgamelist` / `SdkGameList` | 游戏分包配置 | | `nw_game_band` / `gameBand` | 安卓/iOS/H5 游戏绑定关系 | | `nw_game_package_upload` | 游戏包上传记录 | | `nw_game_package_test` | 测试包信息 | | `nw_game_promotion` | 推广页/短链 | | `promotion_short_link` | 推广短链 | ### 角色与区服 | 表/模型 | 用途 | | --- | --- | | `nw_member_game_server` / `MemberGameServer` | 玩家角色、区服、等级、VIP、IMEI | | `GameServer` | 游戏区服信息 | | `GameServerIp` | 区服 IP 记录 | | `GameServerImeil` | 区服 IMEI 记录 | ### 游戏支付 | 表/模型 | 用途 | | --- | --- | | `cy_pay` / `Pay` | 游戏充值订单 | | `cy_paycpinfo` / `PayCpinfo` | CP 发货回调参数、回调状态、超时时间 | | `PayType` | 支付方式配置 | | `Payrule` | 支付规则 | | `PaySetting` | 充值预警配置 | | `PayWarningRule` | 充值预警规则 | | `MemberZscoin` | 游戏专属币余额 | | `MemberZscoinDet` | 游戏专属币流水 | | `MemberCoinInfo` | 平台币流水 | | `memberCoinPay` / `MemberCoinPay` | 平台币充值订单 | ### 代金券、礼包、福利 | 表/模型 | 用途 | | --- | --- | | `cy_coupon` / `Coupon` | 代金券模板 | | `cy_coupon_member` / `CouponMember` | 用户代金券/券码实例 | | `cy_libao` / `libao` | 礼包主表 | | `cy_libaoinfo` | 礼包码/礼包详情 | | `cy_libaolog` | 礼包领取日志 | | `Welfare` | 福利活动 | | `WelfareGrant` | 福利发放记录 | | `welfareGrantData` | 福利发放明细 | | `welfareGiftType` | 福利礼包类型 | | `common/WelfareVoluntarily` | 福利主动发放配置 | ### 聚合渠道 | 表/模型 | 用途 | | --- | --- | | `nw_complex_channel` / `ComplexChannel` | 聚合渠道定义,mark 映射适配器 | | `cy_polychannel_game` / `PolychannelGame` | 渠道游戏配置,含渠道验签参数 | | `nw_complex_members` / `ComplexMembers` | 聚合用户 | | `nw_complex_pay` / `ComplexPay` | 聚合支付订单 | | `nw_complex_role` | 聚合角色 | | `nw_complex_server` | 聚合区服 | | `ComplexMembersAuthentication` | 聚合用户实名状态 | ### MLBB 活动 | 表 | 用途 | | --- | --- | | `lr_user_info` | 活动用户信息 | | `lr_user_gathering` | 冒险团/邀请码 | | `lr_user_task` | 活动任务 | | `lr_user_winning` | 抽奖中奖记录 | | `lr_prize` | 奖品配置 | | `lr_prize_gift` | 礼包码库存 | | `lr_claim` | 阶段奖励领取 | ### 第三方与专项 | 表/模型 | 用途 | | --- | --- | | `cy_game_ai_channel` | AI 助手渠道配置 | | `cy_game_notify` | 游戏通知配置 | | `cy_game_user_white` | 游戏登录白名单 | | `cy_setting` / `Setting` | 全局配置 | | `CpsProblem` | 用户问题列表 | | `tiktokAdLog` | TikTok/抖音相关日志 | | `mw_dy_channel_rel` | 抖音渠道映射 | | `cy_retaine_game` / `cy_retaine` | 留存统计 | ## 2. Redis 和缓存 key ### 登录态 | key | 用途 | TTL | | --- | --- | --- | | `{token}` | token 对应登录设备 `imeil` | 30 天 | | `token|sdk|{userid}|{gameid}` | SDK token 随机码 | 30 天 | | `token|sdk|mlbb|{userid}` | MLBB token 随机码 | 7 天 | ### 注册和频控 | key | 用途 | | --- | --- | | `register:ip_limit:{yyyy-mm}_{ip}` | 每月 IP 注册次数 | | `register:imeil_limit:{yyyy-mm}_{imeil}` | 每月设备注册次数 | | `request:frequency:{username}:{route}` | 指定接口频率限制 | | `aoyousdk_register_most:gameid:{gameid}channel_id:{channel_id}` | 渠道注册量频控 | | `fk_register_time:{username}` | 风控注册时间标记 | ### 支付和订单 | key | 用途 | | --- | --- | | `pay_duplicate_{member_id}_{gameid}` | 游戏充值重复下单锁 | | `pay_duplicate_{userid}_coin` | 平台币充值重复下单锁 | | `PayNotify:updateOrder:{orderid}` | 支付回调临时缓存 | | `ldzf_order:{order_id}` | 联动优势小程序支付订单临时数据 | | `clearable_pay_warning:channelid:{channel_id}gameid:{game_id}member_id:{member_id}ruleid:{rule_id}amount_{amount}` | 充值预警计数 | ### 角色和区服 | key | 用途 | | --- | --- | | `:Role_add:MemberGameServer:{md5}` | 防止短时间重复插入角色 | | `:Role_add:GameServer:{md5}` | 防止短时间重复插入区服 | ### v2 用户安全 | key | 用途 | | --- | --- | | `v2:User:checkUnbindingPhoneCode:{token}` | 解绑手机号校验 token | ### MLBB | key | 用途 | | --- | --- | | `mlbb` 登录失败次数 key | 登录尝试限制 | | 礼包码缓存 key | `HandleService` 中缓存礼包码库存,迁移时需按源码再确认具体 key | ## 3. 外部依赖 ### 基础设施 - MySQL:核心业务数据。 - Redis:登录态、频控、订单临时数据、队列。 - ThinkPHP Queue:`PayCallback` 中 CP 异步回调入队。 - 日志目录:`LOG_PATH`、`RUNTIME_PATH` 下有大量业务日志。 ### 支付渠道和 SDK 当前代码出现的支付/支付 SDK 包括: - 支付宝官方 AOP/H5/WAP。 - 微信 H5/WAP。 - 易宝 `ybzf`。 - 联动优势 `ldys`。 - 趣智连 `qzl`。 - 优亿宝 `yyyb`。 - 喜钛游 `xty`。 - 十一玩 `syw`。 - 米花 `mihua`。 - 快接 `kj`。 - Sumpay。 - 快电/快达 `kdh5`。 - Airwallex。 - Swiftpay。 - iPayNow。 - 全民付/趣妙付类接口。 Go 迁移建议: - 统一抽象 `PaymentProvider`,各渠道单独实现。 - 每个 provider 明确: - 请求金额单位。 - 回调金额单位。 - 签名算法。 - 成功响应文本。 - 通知 URL 类型,游戏充值和平台币充值是否不同。 ### 实名和风控 - `authSdk.Authentication`:中宣部实名/查询/登出。 - `IpLimit`:海外游戏 IP 限制。 - `FkStrategiesService`:风控策略。 - `RiskControl`:登录/注册风控 API。 ### 第三方渠道和数据 - 微信小程序/公众号。 - 抖音开放平台。 - 快手相关渠道适配。 - YQL 数据和券通知。 - TikTok 推送。 - DingTalk 机器人告警。 - 聚合渠道各自登录/支付验签。 ## 4. 敏感配置风险 当前风险点: - `api/config.php` 中存在渠道密钥、私钥或证书类配置片段。 - 支付渠道配置散落在 `Config::get(...)`、`.env`、业务服务和 vendor SDK 中。 - DingTalk webhook、YQL sign key、支付商户号、私钥等都不应进入 Go 代码仓库。 - 部分渠道适配器可能把签名密钥写在代码、配置或数据库 `param` 中。 Go 迁移建议: 1. 区分三类配置: - 非敏感业务配置:游戏开关、版本、渠道开关。 - 敏感密钥:支付私钥、AppSecret、webhook token。 - 动态配置:支付路由概率、渠道参数、实名配置。 2. 敏感密钥统一从环境变量、KMS 或配置中心读取。 3. 为每个 provider 建立 config schema,不允许 handler 直接读任意配置 key。 4. 迁移前清点 `.env`、`application/config.php`、`application/api/config.php`、`application/extra`。 ## 5. 金额和状态风险 ### 金额风险 PHP 中大量使用: - `bcadd` - `bcsub` - `bcmul` - `bccomp` - `priceFormat` - `formatFenToYuan` - `formatYuanToFen` Go 中不要使用 `float64` 处理金额。建议: - 金额内部统一用“分”的整数,或使用 decimal 库。 - 第三方 provider 层负责元/分转换。 - 订单表如果仍存 decimal 元,repository 层做格式化。 ### 状态风险 游戏充值: - `cy_pay.status=0`:待支付。 - `cy_pay.status=1`:支付成功。 - `cy_paycpinfo.payflag=1`:CP 发货已成功。 平台币充值: - `member_coin_pay.status=0`:待支付。 - `member_coin_pay.status=1`:支付成功并已加余额。 代金券: - `coupon_member.is_use=1`:未使用。 - `is_use=2`:订单占用或使用中。 - `is_use=3`:已使用完成。 Go 迁移时要补充订单状态枚举,并在事务边界里统一维护。 ## 6. 幂等风险 必须保证幂等的流程: - 登录 token 生成和旧 token 替换。 - 注册重复提交。 - 游戏充值下单重复提交。 - 支付渠道异步回调重复通知。 - CP 发货回调失败后的异步重试。 - 平台币充值加余额。 - 代金券领取和支付占用。 - MLBB 抽奖扣次数和发奖。 建议 Go 中引入: - 数据库唯一索引保护:`orderid`、`attach+gameid`、券码、渠道订单号。 - Redis 短锁只作为体验优化,不作为唯一保障。 - 回调处理基于数据库状态机幂等。 - 每个支付回调记录原始 payload 和 normalized notify。 ## 7. 历史兼容风险 需要特别保留的历史行为: - `imeil` 拼写历史遗留,不要直接改成 `imei`。 - `sub_username` 生成规则通常为 `{userid}_{APP_STATUS}`,部分游戏直接使用 `userid`。 - `jsonResult` 的 code 映射逻辑不是直接返回原始 code。 - `channel_id` 传入渠道和玩家归属渠道可能不同,下单时会用归属渠道覆盖。 - 安卓/iOS/H5 绑定游戏会影响订单列表、渠道归属和登录关系。 - 某些游戏 ID 有硬编码特殊规则,例如注册方式、支付方式、子账号格式。 - `complex` 的渠道类名由 `channel_mark` 动态拼接,大小写和 mark 必须兼容。 ## 8. 需要补充确认的清单 迁移前建议用线上日志或数据库确认: - 哪些 `v1` 接口仍有流量。 - 哪些支付渠道仍在线。 - 哪些 `complex` 渠道仍在线。 - `Demo`、`Test`、`Index` 中测试/迁移方法是否可以下线。 - MLBB 活动是否仍在运营。 - 支付成功页 `PayReturn` 是否仍由客户端或浏览器跳转使用。 - HTML view 是否需要迁移到 Go,还是交由前端/静态服务处理。