Files
affiliate_dash/docs/rock发货平台(0666.pro)逆向与接口分析.md
yml2213 ef7f67dd0c feat(fulfillment): 接入Rock发货平台(0666.pro)代理履约、通用库存池与UID强一致风控
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配置与连通测试、库存监控、一键补货及错单解冻重置。
2026-10-05 14:56:11 +08:00

376 lines
18 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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&timestamp=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` 接入既有路由与发货工作台。