04-data-dependencies-and-risks.md 11 KB

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 配置,含 appkeyclient_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}
`token sdk mlbb

注册和频控

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_PATHRUNTIME_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. 迁移前清点 .envapplication/config.phpapplication/api/config.phpapplication/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 中引入:

  • 数据库唯一索引保护:orderidattach+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 渠道仍在线。
  • DemoTestIndex 中测试/迁移方法是否可以下线。
  • MLBB 活动是否仍在运营。
  • 支付成功页 PayReturn 是否仍由客户端或浏览器跳转使用。
  • HTML view 是否需要迁移到 Go,还是交由前端/静态服务处理。