🏠 返回管理后台 🧪 API测试

📚 API 接入文档 v2.1

积分系统服务端接口文档 - 适用于网赚APP接入

更新日期: 2026-03-10 | 版本: 2.1 | 已修复并发安全漏洞

基础信息
接口地址: https://points.jahonn.cn/api
备用地址: http://49.233.164.83/api
数据格式: JSON
编码: UTF-8
健康检查: /health

🔐 认证方式

所有请求需要携带以下参数:

参数说明示例
appIdAPP唯一标识my-app-001
timestamp当前时间戳(毫秒)1709891200000
sign签名(MD5)见下方签名算法

签名算法

// 重要:使用标准MD5库(避免浏览器内置MD5差异) // 拼接字符串: appId={appId}×tamp={timestamp}&key={secretKey} const signStr = `appId=${appId}×tamp=${timestamp}&key=${secretKey}`; // 推荐使用 CryptoJS.MD5 或 Node.js crypto const sign = CryptoJS.MD5(signStr).toString(); // 32位小写
签名注意事项
1. 使用标准MD5库(CryptoJS或系统crypto)
2. 确保参数顺序为:appId → timestamp → key
3. 签名错误示例:demo-app-001×tamp=1773106652866&key=demo-secret-key → bd0209dc63a079daa1ebfc15b25a7811

👤 认证与用户模块

1. 微信授权登录

接口POST /api/auth/wx-login
说明微信授权登录,首次登录自动注册,支持邀请码
风控设备限制、IP限制、黑名单检查

请求参数:

