# 会员营销模块 — 移动端接口文档
> **模块**:business-marketing(HTTP 入口在 business-mobile-gateway)
> **前缀**:`${jeesharp.web.mobilePath}`(默认 `/mobile`)
> **更新日期**:2026-06-25
> **版本**:P0
---
## 一、接口规范
### 1.1 请求头(登录接口)
```
Content-Type: application/json;charset=UTF-8
access_token: {token}
X-Platform: MINI | APP | H5
X-Device-Id: {deviceId}
```
### 1.2 响应格式
```json
{
"code": 200,
"msg": "操作成功",
"data": { },
"requestId": "uuid-xxx"
}
```
### 1.3 租户约定
- C 端 **不传全局租户 Header**。
- 扫码后前端保存 `currentTenantCode`(来自 landing 接口)。
- 领券/核销等接口 **Body 带 `tenantCode`**,后端强校验与券/入会关系一致。
### 1.4 免登录通道
须同时满足:
1. 后端路径 `/mobile/noAuth/marketing/**`
2. 前端 `skipAuth: true`
---
## 二、扫码落地(免登录)`noAuth/marketing/tenant`
**Controller**:`MarketingTenantNoAuthMobileController`
### 2.1 解析 scene 获取店铺信息
- **URL**:`GET /noAuth/marketing/tenant/landing`
- **认证**:免登录(`skipAuth: true`)
**Query**:
| 参数 | 必填 | 说明 |
|------|------|------|
| scene | ✅ | 小程序码 scene |
**响应 data**:
| 字段 | 说明 |
|------|------|
| tenantId | 店铺租户ID |
| tenantCode | 店铺租户编码 |
| tenantName | 店铺名称(来自 sys_tn_tenant_info) |
| marketingEnabled | 是否开通营销 |
| autoJoinOnQr | 是否扫码免审 |
| welcomeTitle / welcomeSubtitle | 落地文案 |
| logoUrl | Logo |
| channelCode | 解析出的渠道 |
---
## 三、店铺会员 `marketing/memberTenant`
**Controller**:`MemberTenantMobileController`
**基础路径**:`/mobile/marketing/memberTenant`
### 3.1 扫码入会 / 绑定店铺
- **URL**:`POST /join`
- **认证**:需要登录
**请求体**:
```json
{
"tenantCode": "T10086",
"channelCode": "DEFAULT"
}
```
**响应**:绑定关系摘要;已绑定幂等返回成功。
### 3.2 我的店铺列表
- **URL**:`GET /myTenants`
- **认证**:需要登录
**响应 data**:`[{ tenantId, tenantCode, tenantName, joinDate, bindStatus }]`
---
## 四、店铺优惠券 `marketing/coupon`
**Controller**:`MarketingCouponMobileController`
**基础路径**:`/mobile/marketing/coupon`
**说明**:内部编排 `MemberCouponMobileApi`(coupon-api)
### 4.1 可领券列表
- **URL**:`POST /available`
- **认证**:需要登录
**请求体**:
```json
{
"tenantCode": "T10086",
"pageNo": 1,
"pageSize": 10
}
```
**前置**:已入会该 `tenantCode`;仅返回该租户下 `STORE_OFFLINE` 场景且进行中的模板。
### 4.2 领取优惠券
- **URL**:`POST /receive`
- **认证**:需要登录
**请求体**:
```json
{
"tenantCode": "T10086",
"templateId": "模板ID"
}
```
### 4.3 我的优惠券(当前店铺)
- **URL**:`POST /myList`
- **认证**:需要登录
**请求体**:
```json
{
"tenantCode": "T10086",
"pageNo": 1,
"pageSize": 10,
"status": 0
}
```
`status`:0未用 1已用 2过期 3冻结 4作废。
### 4.4 券详情 / 卡面
- **URL**:`GET /detail?memberCouponId={id}&tenantCode={code}`
- **认证**:需要登录
### 4.5 到店核销动态码
- **URL**:`GET /verifyCode?memberCouponId={id}&tenantCode={code}`
- **认证**:需要登录
- **说明**:返回短时 token(如 60s)与二维码 payload,供店员扫描。
**响应 data**:
| 字段 | 说明 |
|------|------|
| verifyToken | 核销令牌 |
| expireAt | 过期时间戳 |
| qrcodeContent | 二维码内容 |
---
## 五、店员核销 `marketing/clerk/coupon`
**Controller**:`MarketingCouponVerifyMobileController`
**基础路径**:`/mobile/marketing/clerk/coupon`
### 5.1 扫码核销
- **URL**:`POST /verify`
- **认证**:需要登录(店员账号,租户上下文=当前店铺)
**请求体**:
```json
{
"tenantCode": "T10086",
"verifyToken": "动态码令牌"
}
```
**校验**:
1. 店员租户 == `tenantCode`
2. 券 `tenant_id` == 该租户
3. 券未用、未过期
4. 幂等:同一 token 重复提交返回成功
**响应 data**:券名、会员脱敏信息、核销时间。
### 5.2 核销记录(店员/店长)
- **URL**:`POST /verifyRecords`
- **认证**:需要登录
**请求体**:分页 + `tenantCode` + 时间范围
---
## 六、Gateway 依赖与 Api 契约(P0)
**business-mobile-gateway/pom.xml** 须增加:
```xml
com.xinghuacuntravel
business-marketing-api
com.xinghuacuntravel
business-marketing-bean
```
**MarketingMobileApi**(business-marketing-api,由 ApiImpl 实现):
| 方法 | 说明 |
|------|------|
| resolveLandingByScene(scene) | 扫码落地 |
| joinTenant(memberId, dto) | 入会 |
| listMyTenants(memberId) | 我的店铺 |
| pageAvailableCoupons(...) | 可领券 |
| receiveCoupon(...) | 领券 |
| pageMyCoupons(...) | 我的券 |
| getVerifyCode(...) | 动态核销码 |
| verifyCoupon(...) | 店员核销 |
---
## 七、coupon-api 扩展(P0,在 business-coupon 实现)
### MemberCouponLifecycleApi
```java
void offlineConfirmUsed(MemberCouponOfflineConfirmDTO dto);
```
**DTO 要点**:
| 字段 | 说明 |
|------|------|
| memberCouponId | 会员券ID |
| memberId | 会员ID |
| tenantId / tenantCode | 券归属租户 |
| verifyToken | 幂等号 |
| operatorId | 店员 |
---
## 八、白名单配置(web-starter)
在 `jeesharp.member-auth.sa-interceptor.exclude-path-patterns` 追加:
```yaml
- /mobile/noAuth/marketing/**
```
**勿** 放行 `/mobile/marketing/**` 整体(写操作须登录)。
---
## 九、接口地址速查表
| 操作 | 方法 | URL | 认证 |
|------|------|-----|------|
| 扫码落地 | GET | `/mobile/noAuth/marketing/tenant/landing` | 否 |
| 入会 | POST | `/mobile/marketing/memberTenant/join` | 是 |
| 我的店铺 | GET | `/mobile/marketing/memberTenant/myTenants` | 是 |
| 可领券 | POST | `/mobile/marketing/coupon/available` | 是 |
| 领券 | POST | `/mobile/marketing/coupon/receive` | 是 |
| 我的券 | POST | `/mobile/marketing/coupon/myList` | 是 |
| 券详情 | GET | `/mobile/marketing/coupon/detail` | 是 |
| 到店码 | GET | `/mobile/marketing/coupon/verifyCode` | 是 |
| 店员核销 | POST | `/mobile/marketing/clerk/coupon/verify` | 是 |
| 核销记录 | POST | `/mobile/marketing/clerk/coupon/verifyRecords` | 是 |
---
## 十、状态码
遵循 [mobile-api-rules](../../.cursor/rules/api/mobile-api-rules.mdc):`200` 成功、`201` 需登录、`203` 参数错误等。
---
## 十一、更新日志
| 版本 | 日期 | 说明 |
|------|------|------|
| 1.0.0 | 2026-06-25 | P0 初版 |