1. 数据库新增 012_rock_fulfillment 迁移,创建 rock_configs 配置表与 rock_tokens 通用库存表,补齐黑色ROCK长袖T恤与蓝色运动服上衣商品目录; 2. 封装 RockClient 与 RockService,实现 0666.pro 平台 Bearer Token 极简连通校验、批量采购50个入库、水位监控巡检与自动补货; 3. 新增 RockProvider 实现标准履约路由,引入 Anti-Ghost 旧绑定基线比对与 UID 强一致门禁,扫错号硬阻断并记录为 mismatch 状态; 4. 针对黑色ROCK与蓝色运动服实现动态发货(绑定后发货前动态选择 skin),并提取腾讯官方发货流水号 fulfillId 对账; 5. 新增全局自动发货总开关(Kill Switch),支持一键软熔断降级转人工接单处理; 6. 前端新增 PlatformRock 管理大屏,提供总开关切换、Token配置与连通测试、库存监控、一键补货及错单解冻重置。
376 lines
18 KiB
Markdown
376 lines
18 KiB
Markdown
# Rock发货平台 (0666.pro) 自动发货逆向与接口分析报告
|
||
|
||
> **编制日期**:2026-10-05
|
||
> **抓包来源**:
|
||
> 1. `/Users/yml/Desktop/抓包/rock相关/打包两个并查看-发货黑色.har`
|
||
> 2. `/Users/yml/Desktop/抓包/rock相关/打包两个黑色并查看.har`
|
||
> 3. `/Users/yml/Desktop/抓包/rock相关/兑换记录等杂项.har`
|
||
> 4. `/Users/yml/Desktop/抓包/rock相关/蓝色一个发货.har`
|
||
> 5. 前端完整源码:`https://0666.pro/app.js`(316KB 原生未混淆代码已还原提取)
|
||
> **核心标的**:和平精英皮肤发货(黑色ROCK长袖T恤、蓝色运动服上衣、货币附赠等)
|
||
|
||
---
|
||
|
||
## 一、 证据分类与确信度评估矩阵
|
||
|
||
依照逆向工程与高强度分析标准,本次所有结论均严格基于抓包实体通信数据与前端源代码交叉验证:
|
||
|
||
| 证据项编号 | 证据分类 | 来源与定位 | 关键事实 / 发现 | 确信度 |
|
||
| :--- | :--- | :--- | :--- | :--- |
|
||
| **EV-01** | 通信抓包 (HAR) | `发货黑色.har` [Entry 34] | 提取 Token 请求:`POST /api/user/tokens/claim`,Body: `{"color":"black","count":"2"}`,扣除积分提取可用 Token。 | **100%** |
|
||
| **EV-02** | 通信抓包 (HAR) | `发货黑色.har` [Entry 36, 40] | 获取绑定及兑换配置:`GET /api/redeem/{redeem_code}`,返回腾讯官方绑定链接 `bindUrl` 及皮肤/货币配置。 | **100%** |
|
||
| **EV-03** | 通信抓包 (HAR) | `发货黑色.har` [Entry 37, 39] | 刷新绑定状态:`POST /api/user/tokens/{id}/refresh`,返回 `binding.bound: true`,角色名、角色ID、大区及历史发放记录。 | **100%** |
|
||
| **EV-04** | 通信抓包 (HAR) | `发货黑色.har` [Entry 42] | 提交兑换发货:`POST /api/redeem/{id}`,Body: `{"skin":"黑色ROCK长袖T恤","currency":"幸运币","account":"感性的洁少"}`,官方发货成功。 | **100%** |
|
||
| **EV-05** | 前端源码 | `app.js` (L3617~L3720) | 皮肤与货币官方数据字典 `officialSkus`,黑蓝皮肤权限控制与 180 点价值换算公式。 | **100%** |
|
||
| **EV-06** | 前端源码 | `app.js` (L217513~L217600) | 兑换发货执行函数 `redeemToken()`,揭示其具备登录态与免登录公开态两种调用形态。 | **100%** |
|
||
| **EV-07** | 前端源码 | `app.js` (L305062~L305120) | 绑定链接解析与生成逻辑,底层依托和平精英官方活动链接 `gp.qq.com/cp/a20241128mobile/...`。 | **100%** |
|
||
| **EV-08** | 用户截图 | 微信/扫码绑定弹窗截图 | 弹窗展示 Token、状态(已绑定)、大区、角色、当前货币组合与兑换皮肤下拉选择框。 | **100%** |
|
||
| **EV-09** | 通信抓包 (HAR) | `兑换记录等杂项.har` [Entry 4, 7] | 兑换历史对账接口:`GET /api/user/exchange-records?page=1&pageSize=20`,支持按账号/UID、Token、区服、时间范围精准分页对账。 | **100%** |
|
||
| **EV-10** | 通信抓包 (HAR) | `兑换记录等杂项.har` [Entry 5] | 腾讯官方履约凭证:刷新/兑换成功记录中返回 `fulfillId: 4519960`(官方发放流水号)及 `membership: 202610`(月份期号)。 | **100%** |
|
||
| **EV-11** | 通信抓包 (HAR) | `兑换记录等杂项.har` [Entry 3] | 下属发货员列表:`GET /api/user/delivery-agents`,返回该商户绑定的发货员(如丁德鑫、曹强等)。 | **100%** |
|
||
| **EV-12** | 用户截图 | 批量获取 Token 弹窗截图 | 提取类型默认下拉选项为 `1 = 黑色`,提取数量 2~500,印证了统一下单通用黑色 Token 的业务形态。 | **100%** |
|
||
| **EV-13** | 通信抓包 (HAR) | `蓝色一个发货.har` [Entry 13] | 蓝色发货兑换请求:`POST /api/redeem/151154`,Body: `{"skin":"蓝色运动服上衣","currency":"幸运币","account":"打破虚妄的浪漫"}`,发放成功。 | **100%** |
|
||
| **EV-14** | 通信抓包 (HAR) | `蓝色一个发货.har` [Entry 1~10] | **旧绑定数据实锤证据**:初次 refresh 返回旧角色“总荒凉”(3751279035);买家真正微信扫码后更新为“打破虚妄的浪漫”(3688825401),`bind_change_type: "rebind"`,旧角色归入 `previous_bound_account`。 | **100%** |
|
||
| **EV-15** | 通信抓包 (HAR) | `蓝色一个发货.har` [Entry 0] | 再次证实用于发货蓝色的 Token 151154 其本身规格仍然是 `color: "black"`(黑色通用 Token)。 | **100%** |
|
||
| **EV-16** | 前端源码 | `app.js` (L3700~L3760) | **商户登录与鉴权机制**:平台无固定密码登录,采用“用户名+手机验证码”(`POST /api/auth/send-code` + `POST /api/auth/phone-login`),登录后下发 Bearer Token 并存于 `localStorage.yd_token`。请求鉴权全量走 `Authorization: Bearer <yd_token>`。 | **100%** |
|
||
|
||
---
|
||
|
||
## 二、 核心业务模型与算法解构
|
||
|
||
### 2.1 颜色规格与权限差异(黑色 vs 蓝色)
|
||
|
||
平台采用 **Token** 作为履约载体,Token 本质为标准 HS256 JWT,分为两种颜色规格:
|
||
|
||
```
|
||
+---------------------------+
|
||
| Token Pool |
|
||
+---------------------------+
|
||
|
|
||
+-----------------+-----------------+
|
||
| |
|
||
v v
|
||
+--------------------+ +--------------------+
|
||
| Color: black | | Color: blue |
|
||
| (黑色高级 Token) | | (蓝色标准 Token) |
|
||
+--------------------+ +--------------------+
|
||
| |
|
||
v v
|
||
+--------------------+ +--------------------+
|
||
| 可兑换: | | 可兑换: |
|
||
| 1. 黑色ROCK长袖T恤 | | 1. 蓝色运动服上衣 |
|
||
| 2. 蓝色运动服上衣 | | 2. 其他普通皮肤 |
|
||
| 3. 其他普通皮肤 | | (系统排除了黑色ROCK)|
|
||
+--------------------+ +--------------------+
|
||
```
|
||
|
||
- **黑色 Token (`color: "black"`)**:
|
||
- 允许兑换:**黑色ROCK长袖T恤**、蓝色运动服上衣、以及其他所有皮肤。
|
||
- 提取成本:约 21.0 积分/个(抓包配置项 `blackTokenCost: "21.0"`)。
|
||
- **蓝色 Token (`color: "blue"`)**:
|
||
- 核心限制:前端与后端均强制校验:`skinCatalog.filter(skin => skin !== BLACK_ROCK_SKIN)`,**严禁兑换黑色 ROCK**。
|
||
- 提取成本:约 21.0 积分/个(抓包配置项 `blueTokenCost: "21.0"`)。
|
||
|
||
### 2.2 价值平衡与货币数量计算算法
|
||
|
||
根据 `app.js` 的纯算模型,每个 Token 的官方标称总额度为 **180 点**。每次兑换发放:**1 件皮肤 + N 个附赠游戏货币**。
|
||
|
||
$$
|
||
\text{附赠货币数量} = \max\left(0, \operatorname{round}\left(\frac{180 - \text{皮肤官方单价}}{\text{货币官方单价}}\right)\right)
|
||
$$
|
||
|
||
#### 道具官方价格字典:
|
||
- **皮肤单价 (`type: 1`)**:
|
||
- `黑色ROCK长袖T恤`: 80 点
|
||
- `唐装(红)`: 120 点
|
||
- `火焰口罩`: 160 点
|
||
- `蓝色运动服上衣` / `战地情缘` / `卧虎藏龙` / `水墨画口罩`: 40 点
|
||
- **货币单价 (`type: 0`)**:
|
||
- `幸运币`: 10 点
|
||
- `荣耀勋章`: 10 点
|
||
- `物资币`: 10 点
|
||
- `服饰币`: 1 点
|
||
|
||
#### 实际组合计算示例:
|
||
1. **兑换黑色ROCK + 幸运币**:
|
||
$$\frac{180 - 80}{10} = \mathbf{10} \text{ 个幸运币}$$
|
||
(抓包记录完全吻合:`currencyQuantity: 10`)
|
||
2. **兑换蓝色运动服 + 幸运币**:
|
||
$$\frac{180 - 40}{10} = \mathbf{14} \text{ 个幸运币}$$
|
||
(用户截图完全吻合:按钮显示“领取蓝色运动服上衣 + 幸运币x14”)
|
||
3. **若选择服饰币(单价 1)**:
|
||
- 黑色ROCK + 服饰币:$(180 - 80) / 1 = 100$ 个服饰币
|
||
- 蓝色运动服 + 服饰币:$(180 - 40) / 1 = 140$ 个服饰币
|
||
|
||
---
|
||
|
||
## 三、 Token 全生命周期状态机
|
||
|
||
```mermaid
|
||
stateDiagram-v2
|
||
[*] --> available: 平台入库/上游导入
|
||
available --> using: 用户调用 claim 提取 / 分配入包
|
||
using --> bound: 买家扫码并在官方活动页绑定角色成功
|
||
using --> abnormal: 扫码超时/异常上报
|
||
bound --> using: 买家重新扫码切换账号 (换绑)
|
||
bound --> redeemed: 提交兑换接口 (选择皮肤+货币+角色)
|
||
redeemed --> settled: 管理员/提交员结算
|
||
settled --> [*]
|
||
abnormal --> [*]
|
||
```
|
||
|
||
| 状态标识 | 状态中文 | 释义与系统行为 |
|
||
| :--- | :--- | :--- |
|
||
| `available` | 可用 | 处于平台库存池中,尚未分配。 |
|
||
| `using` | 使用中 / 待使用 | 已被分销商提取(claim),生成了唯一的 `redeem_code`,等待买家扫码。 |
|
||
| `bound` | 已绑定 | 买家已扫码并在腾讯活动页完成角色绑定,系统已捕获到角色名称和大区。 |
|
||
| `redeemed` | 已兑换 | 已向游戏服务器成功提交发货请求,皮肤和货币已到账。 |
|
||
| `settled` | 已结算 | 最终财务结算状态。 |
|
||
| `abnormal` | 异常 | 异常报错,由用户或发货员上报。 |
|
||
|
||
---
|
||
|
||
## 四、 自动化发货接口技术规格 (API Reference)
|
||
|
||
系统提供两种调用链路:
|
||
1. **主控管理端(带 Bearer 鉴权)**:用于后台批量提取 Token、监控状态。
|
||
2. **免登录公开端(仅凭 `redeem_code`)**:用于生成买家专用发货链接,完全无状态。
|
||
|
||
### 4.1 提取 Token (Claim)
|
||
- **请求方式**:`POST https://0666.pro/api/user/tokens/claim`
|
||
- **请求头**:
|
||
```http
|
||
Authorization: Bearer <user_token>
|
||
Content-Type: application/json
|
||
```
|
||
- **请求体**:
|
||
```json
|
||
{
|
||
"color": "black", // "black" 或 "blue"
|
||
"count": "1" // 提取数量
|
||
}
|
||
```
|
||
- **返回体**:
|
||
```json
|
||
{
|
||
"tokens": [
|
||
{
|
||
"id": 151153,
|
||
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
|
||
"color": "black",
|
||
"region": "Q/V可用",
|
||
"phone": "13755033455",
|
||
"status": "using",
|
||
"redeem_code": "a4b7d1c94034e6fc52368b61dff20afe",
|
||
"expires_at": "2026-11-03 11:54:30"
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
### 4.2 获取绑定二维码与链接
|
||
- **请求方式**:`GET https://0666.pro/api/redeem/{redeem_code}`
|
||
- **说明**:此接口为免登录公开接口,任何持有 `redeem_code` 的客户端均可调用。
|
||
- **返回体**:
|
||
```json
|
||
{
|
||
"token": {
|
||
"id": 151153,
|
||
"color": "black",
|
||
"status": "using",
|
||
"redeem_code": "a4b7d1c94034e6fc52368b61dff20afe"
|
||
},
|
||
"bindUrl": "https://gp.qq.com/cp/a20241128mobile/index.html?userId=13755033455×tamp=1791176387&nonce=be809689&sign=cb1ce3c99601ba6fe1902064176241d2d0a0683a",
|
||
"bindError": "",
|
||
"config": {
|
||
"skinOptions": "[\"蓝色运动服上衣\",\"黑色ROCK长袖T恤\",...]",
|
||
"defaultCurrency": "幸运币"
|
||
}
|
||
}
|
||
```
|
||
|
||
### 4.3 刷新与查询绑定状态 (Refresh)
|
||
- **请求方式**:
|
||
- 方式 A(管理端):`POST https://0666.pro/api/user/tokens/{id}/refresh`
|
||
- 方式 B(公开端):`POST https://0666.pro/api/redeem/{redeem_code}/refresh`
|
||
- **返回体**(绑定成功):
|
||
```json
|
||
{
|
||
"token": {
|
||
"id": 151153,
|
||
"status": "bound",
|
||
"bound_account": "感性的洁少",
|
||
"bound_account_id": "3911959065",
|
||
"region": "安卓-微信"
|
||
},
|
||
"binding": {
|
||
"bound": true,
|
||
"role": "感性的洁少",
|
||
"roleId": "3911959065",
|
||
"region": "安卓-微信"
|
||
},
|
||
"deliveryList": [
|
||
// 该角色的历史发放记录,防止重复防刷
|
||
],
|
||
"message": "已刷新绑定信息"
|
||
}
|
||
```
|
||
|
||
### 4.4 提交兑换发货 (Redeem)
|
||
- **请求方式**:
|
||
- 方式 A(管理端):`POST https://0666.pro/api/redeem/{id}`(请求头带 Bearer)
|
||
- 方式 B(公开端):`POST https://0666.pro/api/redeem/{redeem_code}`(无需 Bearer)
|
||
- **请求体**:
|
||
```json
|
||
{
|
||
"skin": "黑色ROCK长袖T恤", // 必须在可选列表内
|
||
"currency": "幸运币", // "幸运币" / "荣耀勋章" / "物资币" / "服饰币"
|
||
"account": "感性的洁少" // 必须与 binding.role 一致
|
||
}
|
||
```
|
||
- **返回体**:
|
||
```json
|
||
{
|
||
"status": "success",
|
||
"message": "领取成功",
|
||
"token": {
|
||
"id": 151153,
|
||
"status": "redeemed",
|
||
"redeem_skin": "黑色ROCK长袖T恤",
|
||
"redeem_currency": "幸运币",
|
||
"redeemed_at": "2026-10-05 13:05:07"
|
||
}
|
||
}
|
||
```
|
||
|
||
### 4.5 批量打包分享 (Package,可选能力)
|
||
- **请求方式**:`POST https://0666.pro/api/user/packages`
|
||
- **请求体**:
|
||
```json
|
||
{
|
||
"ids": [151126, 151130],
|
||
"note": "订单批次001"
|
||
}
|
||
```
|
||
- **返回体**:生成公开访问链接 `https://0666.pro/#/package/{share_code}`,可直接将整包交付给大客户或批量发货打手。
|
||
|
||
### 4.6 兑换历史对账接口 (Exchange Records)
|
||
- **请求方式**:`GET https://0666.pro/api/user/exchange-records?page=1&pageSize=20`
|
||
- **请求头**:`Authorization: Bearer <user_token>`
|
||
- **Query 过滤参数**:
|
||
- `page`: 页码(从 1 开始)
|
||
- `pageSize`: 每页数量
|
||
- `account`: 游戏角色名 / 角色 UID(精准核账)
|
||
- `token`: 按指定 Token 过滤
|
||
- `region`: 按区服过滤
|
||
- `dateFrom` / `dateTo`: 兑换时间范围
|
||
- **返回体**:
|
||
```json
|
||
{
|
||
"tokens": [
|
||
{
|
||
"id": 151153,
|
||
"token": "eyJhbGciOi...",
|
||
"color": "black",
|
||
"region": "安卓-微信",
|
||
"status": "redeemed",
|
||
"bound_account": "感性的洁少",
|
||
"bound_account_id": "3911959065",
|
||
"redeem_skin": "黑色ROCK长袖T恤",
|
||
"redeem_currency": "幸运币",
|
||
"redeemed_at": "2026-10-05 13:05:07",
|
||
"claimed_at": "2026-10-05 12:59:45",
|
||
"redeem_code": "a4b7d1c94034e6fc52368b61dff20afe"
|
||
}
|
||
],
|
||
"pagination": {
|
||
"page": 1,
|
||
"pageSize": 20,
|
||
"total": 649,
|
||
"totalPages": 33
|
||
}
|
||
}
|
||
```
|
||
|
||
### 4.7 腾讯官方发货履约凭证 (FulfillId)
|
||
在 `POST /api/user/tokens/{id}/refresh` 返回的 `deliveryList` 列表中,包含每一笔发货的腾讯底层官方唯一凭据:
|
||
```json
|
||
{
|
||
"skinId": 27,
|
||
"skin": "黑色ROCK长袖T恤",
|
||
"currencyId": 13,
|
||
"currency": "幸运币",
|
||
"currencyQuantity": 10,
|
||
"time": "2026-10-05T13:05:07.337",
|
||
"role": "安卓-微信-感性的洁少",
|
||
"message": "成功发放",
|
||
"fulfillId": 4519960, // 腾讯官方发货流水号,可直接作为 ProviderOrderNo
|
||
"membership": 202610 // 发放会籍期数
|
||
}
|
||
```
|
||
|
||
### 4.8 异常上报接口 (Report Abnormal)
|
||
- **请求方式**:`POST https://0666.pro/api/user/tokens/{id}/report`
|
||
- **请求头**:`Authorization: Bearer <user_token>`
|
||
- **请求体**:
|
||
```json
|
||
{
|
||
"reason": "买家扫码绑定异常/账号封禁"
|
||
}
|
||
```
|
||
- **作用**:将无法使用的 Token 置为 `abnormal` 异常状态,冻结并报备管理员或提交员。
|
||
|
||
### 4.9 账户体系与登录接口 (Authentication & Profile)
|
||
- **商户信息与积分快照**:
|
||
- **请求方式**:`GET https://0666.pro/api/me`
|
||
- **请求头**:`Authorization: Bearer <user_token>`
|
||
- **返回体**:
|
||
```json
|
||
{
|
||
"user": {
|
||
"id": 10028,
|
||
"username": "王大锤",
|
||
"role": "merchant",
|
||
"points": 8271.2,
|
||
"status": "active"
|
||
}
|
||
}
|
||
```
|
||
- **上游登录机制解构 (EV-16)**:
|
||
- **方式一(无密码短信验证码)**:
|
||
1. 发送验证码:`POST /api/auth/send-code`,Body: `{"username": "商户名"}`
|
||
2. 验证码校验登录:`POST /api/auth/phone-login`,Body: `{"username": "商户名", "code": "123456"}`
|
||
3. 成功后返回 `{"token": "05c55d8b8c...", "user": {...}}`,前端存入 `localStorage.yd_token`。
|
||
- **方式二(Token 直接配置)**:
|
||
直接携带有效的 `yd_token` 发起全部 API 调用。因上游商户账号无固定密码,**实施阶段确认采用后台直接录入 Token 的模式进行对接**,后续再按需考虑是否引入验证码登录交互。
|
||
|
||
---
|
||
|
||
## 五、 已知、未知与对接目标清单
|
||
|
||
### 5.1 已知事项 (Knowns)
|
||
1. **网络通信协议无加密防护**:请求为明文 JSON,无需逆向复杂的 Webpack 虚拟机加解密或 WAF 签名算法,通信门槛低。
|
||
2. **商户账号鉴权特征明确**:上游**无独立密码登录**,仅支持 Token 登录与“用户名+手机短信验证码”登录。登录态通过 `Authorization: Bearer <yd_token>` 全局透传,有效期长且支持通过 `GET /api/me` 实时探测状态与积分余额。
|
||
3. **角色绑定走和平精英官方 H5 授权**:由腾讯官方活动页面(`gp.qq.com`)承接鉴权,安全合规,无风控封号风险。
|
||
4. **提取统一下单通用 Token,绑定后发货前动态选择皮肤**:
|
||
- 提取采购阶段统一下单为“黑色通用 Token”(`1 = 黑色`),生成通用绑定链接;
|
||
- 买家扫码并通过 UID 强一致门禁后,在最终发货调用 `POST /api/redeem/{id}` 时,根据订单商品动态传入 `skin`(黑色ROCK或蓝色运动服)。
|
||
5. **具备官方发货凭证与对账接口**:
|
||
- 上游返回 `fulfillId`(腾讯官方发货单号),可直接作为我们系统的 `ProviderOrderNo`;
|
||
- 提供 `GET /api/user/exchange-records`,支持异步核验与网络超时防重对账。
|
||
6. **公开免登录能力完整**:买家端可直接使用 `redeem_code` 独立完成绑定与兑换,避免在买家端暴露平台主账号的 Bearer Token。
|
||
|
||
### 5.2 核心业务决策与防错机制 (Decisions & Guards)
|
||
1. **后台全反代无感方案**:系统统一反代,买家和打手使用本系统原生提货页 `/delivery/:orderNo`,绝不暴露上游平台。
|
||
2. **UID 强一致防御门禁**:前置强制输入 UID,捕获角色不符时硬阻断发货;记录初始快照防止上游旧绑定信息混淆。
|
||
3. **系统用户采购凭据先落 Token 模式**:后台提供极简 Bearer Token 录入与一键连通性测试(调 `/api/me`),自动读取用户名和积分;暂不接入验证码流程,避免多余交互。
|
||
4. **本地通用库存池与自动补货**:本地维护统一的通用 Token 池,支持采购 50 个、低水位告警与自动补货。
|
||
5. **绑定错误统计与全局总开关**:mismatch 独立看板,全局发货总开关(Kill Switch)一键止血熔断转人工。
|
||
|
||
### 5.3 下一步对接目标 (Next Steps / Goals)
|
||
1. 建立本地 `rock_tokens` 通用库存表与系统配置存储(存储 `rock_bearer_token` 等)。
|
||
2. 开发上游 0666 纯 HTTP 交互模块(Claim 采购、Refresh 刷新、Redeem 兑换、ExchangeRecords 对账、Me 心跳与积分探测)。
|
||
3. 接入后台批量采购 50 个、库存列表、mismatch 统计看板、水位预警(飞书/钉钉)与自动补货任务。
|
||
4. 提货前端接入 UID 前置输入与扫码一致性校验硬阻断。
|
||
5. 完成标准 `RockProvider` 接入既有路由与发货工作台。
|