{ "appId": "demo-app-001", // 应用ID "timestamp": "1773106652866", // 当前毫秒时间戳 "sign": "bd0209dc63a079daa1ebfc15b25a7811", // MD5签名 "code": "08123abc", // 微信授权code "deviceId": "device-001", // 设备唯一标识 "inviteCode": "TEST001" // 邀请码(可选) }

返回数据:

{ "code": 0, "data": { "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", "user": { "id": "c5775a66-e3aa-4359-84cb-8f40e64dbfab", "nickname": "用户昵称", "avatar": "https://...", "balance": 0, // 积分余额 "inviteCode": "ABCDEF" // 用户自己的邀请码 } } }

2. 游客登录

接口POST /api/auth/guest-login
说明无需微信授权,快速游客登录
参数deviceId, nickname, inviteCode(可选)

3. Token刷新

接口POST /api/auth/refresh
说明刷新JWT Token(不检查过期)
Body{"token": "旧token"}

4. 获取用户信息

接口GET /api/user/profile
HeaderAuthorization: Bearer {token}

5. 绑定手机号

接口POST /api/user/bind-phone
HeaderAuthorization: Bearer {token}
Body{"phone": "13800138000"}

💰 积分模块

1. 获取积分余额

接口GET /api/points/balance
HeaderAuthorization: Bearer {token}
返回数据 { "code": 0, "data": { "balance": 100, // 可用积分 "frozen": 50, // 冻结积分(提现中) "total": 150 // 累计获得积分 } }

2. 获取积分流水

接口GET /api/points/logs?page=1&limit=20
HeaderAuthorization: Bearer {token}
查询参数page=页码(默认1), limit=每页条数(默认20)
返回数据 { "code": 0, "data": { "list": [{ "id": "记录ID", "type": 1, // 1=收入, 2=支出 "amount": 100, // 变动金额 "balance": 150, // 变动后余额 "source": "task", // 来源:task/signin/invite/exchange等 "description": "完成任务", "createdAt": "2026-03-10T02:49:07.000Z" }], "pagination": { "page": 1, "limit": 20, "total": 45 } } }

📋 任务模块

1. 获取任务列表

接口GET /api/task/list
HeaderAuthorization: Bearer {token}
查询参数type (可选) - 任务类型:1=每日任务, 2=成长任务, 3=新手任务

2. 获取我的任务状态

接口GET /api/task/my
HeaderAuthorization: Bearer {token}
说明返回用户今日完成任务状态

3. 完成任务

接口POST /api/task/complete
HeaderAuthorization: Bearer {token}
Body{"taskId": "任务ID"}
风控任务频率限制,防刷
自动触发首次完成任务自动激活邀请奖励

📅 签到模块

1. 获取签到状态

接口GET /api/signin/status
HeaderAuthorization: Bearer {token}
返回数据 { "code": 0, "data": { "todaySigned": false, // 今日是否已签到 "continueDays": 3, // 连续签到天数 "todayReward": 25, // 今日签到可获奖励 "signedDays": 3, // 本月已签到天数 "records": [{ // 本月签到记录 "day": 10, // 签到日(1-31) "reward": 20, // 当日奖励 "continueDays": 2 // 当日连续天数 }] } }

2. 执行签到

接口POST /api/signin/do
HeaderAuthorization: Bearer {token}
安全特性Redis分布式锁 + 唯一约束,防止并发重复签到
返回数据 { "code": 0, "data": { "reward": 25, // 获得奖励 "continueDays": 4, // 新的连续天数 "balance": 125 // 当前积分余额 } }
奖励规则 第1天: 10积分
第2天: 10积分
第3天: 20积分
第4天: 25积分
第5天: 30积分
第6天: 35积分
第7天及以后: 50积分

👥 邀请模块

1. 获取我的邀请信息

接口GET /api/invite/info
HeaderAuthorization: Bearer {token}
返回数据 { "code": 0, "data": { "inviteCode": "ABC123", // 我的邀请码 "inviteCount": 5, // 成功邀请人数 "totalReward": 500, // 累计邀请奖励 "list": [{ // 邀请记录列表 "id": "记录ID", "invitee": { "nickname": "被邀请人昵称", "avatar": "头像URL", "createdAt": "2026-03-10T02:49:07.000Z" }, "status": 1, // 0=待生效, 1=已生效 "reward": 100, // 奖励金额 "createdAt": "2026-03-10T02:49:07.000Z" }] } }
奖励机制 被邀请人首次完成任务后,邀请奖励自动发放
默认奖励:100积分/人
可在管理后台配置

📺 广告模块

1. 广告展示回调

接口POST /api/ad/show
HeaderAuthorization: Bearer {token}
Body{"adId": "广告ID", "adType": 1}
adType1=视频广告, 2=插屏广告, 3=横幅广告

2. 广告点击回调

接口POST /api/ad/click
HeaderAuthorization: Bearer {token}
Body{"adId": "广告ID", "adType": 1}

3. 广告完成奖励

接口POST /api/ad/reward
HeaderAuthorization: Bearer {token}
Body{"adId": "广告ID", "adType": 1}
返回数据 { "code": 0, "data": { "reward": 50, // 获得奖励 "balance": 150 // 当前积分余额 } }
默认奖励 视频广告(1): 50积分
插屏广告(2): 20积分
横幅广告(3): 10积分

🎁 兑换与商品模块

1. 获取商品列表

接口GET /api/product/list
HeaderAuthorization: Bearer {token}
说明返回所有上架的商品(status=1)

2. 获取商品详情

接口GET /api/product/detail/:id
HeaderAuthorization: Bearer {token}
说明获取指定商品详情

3. 获取我的订单

接口GET /api/order/list?page=1&limit=20
HeaderAuthorization: Bearer {token}

4. 创建兑换订单

接口POST /api/order/create
HeaderAuthorization: Bearer {token}
Body{"productId": "商品ID", "quantity": 1, "address": "收货地址"}
安全特性Redis分布式锁 + 事务原子性 + 幂等控制
流程检查库存 → 扣积分 → 减库存 → 创建订单

💸 提现模块

1. 获取提现配置

接口GET /api/withdraw/config
HeaderAuthorization: Bearer {token}
返回提现比例、最小金额、提现方式配置

2. 获取我的提现记录

接口GET /api/withdraw/list?page=1&limit=20
HeaderAuthorization: Bearer {token}

3. 申请提现

接口POST /api/withdraw/apply
HeaderAuthorization: Bearer {token}
Body{"amount": 1000, "type": 1, "account": "微信号", "name": "姓名"}
风控提现风控检查(同一用户不能有pending申请)
流程冻结积分 → 创建提现记录

📊 管理后台接口

需要 Admin Token: admin-token-2024-secure

创建APP

项目内容
接口POST /api/admin/tenant/create
Headerx-admin-token: {token}
Body{"appId": "xxx", "name": "APP名称"}

仪表盘数据

项目内容
接口GET /api/admin/dashboard
Headerx-admin-token: {token}

3. 用户列表

接口GET /api/admin/users?tenantId=xxx&page=1&limit=20&keyword=搜索词
Headerx-admin-token: {token}
说明支持按昵称、手机号、邀请码搜索

4. 提现列表

接口GET /api/admin/withdraws?tenantId=xxx&status=0&page=1&limit=20
Headerx-admin-token: {token}
status0=待审核, 1=已通过, 2=已拒绝, 3=已打款

5. 审核提现

接口POST /api/admin/withdraw/:id/audit
Headerx-admin-token: {token}
Body{"status": 1, "remark": "审核通过"}
status1=通过, 2=拒绝(拒绝时自动解冻积分)

6. 标记打款

接口POST /api/admin/withdraw/:id/pay
Headerx-admin-token: {token}
说明自动调用微信支付,未配置则标记为手动打款

7. 配置微信支付

接口POST /api/admin/config/wxpay
Headerx-admin-token: {token}
Body微信支付配置参数

📱 接入示例

Android 接入示例

// 1. 微信登录获取 code // 2. 调用登录接口 JSONObject params = new JSONObject(); params.put("appId", "my-app-001"); params.put("timestamp", System.currentTimeMillis()); params.put("sign", generateSign()); params.put("code", wxCode); params.put("deviceId", deviceId); // 发送请求 OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url("https://points.jahonn.cn/api/auth/wx-login") .post(RequestBody.create(JSON, params.toString())) .build();

iOS 接入示例 (Swift)

let params: [String: Any] = [ "appId": "my-app-001", "timestamp": Date().timeIntervalSince1970 * 1000, "sign": generateSign(), "code": wxCode, "deviceId": deviceId ] AF.request("https://points.jahonn.cn/api/auth/wx-login", method: .post, parameters: params, encoding: JSONEncoding.default) .responseJSON { response in // 处理响应 }

JavaScript / Web 接入示例

// 使用 CryptoJS 生成签名(重要:不要用浏览器内置 MD5) function generateSign(appId, timestamp, secretKey) { const signStr = `appId=${appId}×tamp=${timestamp}&key=${secretKey}`; return CryptoJS.MD5(signStr).toString(); } // 游客登录示例 async function guestLogin() { const appId = "demo-app-001"; const secretKey = "demo-secret-key"; const timestamp = Date.now().toString(); const deviceId = "device-" + Math.random().toString(36).substr(2, 9); const response = await fetch("https://points.jahonn.cn/api/auth/guest-login", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ appId, timestamp, sign: generateSign(appId, timestamp, secretKey), deviceId, nickname: "游客" + Math.floor(Math.random() * 1000) }) }); const data = await response.json(); if (data.code === 0) { localStorage.setItem("token", data.data.token); return data.data.user; } throw new Error(data.message); }

❌ 错误码

code说明
0成功
400参数错误 / 业务逻辑错误(如:积分不足、库存不足)
401未登录 / Token过期
403无权限 / 签名错误
404资源不存在
429请求过于频繁(并发限制)
500服务器内部错误

常见业务错误

场景HTTP状态codemessage
积分不足400400积分不足
库存不足400400库存不足
今日已签到400400今日已签到
任务已完成400400今日任务已完成 / 任务已完成
签名错误403403签名错误
并发操作429429操作过于频繁,请稍后再试
已兑换过400400已兑换过该商品
有提现审核中400400有提现申请正在审核中
技术支持
服务端地址: https://points.jahonn.cn
备用地址: http://49.233.164.83
健康检查: https://points.jahonn.cn/health
测试页面: https://points.jahonn.cn/test.html

🛡️ 并发安全与幂等性

系统安全特性(v2.1新增)
1. 分布式锁: 关键操作(订单、签到、提现)使用Redis锁防止并发
2. 幂等控制: 所有积分操作基于(source, sourceId)防止重复
3. 事务保证: 数据库操作在事务中完成
4. 唯一约束: 关键记录有数据库唯一索引

📊 测试租户信息

参数测试值说明
appIddemo-app-001测试应用ID
secretKeydemo-secret-key测试密钥
测试签名bd0209dc63a079daa1ebfc15b25a7811appId=demo-app-001×tamp=1773106652866&key=demo-secret-key