# 无限聚核开放平台 · V1 API 文档

> 无限聚核开放平台 V1 团购核销接口文档，收录 6 个已获得生产样本确认的公开接口与代码确认的授权接口。

- 官方页面：https://doc.elys.cn/v1
- API Host：`https://open-hx.umember.cn`
- Content-Type：`application/json`
- 成功判断：`10000`

本文档由无限聚核公开 API 的结构化数据自动生成。接入时以当前字段、鉴权、成功判断和风险说明为准，不要猜测未列出的接口或参数。

## 快速接入

按以下顺序完成 V1 核销链路接入。

1. **获取 V1 Token**：调用 /open/login，使用注册邮箱与密码获取 V1 Token。后续请求在 Authorization 请求头中直接传 Token，不加 Bearer。
2. **获取系统门店 ID**：调用 /open/user/meituan/store/list，从安全业务字段 data[].child_stores[].store_id 中取得后续查询与核销使用的系统门店 ID。
3. **先查券详情，再确认核销**：先调用 /open/user/meituan/coupon/detail 并检查 data.status_code；确认券可用后，再由用户明确触发 /open/user/meituan/coupon/verify。超时或结果未知时不要自动重试。

## 美团合作授权

无限聚核已获得美团技术服务合作授权，为商户提供相关 API 产品服务。

