Base URL:
http://localhost:8080/api/chat认证方式: Bearer Token(若依 JWT,Header:Authorization: Bearer {token}) 数据格式: JSON
场景: 用户/商家进入聊天页面时调用,若已有进行中的会话则复用
POST /session/create
Request Body:
{
"sessionType": 1, // 1=小程序用户, 2=PC商家
"fromUserId": 10001,
"fromUserName": "南风未起",
"fromUserAvatar": "https://..."
}
Response:
{
"code": 200,
"data": {
"sessionId": 1,
"sessionNo": "SESSION_20240316_10001_abc123",
"waiterInfo": {
"waiterId": 5,
"waiterName": "客服小A",
"waiterAvatar": "https://...",
"isOnline": true
}
}
}
场景: PC 坐席端左侧会话列表
GET /session/list?sessionType=1&status=1&keyword=南风&page=1&pageSize=20
Response:
{
"code": 200,
"data": {
"total": 5,
"rows": [
{
"sessionId": 1,
"sessionNo": "SESSION_20240316_10001",
"sessionType": 1,
"fromUserId": 10001,
"fromUserName": "南风未起",
"fromUserAvatar": "https://...",
"lastMsg": "您好,这个结算单显示已失效了",
"lastMsgTime": "2024-03-16 13:18:22",
"unreadCount": 2,
"status": 1
}
]
}
}
PUT /session/{sessionId}/end
PUT /session/{sessionId}/force-end
场景: 进入会话时加载历史记录
GET /message/history?sessionId=1&page=1&pageSize=50&beforeMsgId=100
Response:
{
"code": 200,
"data": {
"total": 25,
"rows": [
{
"msgId": 88,
"sessionId": 1,
"msgNo": "MSG_xxxx",
"senderType": 2,
"senderId": 5,
"senderName": "客服小A",
"senderAvatar": "https://...",
"msgType": "job_card",
"content": null,
"fileUrl": null,
"payload": {
"title": "审计员",
"salary": "13K-23K",
"tags": ["实习", "五险一金", "985"],
"company": "华财仁合",
"location": "上海市·黄浦区",
"urgency": "急招",
"quota": "1 人",
"deadline": "2025-12-12 24:00"
},
"sendTime": "2024-03-16 13:15:56",
"isRead": 1
},
{
"msgId": 92,
"msgType": "order_card",
"payload": {
"orderCardId": 3,
"name": "审计师一级入职定金",
"price": "29.9",
"status": "expired",
"expireTime": "2024-03-16 13:17:10",
"countdown": 0
},
"sendTime": "2024-03-16 13:16:10"
}
]
}
}
POST /message/send/text
Request Body:
{
"sessionId": 1,
"msgNo": "MSG_client_uuid_123",
"msgType": "text",
"content": "您好,有什么可以帮助您的?"
}
POST /message/send/image
Content-Type: multipart/form-data
Form Data:
sessionId: 1msgNo: MSG_xxxfile: [图片文件]Response:
{
"code": 200,
"data": {
"msgId": 99,
"fileUrl": "https://minio.example.com/chat/images/2024/xxx.jpg",
"thumbnailUrl": "https://..."
}
}
POST /message/send/file
Content-Type: multipart/form-data
Form Data:
sessionId: 1msgNo: MSG_xxxfile: [文件]POST /message/send/job-card
Request Body:
{
"sessionId": 1,
"msgNo": "MSG_xxx",
"payload": {
"jobId": 501,
"title": "审计员",
"salary": "13K-23K",
"tags": ["实习", "五险一金", "985"],
"company": "华财仁合",
"location": "上海市·黄浦区",
"urgency": "急招",
"quota": "1 人",
"deadline": "2025-12-12 24:00"
}
}
场景: 客服向小程序用户发送 60 秒倒计时结算单
POST /message/send/order-card
Request Body:
{
"sessionId": 1,
"msgNo": "MSG_xxx",
"payload": {
"orderName": "审计师一级入职定金",
"orderPrice": 29.90,
"orderType": "岗位入职定金"
}
}
Response:
{
"code": 200,
"data": {
"msgId": 100,
"orderCardId": 5,
"expireTime": "2024-03-16 13:17:10",
"countdownSeconds": 60
}
}
🔧 服务端逻辑: 发送后立即记录
expireTime = now() + 60s; 启动定时任务,60 秒后若 status 仍为pending,自动更新为expired并通过 WebSocket broadcast 通知双端更新 UI 状态。
PUT /message/read
Request Body:
{
"sessionId": 1,
"lastReadMsgId": 99
}
GET /order-card/{orderCardId}
Response:
{
"code": 200,
"data": {
"orderCardId": 5,
"status": "pending",
"expireTime": "2024-03-16 13:17:10",
"countdown": 38,
"orderName": "审计师一级入职定金",
"orderPrice": 29.90
}
}
POST /order-card/{orderCardId}/pay
Response:
{
"code": 200,
"data": {
"payUrl": "weixin://...",
"orderCardId": 5,
"status": "paid"
}
}
GET /seat/list?keyword=客服&status=1&module=小程序&page=1&pageSize=10
POST /seat
Request Body:
{
"seatName": "客服小D",
"avatar": "base64://... 或 URL",
"module": "小程序",
"status": 1,
"waiterIds": [1001, 1002]
}
PUT /seat/{id}
DELETE /seat/{id}
PUT /seat/{id}/status
Request Body: {"status": 0}
POST /seat/avatar/upload
Content-Type: multipart/form-data
GET /ticket/list?status=pending&source=小程序&keyword=&page=1&pageSize=10
GET /ticket/{ticketId}
PUT /ticket/{ticketId}/handle
Request Body:
{
"status": "completed",
"reply": "您好,问题已处理完毕..."
}
GET /user-order/list?userId=10001&type=all&page=1&pageSize=10
Response:
{
"code": 200,
"data": {
"rows": [
{
"orderId": "CP2024031601",
"orderName": "初级审计员岗位测评订单",
"amount": "29.90",
"createTime": "2024-03-16 10:22:00",
"status": "paid",
"statusLabel": "已支付"
}
]
}
}
GET /merchant-order/list?merchantId=20001&page=1&pageSize=10
详见
WebSocket消息协议.md
| 端点 | 说明 |
|---|---|
ws://host/ws/chat |
WebSocket 握手端点 |
订阅: /topic/session/{sessionNo} |
订阅该会话的实时消息(双端) |
订阅: /user/{userId}/queue/notify |
用户私聊通知(新会话、已读回执) |
发布: /app/chat/send |
客户端发送消息到服务端 |