🏠 返回管理后台
🧪 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
🔐 认证方式
所有请求需要携带以下参数:
| 参数 | 说明 | 示例 |
| appId | APP唯一标识 | my-app-001 |
| timestamp | 当前时间戳(毫秒) | 1709891200000 |
| sign | 签名(MD5) | 见下方签名算法 |
签名算法
const signStr = `appId=${appId}×tamp=${timestamp}&key=${secretKey}`;
const sign = CryptoJS.MD5(signStr).toString();
签名注意事项
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",
"timestamp": "1773106652866",
"sign": "bd0209dc63a079daa1ebfc15b25a7811",
"code": "08123abc",
"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 |
| Header | Authorization: Bearer {token} |
5. 绑定手机号
| 接口 | POST /api/user/bind-phone |
| Header | Authorization: Bearer {token} |
| Body | {"phone": "13800138000"} |
💰 积分模块
1. 获取积分余额
| 接口 | GET /api/points/balance |
| Header | Authorization: Bearer {token} |
| 返回数据 |
{
"code": 0,
"data": {
"balance": 100, // 可用积分
"frozen": 50, // 冻结积分(提现中)
"total": 150 // 累计获得积分
}
} |
2. 获取积分流水
| 接口 | GET /api/points/logs?page=1&limit=20 |
| Header | Authorization: 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 |
| Header | Authorization: Bearer {token} |
| 查询参数 | type (可选) - 任务类型:1=每日任务, 2=成长任务, 3=新手任务 |
2. 获取我的任务状态
| 接口 | GET /api/task/my |
| Header | Authorization: Bearer {token} |
| 说明 | 返回用户今日完成任务状态 |
3. 完成任务
| 接口 | POST /api/task/complete |
| Header | Authorization: Bearer {token} |
| Body | {"taskId": "任务ID"} |
| 风控 | 任务频率限制,防刷 |
| 自动触发 | 首次完成任务自动激活邀请奖励 |
📅 签到模块
1. 获取签到状态
| 接口 | GET /api/signin/status |
| Header | Authorization: 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 |
| Header | Authorization: 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 |
| Header | Authorization: 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 |
| Header | Authorization: Bearer {token} |
| Body | {"adId": "广告ID", "adType": 1} |
| adType | 1=视频广告, 2=插屏广告, 3=横幅广告 |
2. 广告点击回调
| 接口 | POST /api/ad/click |
| Header | Authorization: Bearer {token} |
| Body | {"adId": "广告ID", "adType": 1} |
3. 广告完成奖励
| 接口 | POST /api/ad/reward |
| Header | Authorization: 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 |
| Header | Authorization: Bearer {token} |
| 说明 | 返回所有上架的商品(status=1) |
2. 获取商品详情
| 接口 | GET /api/product/detail/:id |
| Header | Authorization: Bearer {token} |
| 说明 | 获取指定商品详情 |
3. 获取我的订单
| 接口 | GET /api/order/list?page=1&limit=20 |
| Header | Authorization: Bearer {token} |
4. 创建兑换订单
| 接口 | POST /api/order/create |
| Header | Authorization: Bearer {token} |
| Body | {"productId": "商品ID", "quantity": 1, "address": "收货地址"} |
| 安全特性 | Redis分布式锁 + 事务原子性 + 幂等控制 |
| 流程 | 检查库存 → 扣积分 → 减库存 → 创建订单 |
💸 提现模块
1. 获取提现配置
| 接口 | GET /api/withdraw/config |
| Header | Authorization: Bearer {token} |
| 返回 | 提现比例、最小金额、提现方式配置 |
2. 获取我的提现记录
| 接口 | GET /api/withdraw/list?page=1&limit=20 |
| Header | Authorization: Bearer {token} |
3. 申请提现
| 接口 | POST /api/withdraw/apply |
| Header | Authorization: Bearer {token} |
| Body | {"amount": 1000, "type": 1, "account": "微信号", "name": "姓名"} |
| 风控 | 提现风控检查(同一用户不能有pending申请) |
| 流程 | 冻结积分 → 创建提现记录 |
📊 管理后台接口
需要 Admin Token: admin-token-2024-secure
创建APP
| 项目 | 内容 |
| 接口 | POST /api/admin/tenant/create |
| Header | x-admin-token: {token} |
| Body | {"appId": "xxx", "name": "APP名称"} |
仪表盘数据
| 项目 | 内容 |
| 接口 | GET /api/admin/dashboard |
| Header | x-admin-token: {token} |
3. 用户列表
| 接口 | GET /api/admin/users?tenantId=xxx&page=1&limit=20&keyword=搜索词 |
| Header | x-admin-token: {token} |
| 说明 | 支持按昵称、手机号、邀请码搜索 |
4. 提现列表
| 接口 | GET /api/admin/withdraws?tenantId=xxx&status=0&page=1&limit=20 |
| Header | x-admin-token: {token} |
| status | 0=待审核, 1=已通过, 2=已拒绝, 3=已打款 |
5. 审核提现
| 接口 | POST /api/admin/withdraw/:id/audit |
| Header | x-admin-token: {token} |
| Body | {"status": 1, "remark": "审核通过"} |
| status | 1=通过, 2=拒绝(拒绝时自动解冻积分) |
6. 标记打款
| 接口 | POST /api/admin/withdraw/:id/pay |
| Header | x-admin-token: {token} |
| 说明 | 自动调用微信支付,未配置则标记为手动打款 |
7. 配置微信支付
| 接口 | POST /api/admin/config/wxpay |
| Header | x-admin-token: {token} |
| Body | 微信支付配置参数 |
📱 接入示例
Android 接入示例
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 接入示例
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状态 | code | message |
| 积分不足 | 400 | 400 | 积分不足 |
| 库存不足 | 400 | 400 | 库存不足 |
| 今日已签到 | 400 | 400 | 今日已签到 |
| 任务已完成 | 400 | 400 | 今日任务已完成 / 任务已完成 |
| 签名错误 | 403 | 403 | 签名错误 |
| 并发操作 | 429 | 429 | 操作过于频繁,请稍后再试 |
| 已兑换过 | 400 | 400 | 已兑换过该商品 |
| 有提现审核中 | 400 | 400 | 有提现申请正在审核中 |
技术支持
服务端地址: 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. 唯一约束: 关键记录有数据库唯一索引
📊 测试租户信息
| 参数 | 测试值 | 说明 |
| appId | demo-app-001 | 测试应用ID |
| secretKey | demo-secret-key | 测试密钥 |
| 测试签名 | bd0209dc63a079daa1ebfc15b25a7811 | appId=demo-app-001×tamp=1773106652866&key=demo-secret-key |