![宁德无限递归网络科技有限公司美团合作授权书](https://cdn.umember.cn/assets/mt_auth.jpg)

美团合作授权书 · 点击图片可查看原图

## 授权接口

该接口已通过代码确认，用于获取后续接口所需的 V1 Token；示例账号、密码及返回值均已脱敏。

### 获取 Token

- 方法：`POST`
- URL：`https://open-hx.umember.cn/open/login`
- 在线调试风险：只读请求
- 授权：无需 Authorization 请求头。
- 说明：使用注册邮箱与密码获取 V1 Token。后续接口在 Authorization 请求头中直接传 Token，不加 Bearer。

#### JSON Body 参数

- `email`（`string`，必填）：注册邮箱。
- `password`（`string`，必填）：登录密码。

#### 请求示例

##### 请求示例 · 已脱敏

```json
{
  "email": "user@example.com",
  "password": "<登录密码>"
}
```

#### 响应字段

- `code`（`number`，必填）：外层业务码；成功时为 10000。
- `msg`（`string`，必填）：外层业务消息。
- `data`（`object`，必填）：登录用户与 Token 数据。
- `data.token`（`string`，必填）：后续 V1 接口使用的 Token；请求头直接传值，不加 Bearer。
- `count`（`number`，必填）：响应记录数。
- `date_time`（`string`，必填）：服务端响应时间。

#### 响应示例

##### 代码确认 · 成功响应（敏感字段已脱敏）

```json
{
  "code": 10000,
  "msg": "success",
  "data": {
    "username": "示例用户",
    "id": 10000,
    "phone": "138****0000",
    "token": "<V1_TOKEN>",
    "openid": "",
    "sessionKey": ""
  },
  "count": 1,
  "date_time": "2099-01-01 12:00:00"
}
```

## 生产已确认接口

以下 6 条路径已获得生产真实样本确认，但可信范围仅限各接口 badge 和 notes 明确列出的场景。

### 商户/门店列表

- 方法：`GET`
- URL：`https://open-hx.umember.cn/open/user/meituan/store/list`
- 在线调试风险：只读请求
- 授权：Authorization 请求头直接传 V1 Token，不加 Bearer。
- 说明：获取当前 Token 所属账号的商户和门店。公开文档只列安全业务白名单字段；响应中可能存在的内部配置字段不属于公开契约。

#### Headers

- `Authorization`（`string`，必填）：V1 Token，直接传 Token 值，不加 Bearer。

#### 请求示例

##### HTTP

```http
GET /open/user/meituan/store/list
Authorization: <V1_TOKEN>
```

#### 响应字段

- `code`（`number`，必填）：外层业务码；本次非空成功样本为 10000。
- `msg`（`string`，必填）：外层消息；本次非空成功样本为 success。
- `data`（`array`，必填）：商户数组。空结果形态尚未实测确认。
- `data[].store_id`（`number`，必填）：商户的系统内部 ID。
- `data[].store_name`（`string`，必填）：商户名称。
- `data[].request_count`（`number`，必填）：商户剩余核销次数。
- `data[].expire_time`（`string`，必填）：授权或服务过期时间。
- `data[].status`（`number`，必填）：商户状态。具体枚举仍需补充确认。
- `data[].child_stores`（`array`，必填）：商户下的门店列表。
- `data[].child_stores[].store_id`（`number`，必填）：系统门店 ID；后续套餐、详情和核销接口使用此值。
- `data[].child_stores[].store_name`（`string`，必填）：门店名称。
- `data[].child_stores[].meituan_store_id`（`string`，必填）：美团平台门店 ID；未绑定时可能为空。
- `data[].child_stores[].douyin_store_id`（`string`，必填）：抖音平台门店 ID；未绑定时可能为空。
- `data[].child_stores[].meituan_auth`（`number`，必填）：美团授权状态。具体枚举仍需补充确认。
- `data[].child_stores[].douyin_auth`（`number`，必填）：抖音授权状态。具体枚举仍需补充确认。
- `data[].child_stores[].enable_new_api`（`number`，必填）：是否启用新接口链路的业务标记。
- `data[].child_stores[].only_douyin`（`number | boolean`，必填）：是否为抖音专属门店的兼容标记。
- `data[].child_stores[].address`（`string`，必填）：门店地址。
- `data[].child_stores[].city_name`（`string`，必填）：门店所在城市。
- `count`（`number`，必填）：当前生产样本中 count 与 data.length 不一致，不能作为数组长度或可靠总数。
- `date_time`（`string`，必填）：服务端响应时间，格式 YYYY-MM-DD HH:mm:ss。

#### 响应示例

##### 生产确认字段 · 全部示例值均为掩码占位符

```json
{
  "code": 10000,
  "msg": "success",
  "data": [
    {
      "store_id": 10000,
      "store_name": "示例商户 A",
      "request_count": 1200,
      "expire_time": "2099-12-31 23:59:59",
      "status": 1,
      "child_stores": [
        {
          "store_id": 10001,
          "store_name": "示例门店",
          "meituan_store_id": "MT_STORE_***",
          "douyin_store_id": "",
          "meituan_auth": 1,
          "douyin_auth": 0,
          "enable_new_api": 1,
          "only_douyin": 0,
          "address": "<门店地址已脱敏>",
          "city_name": "<城市已脱敏>"
        }
      ]
    },
    {
      "store_id": 20000,
      "store_name": "示例商户 B",
      "request_count": 0,
      "expire_time": "2099-12-31 23:59:59",
      "status": 1,
      "child_stores": []
    }
  ],
  "count": 1,
  "date_time": "2099-01-01 12:00:00"
}
```

### 美团套餐列表

- 方法：`GET`
- URL：`https://open-hx.umember.cn/open/user/meituan/coupon/list`
- 在线调试风险：只读请求
- 授权：Authorization 请求头直接传 V1 Token，不加 Bearer。
- 说明：获取指定系统门店在美团上的套餐列表。已确认金额字段为 string，两个 SKU ID 字段为 number。

#### Headers

- `Authorization`（`string`，必填）：V1 Token，直接传 Token 值，不加 Bearer。

#### Query 参数

- `store_id`（`number | numeric string`，必填）：系统门店 ID，当前 Token 所属账号必须拥有该门店。
- `page`（`number | numeric string`，选填）：页码；生产已确认 page=1 的非空成功场景。；默认值：1

#### 请求示例

##### HTTP

```http
GET /open/user/meituan/coupon/list?store_id=<系统门店 ID>&page=1
Authorization: <V1_TOKEN>
```

#### 响应字段

- `code`（`number`，必填）：外层业务码；本次非空成功样本为 10000。
- `msg`（`string`，必填）：外层消息；本次非空成功样本为 success。
- `data`（`array`，必填）：美团套餐数组。空页形态尚未实测确认。
- `data[].actual_amount`（`string`，必填）：套餐实际价格，字符串类型。
- `data[].origin_amount`（`string`，必填）：套餐原价，字符串类型。
- `data[].product_name`（`string`，必填）：套餐名称。
- `data[].sku_id`（`number`，必填）：美团团单 ID。
- `data[].dp_sku_id`（`number`，必填）：点评团单 ID。
- `data[].sku_name`（`string`，必填）：套餐名称兼容字段。
- `data[].status`（`number`，必填）：V1 套餐状态；本次样本为 3。
- `data[].status_text`（`string`，必填）：套餐状态文本，例如售卖中或已下线。
- `count`（`number`，必填）：本次生产样本中等于当前返回数组条数；其他分页场景仍待确认。
- `date_time`（`string`，必填）：服务端响应时间，格式 YYYY-MM-DD HH:mm:ss。

#### 响应示例

##### 生产确认字段 · 全部业务值均为虚构或掩码

```json
{
  "code": 10000,
  "msg": "success",
  "data": [
    {
      "actual_amount": "79.90",
      "origin_amount": "99.00",
      "product_name": "示例套餐",
      "sku_id": 90001,
      "dp_sku_id": 90002,
      "sku_name": "示例套餐",
      "status": 3,
      "status_text": "售卖中"
    }
  ],
  "count": 1,
  "date_time": "2099-01-01 12:00:00"
}
```

### 抖音套餐列表

- 方法：`GET`
- URL：`https://open-hx.umember.cn/open/user/douyin/coupon/list`
- 在线调试风险：只读请求
- 授权：Authorization 请求头直接传 V1 Token，不加 Bearer。
- 说明：获取指定系统门店在抖音上的套餐列表。已确认金额为 number，sku_id 为 string。

#### Headers

- `Authorization`（`string`，必填）：V1 Token，直接传 Token 值，不加 Bearer。

#### Query 参数

- `store_id`（`number | numeric string`，必填）：系统门店 ID，当前 Token 所属账号必须拥有该门店。
- `count`（`number | numeric string`，选填）：期望每页条数；小于 1 时恢复为默认值。wxdg 路由当前不会将该参数传给 Node 下游。；默认值：10
- `page`（`number | numeric string`，选填）：页码；小于 1 时恢复为默认值。wxdg 路由当前不会将该参数传给 Node 下游。；默认值：1

#### 请求示例

##### HTTP

```http
GET /open/user/douyin/coupon/list?store_id=<系统门店 ID>&count=10&page=1
Authorization: <V1_TOKEN>
```

#### 响应字段

- `code`（`number`，必填）：外层业务码；本次非空成功样本为 10000。
- `msg`（`string`，必填）：外层消息；本次非空成功样本为 success。
- `data`（`array`，必填）：抖音套餐数组。空结果形态尚未实测确认。
- `data[].actual_amount`（`number`，必填）：套餐实际价格，number 类型。
- `data[].origin_amount`（`number`，必填）：套餐原价，number 类型。
- `data[].product_name`（`string`，必填）：套餐名称。
- `data[].sku_id`（`string`，必填）：抖音 SKU ID，字符串类型。
- `data[].sku_name`（`string`，必填）：套餐名称兼容字段。
- `count`（`number`，必填）：本次生产样本中等于当前返回数组条数。
- `date_time`（`string`，必填）：服务端响应时间，格式 YYYY-MM-DD HH:mm:ss。

#### 响应示例

##### 生产确认字段 · 全部业务值均为虚构或掩码

```json
{
  "code": 10000,
  "msg": "success",
  "data": [
    {
      "actual_amount": 59.9,
      "origin_amount": 79.9,
      "product_name": "示例套餐",
      "sku_id": "DY_SKU_***",
      "sku_name": "示例套餐"
    }
  ],
  "count": 1,
  "date_time": "2099-01-01 12:00:00"
}
```

### 历史混合团购券详情

- 方法：`GET`
- URL：`https://open-hx.umember.cn/open/user/meituan/coupon/detail`
- 在线调试风险：只读请求
- 授权：Authorization 请求头直接传 V1 Token，不加 Bearer。
- 说明：查询团购券详情。该历史路径可能先尝试抖音再回退美团，因此路径中的 meituan 不代表最终 coupon_channel。

#### Headers

- `Authorization`（`string`，必填）：V1 Token，直接传 Token 值，不加 Bearer。

#### Query 参数

- `store_id`（`number | numeric string`，必填）：系统门店 ID，当前 Token 所属账号必须拥有该门店。
- `coupon_code`（`string`，必填）：团购券码；美团路径会去除空格，抖音分享链接可能被解析。

#### 请求示例

##### HTTP

```http
GET /open/user/meituan/coupon/detail?store_id=<系统门店 ID>&coupon_code=<已掩码券码>
Authorization: <V1_TOKEN>
```

#### 响应字段

- `code`（`number`，必填）：外层业务码；已使用场景也可能为 10000，不能单独判断券是否可用。
- `msg`（`string`，必填）：外层消息；可能是 success、Success 或上游业务提示。
- `data`（`object`，必填）：券详情对象。
- `data.sku_id`（`string`，必填）：套餐 SKU ID；已使用失败样本中为兼容占位值。
- `data.price`（`number`，必填）：套餐价格；已使用失败样本中为 0。
- `data.order_id`（`string`，必填）：订单号；已使用失败样本中为空字符串。
- `data.sku_name`（`string`，必填）：套餐名称；已使用失败样本中可能为空字符串。
- `data.status`（`string`，必填）：券状态文本；已确认未使用和已使用。
- `data.status_code`（`number`，必填）：券状态码；已确认 0 表示未使用、1 表示已使用。调用方必须判断此字段。
- `data.coupon_channel`（`meituan | douyin`，必填）：实际识别出的券渠道，不能根据 URL 路径推断。
- `data.coupon_code`（`string`，必填）：业务侧原始券码，属于敏感数据；展示和日志必须脱敏。
- `data.certificate_id`（`string`，选填）：抖音券且存在证书标识时返回。
- `data.rawData`（`unknown`，选填）：仅部分美团未使用场景存在的上游原始数据；敏感且结构不稳定，不应展示、复制或依赖。
- `count`（`number`，必填）：已确认详情响应为 1。
- `date_time`（`string`，必填）：服务端响应时间，格式 YYYY-MM-DD HH:mm:ss。

#### 响应示例

##### 生产已确认 · 未使用（敏感字段已掩码，rawData 不展示）

```json
{
  "code": 10000,
  "msg": "Success",
  "data": {
    "sku_id": "MT_SKU_***",
    "price": 79.9,
    "order_id": "ORDER_***",
    "sku_name": "示例套餐",
    "status": "未使用",
    "status_code": 0,
    "coupon_channel": "meituan",
    "coupon_code": "****1234"
  },
  "count": 1,
  "date_time": "2099-01-01 12:00:00"
}
```

##### 生产已确认 · 已使用（业务消息已脱敏）

```json
{
  "code": 10000,
  "msg": "<已使用业务提示已脱敏>",
  "data": {
    "sku_id": "0",
    "price": 0,
    "order_id": "",
    "sku_name": "",
    "status": "已使用",
    "status_code": 1,
    "coupon_channel": "meituan",
    "coupon_code": "****1234"
  },
  "count": 1,
  "date_time": "2099-01-01 12:00:00"
}
```

### 历史混合核销

- 方法：`POST`
- URL：`https://open-hx.umember.cn/open/user/meituan/coupon/verify`
- 在线调试风险：会改变业务状态；调用前必须确认：我确认门店、券码和环境无误，并同意立即执行真实核销。
- 授权：Authorization 请求头直接传 V1 Token，不加 Bearer。
- 说明：核销美团或抖音团购券。当前生产实测仅确认重复/已使用券由 Go 历史记录拦截；首次成功核销结构仍是代码推导。

#### Headers

- `Authorization`（`string`，必填）：V1 Token，直接传 Token 值，不加 Bearer。

#### JSON Body 参数

- `store_id`（`number | numeric string`，必填）：系统门店 ID，当前 Token 所属账号必须拥有该门店。
- `coupon_code`（`string`，必填）：团购券码；服务端会去除空格。

#### 请求示例

##### JSON · 全部业务值均为掩码占位符

```json
{
  "store_id": 10001,
  "coupon_code": "****1234"
}
```

#### 响应字段

- `code`（`number`，必填）：外层业务码；代码推导的首次成功为 10000，生产确认的重复拦截为 10500。
- `msg`（`string`，必填）：外层消息。重复拦截时包含已核销业务提示，展示前必须脱敏。
- `data`（`object`，选填）：订单已创建时的核销结果或最小订单定位对象；建单前失败不包含 data。
- `data.wxdgOrderNo`（`string`，选填）：无限聚核系统账单订单号。首次成功、成功重放、明确拒绝、结果未知及已建单处理异常时返回。
- `data.verify_message`（`string`，选填）：核销结果消息；首次成功结构为代码推导。
- `data.verify_success`（`boolean`，选填）：核销是否成功；存在 data 时必须判断此字段，不能只判断外层 code。
- `data.consume_details`（`array`，选填）：消费金额等核销明细；首次成功完整结构尚未生产实测。
- `data.consume_details[].amount`（`string`，选填）：金额展示文本。
- `data.consume_details[].amountName`（`string`，选填）：金额项目名称。
- `data.consume_details[].amountSubName`（`string`，选填）：金额项目补充名称。
- `data.consume_details[].hasPayment`（`boolean`，选填）：是否包含支付信息。
- `data.coupon_channel`（`meituan | douyin`，选填）：实际核销渠道。
- `data.coupon_code`（`string`，选填）：业务券码，属于敏感数据；展示和日志必须脱敏。
- `data.certificate_id`（`string`，选填）：抖音券且存在证书标识时返回。
- `count`（`number`，选填）：首次成功时可能存在；重复拦截实测响应不包含 count。
- `date_time`（`string`，必填）：服务端响应时间，格式 YYYY-MM-DD HH:mm:ss。

#### 响应示例

##### 代码推导 · 首次成功结构（尚未生产实测）

```json
{
  "code": 10000,
  "msg": "success",
  "data": {
    "verify_message": "验证成功",
    "verify_success": true,
    "consume_details": [
      {
        "amount": "￥79.90",
        "amountName": "消费金额",
        "amountSubName": "",
        "hasPayment": false
      }
    ],
    "coupon_channel": "meituan",
    "coupon_code": "****1234",
    "wxdgOrderNo": "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08"
  },
  "count": 1,
  "date_time": "2099-01-01 12:00:00"
}
```

##### 生产已确认 · 重复/已使用拦截

```json
{
  "code": 10500,
  "msg": "<已核销时间与门店信息已脱敏>",
  "data": {
    "wxdgOrderNo": "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08"
  },
  "date_time": "2099-01-01 12:00:00"
}
```

### 核销请求记录

- 方法：`POST`
- URL：`https://open-hx.umember.cn/open/user/request/logs`
- 在线调试风险：只读请求
- 授权：Authorization 请求头直接传 V1 Token，不加 Bearer。
- 说明：分页查询当前账号名下门店的核销请求记录。该接口当前可能返回未递归脱敏的原始 params，公开页面必须限制展示、复制和测试。

#### Headers

- `Authorization`（`string`，必填）：V1 Token，直接传 Token 值，不加 Bearer。

#### JSON Body 参数

- `page`（`number | numeric string`，选填）：页码；缺省或小于等于 0 时使用默认值。；默认值：1
- `rows`（`number | numeric string`，选填）：每页条数；缺省或小于等于 0 时使用默认值。；默认值：10
- `store_id`（`number | numeric string`，选填）：按系统门店 ID 过滤；只允许查询当前账号名下门店，无权限 ID 返回空列表。
- `begin_time`（`string`，选填）：开始时间过滤值，当前实现原样传入查询；格式边界仍待实测。
- `end_time`（`string`，选填）：结束时间过滤值，当前实现原样传入查询；格式边界仍待实测。

#### 请求示例

##### JSON · 默认分页

```json
{
  "page": 1,
  "rows": 10
}
```

#### 响应字段

- `code`（`number`，必填）：外层业务码；本次默认分页非空成功样本为 10000。
- `msg`（`string`，必填）：外层消息；本次样本为 success。
- `data`（`array`，必填）：当前页核销记录数组。空结果形态尚未实测确认。
- `data[].store_id`（`number`，必填）：系统门店 ID。
- `data[].store_name`（`string`，必填）：门店名称。
- `data[].update_mode`（`string`，必填）：核销扣减模式，例如次数或 token。
- `data[].update_type`（`string`，必填）：扣减主体，例如 store 或 admin。
- `data[].used_tokens`（`number`，必填）：token 模式下由分换算为元；非 token 模式为 0。属于敏感业务数据，展示时应按权限处理。
- `data[].api_name`（`string`，必填）：核销请求的接口名称。
- `data[].coupon_channel`（`string`，必填）：券渠道，例如 meituan 或 douyin。
- `data[].coupon_code`（`string`，必填）：券码，属于敏感数据；公开展示、复制和日志必须脱敏。
- `data[].params`（`string`，必填）：历史请求参数 JSON 字符串；可能包含 ticketInfo、券码和平台账号参数。服务端递归脱敏完成前不得展示、复制或用于在线测试。
- `data[].created_at`（`string`，必填）：记录创建时间，格式 YYYY-MM-DD HH:mm:ss。
- `count`（`number`，必填）：数据库查询总数，不是当前页 data.length。
- `date_time`（`string`，必填）：服务端响应时间，格式 YYYY-MM-DD HH:mm:ss。

#### 响应示例

##### 生产确认字段 · params 已刻意省略，其他业务值均为掩码

```json
{
  "code": 10000,
  "msg": "success",
  "data": [
    {
      "store_id": 10001,
      "store_name": "<门店名称已脱敏>",
      "update_mode": "count",
      "update_type": "store",
      "used_tokens": 0,
      "api_name": "核销验券",
      "coupon_channel": "meituan",
      "coupon_code": "****1234",
      "created_at": "2099-01-01 12:00:00"
    }
  ],
  "count": 1,
  "date_time": "2099-01-01 12:00:00"
}
```

## 接口调用流程

V1 公开核销链路建议按以下顺序调用。

### 团购券查询与核销

1. 从开发者后台获取 V1 Token，并在 Authorization 请求头中直接传递。
2. 调用商户/门店列表，取得当前账号名下的系统门店 store_id。
3. 按平台调用美团或抖音套餐列表，用于展示可售套餐。
4. 调用历史混合团购券详情，检查 data.status_code；code=10000 不能单独代表券可用。
5. 由用户明确确认后调用核销接口，并判断 data.verify_success；业务异常通常仍为 HTTP 200。
6. 核销超时或结果未知时不要自动重试；先通过安全的业务记录或人工流程确认最终状态。

## 技术支持

扫码添加微信，获取接入帮助
