演示 Demo
这些页面可以直接调用当前项目的前端接口,登录成功后会保存 token,其他演示页会自动读取。
首页
首页接口用于 H5 首页首屏展示,当前包含首页轮播图和滚动通知。接口只返回后台已启用、未删除的数据;滚动通知会按请求头 lang 优先读取多语言文案。
/frontend/home-demo 可直接测试首页聚合、轮播图和滚动通知接口。
limit 控制每组最多返回条数,默认 10,最大 50。/api/frontend/home公开接口名:首页聚合
作用:一次返回首页首屏需要的轮播图和滚动通知。适合 H5 首页初始化时调用。
| 参数 | 必填 | 说明 |
|---|---|---|
limit | 否 | 每组最多返回条数,默认 10,最大 50。 |
请求示例
https://admin.bin9k.top/api/frontend/home?limit=10
返回示例
{
"code": 0,
"msg": "成功",
"data": {
"carousels": [
{
"id": 1,
"title": "banner1",
"image_url": "/api/materials/preview?id=6",
"image_full_url": "https://admin.bin9k.top/api/materials/preview?id=6",
"jump_type": "none",
"jump_type_label": "不跳转",
"link_url": "",
"sort": 10,
"created_at": 1778650407,
"updated_at": 1778650417
}
],
"scroll_notices": [
{
"id": 1,
"content": "滚动通知",
"sort": 10,
"created_at": 1778650135,
"updated_at": 1778650148
}
]
}
}
| 返回字段 | 说明 |
|---|---|
carousels | 首页轮播图列表,按后台排序升序返回。 |
scroll_notices | 首页滚动通知列表,按后台排序升序返回。 |
carousels[].image_url | 站内图片地址,后台素材预览地址会转换为前端公开预览地址。 |
carousels[].image_full_url | 带当前域名的完整图片地址,App 或跨域 H5 推荐使用。 |
carousels[].jump_type | 跳转类型:none 不跳转,external 外链。 |
carousels[].link_url | 外链地址;不跳转时为空字符串。 |
scroll_notices[].content | 滚动通知文案,按请求头 lang 返回对应多语言内容。 |
/api/frontend/home/carousels公开接口名:首页轮播图
作用:只获取后台内容管理中启用的首页轮播图。图片同时返回站内地址和完整地址。
| 参数 | 必填 | 说明 |
|---|---|---|
limit | 否 | 最多返回条数,默认 10,最大 50。 |
请求示例
https://admin.bin9k.top/api/frontend/home/carousels?limit=10
返回示例
{
"code": 0,
"msg": "成功",
"data": {
"can_update_bank_card": 1,
"list": [
{
"id": 1,
"title": "banner1",
"image_url": "/api/materials/preview?id=6",
"image_full_url": "https://admin.bin9k.top/api/materials/preview?id=6",
"jump_type": "external",
"jump_type_label": "外链",
"link_url": "https://example.com",
"sort": 10,
"created_at": 1778650407,
"updated_at": 1778650417
}
],
"limit": 10
}
}
| 返回字段 | 说明 |
|---|---|
list | 轮播图列表。 |
limit | 本次接口实际使用的返回条数上限。 |
list[].title | 后台配置的轮播标题。 |
list[].image_url | 站内图片地址。 |
list[].image_full_url | 完整图片地址。 |
list[].jump_type | none 不跳转,external 外链。 |
list[].jump_type_label | 跳转类型展示文案。 |
list[].link_url | 外链地址,仅 jump_type=external 时有值。 |
list[].sort | 后台排序值。 |
/api/frontend/home/scroll-notices公开接口名:首页滚动通知
作用:只获取后台内容管理中启用的滚动通知。文案会根据请求头 lang 优先读取多语言内容,没有对应翻译时回退后台默认文案。
| 参数 | 必填 | 说明 |
|---|---|---|
limit | 否 | 最多返回条数,默认 10,最大 50。 |
请求示例
https://admin.bin9k.top/api/frontend/home/scroll-notices?limit=10 lang: zh-CN
返回示例
{
"code": 0,
"msg": "成功",
"data": {
"can_update_bank_card": 1,
"can_add_bank_card": 1,
"bank_card_count": 1,
"bank_card_max_count": 3,
"bank_card_duplicate_bind_enabled": 0,
"list": [
{
"id": 1,
"content": "滚动通知",
"sort": 10,
"created_at": 1778650135,
"updated_at": 1778650148
}
],
"texts": ["滚动通知"],
"limit": 10
}
}
| 返回字段 | 说明 |
|---|---|
list | 通知完整列表。 |
texts | 纯文案数组,方便 H5 直接拼接滚动条。 |
limit | 本次接口实际使用的返回条数上限。 |
list[].content | 按请求头 lang 返回多语言文案。 |
list[].sort | 后台排序值。 |
list[].created_at / updated_at | 创建和更新时间戳。 |
通用约定
POST 接口推荐使用
application/json,GET 接口使用 query 参数。lang: zh-CN、lang: en、lang: ja 等 Google 翻译语言码。Authorization: Bearer <access_token>,只在标记“需登录”的接口必填。列表统一使用
page 和 page_size,默认值一般为 1 和 20。通用成功响应
{
"code": 0,
"msg": "成功",
"data": {}
}
通用失败响应
{
"code": 400,
"msg": "错误提示"
}
/api/frontend/common/config公开接口名:获取通用配置
作用:前端按 option 聚合读取通用配置,当前支持 website、currency;多个值用英文逗号分隔。
请求参数
| 参数 | 必填 | 说明 |
|---|---|---|
option | 是 | 配置模块,当前支持 website、currency,例如 website,currency。 |
请求示例
https://admin.bin9k.top/api/frontend/common/config?option=website,currency
返回示例
{
"code": 0,
"msg": "ok",
"data": {
"website": {
"site_name": "THKTG",
"logo_url": "/api/materials/preview?id=1",
"logo_full_url": "https://admin.bin9k.top/api/materials/preview?id=1"
},
"currency": {
"currency_symbol": "JPY",
"currency_usd_rate": "0.00670000",
"usd_rate": "0.00670000",
"base_currency": "USD"
}
}
}
| 返回字段 | 说明 |
|---|---|
website.site_name | 站点名称。 |
website.logo_url | 后台保存的站点 LOGO 地址。 |
website.logo_full_url | 站点 LOGO 完整访问地址,未配置时为空字符串。 |
currency.currency_symbol | 平台货币符号。 |
currency.currency_usd_rate | 兑换美元汇率,表示 1 平台货币可兑换多少美元。 |
currency.usd_rate | currency_usd_rate 的短字段。 |
currency.base_currency | 目标兑换货币,当前固定为 USD。 |
/api/frontend/common/platform-currency公开接口名:获取平台货币配置
作用:读取后台「平台配置 / 平台货币」维护的平台货币符号和兑换美元汇率,用于 H5 金额展示和美元换算。
请求参数
无请求参数。
请求示例
https://admin.bin9k.top/api/frontend/common/platform-currency
返回示例
{
"code": 0,
"msg": "ok",
"data": {
"currency_symbol": "$",
"currency_usd_rate": "1.00000000",
"usd_rate": "1.00000000",
"base_currency": "USD"
}
}
| 返回字段 | 说明 |
|---|---|
currency_symbol | 平台货币符号,例如 $、¥、Rp。 |
currency_usd_rate | 兑换美元汇率,表示 1 平台货币可兑换多少美元,保留 8 位小数。 |
usd_rate | currency_usd_rate 的兼容短字段,便于前端换算读取。 |
base_currency | 目标兑换货币,当前固定为 USD。 |
/api/frontend/common/platform-customer-services公开接口名:获取平台客服
作用:读取后台「客服管理 / 平台客服」启用的客服列表,并按后台配置的展示类型顺序返回;请求携带用户 Token 时,如果配置了代理客服,会追加当前用户上级代理绑定的客服。
请求参数
无请求参数,Authorization 可选,携带后用于匹配代理客服。
请求示例
https://admin.bin9k.top/api/frontend/common/platform-customer-services
返回示例
{
"code": 0,
"msg": "ok",
"data": {
"customer_service_types": [
{
"type": "platform",
"label": "平台客服",
"available_count": 2
},
{
"type": "agent",
"label": "代理客服",
"available_count": 1
}
],
"list": [
{
"id": 1,
"source_type": "platform",
"source_text": "平台客服",
"name": "在线客服",
"url": "https://example.com/support",
"status": 1,
"sort": 10
},
{
"id": 88,
"source_type": "agent",
"source_text": "代理客服",
"name": "agent001",
"url": "https://example.com/agent-support",
"status": 1,
"sort": 0
}
],
"count": 2
}
}
| 返回字段 | 说明 |
|---|---|
customer_service_types | 后台配置的客服展示类型顺序。 |
customer_service_types[].type | 客服来源:platform 平台客服,agent 代理客服。 |
customer_service_types[].label | 客服来源展示文案,会根据请求语言返回。 |
customer_service_types[].available_count | 当前来源下可返回的客服数量。 |
list | 按展示类型顺序合并后的客服列表。 |
list[].id | 客服 ID;代理客服为代理会员 ID。 |
list[].source_type | 客服来源:platform、agent。 |
list[].source_text | 客服来源展示文案,会根据请求语言返回。 |
list[].name | 客服名称。 |
list[].url | 客服跳转地址。 |
list[].status | 状态,1 可用。 |
list[].sort | 来源内部排序值。 |
count | 本次返回客服数量。 |
登录注册
登录注册配置由后台「平台配置 / 登录注册配置」控制。图片验证码关闭后,登录和注册不需要传验证码;邀请码开启必填后,注册必须传入有效的邀请码。
/frontend/login-demo 会自动读取登录注册配置,并按配置展示验证码和邀请码提示。
注册传入邀请码后会绑定直接上级,系统同时保存上三级快照和无限层级闭包关系。
接入流程
| 步骤 | 说明 |
|---|---|
| 1 | 先调用 /api/frontend/auth/config,读取验证码、邀请码和 IP 注册限制配置。 |
| 2 | captcha_enabled=1 时调用验证码接口,并在登录/注册时传 captcha_id、captcha_code。 |
| 3 | invite_required=1 时注册必须传 invite_code 或 agent_code。 |
| 4 | 登录、注册、刷新 token 成功后,前端都要保存新的 access_token 和 refresh_token。 |
/api/frontend/auth/config公开接口名:获取登录注册配置
作用:返回登录注册页初始化需要的公开配置。前端应根据这些字段决定是否展示验证码、邀请码必填提示。
请求示例
https://admin.bin9k.top/api/frontend/auth/config
返回示例
{
"code": 0,
"msg": "成功",
"data": {
"configured": true,
"token_configured": true,
"issuer": "jplander-frontend",
"access_ttl": 7200,
"refresh_ttl": 2592000,
"captcha_ttl": 300,
"password_login_enabled": true,
"captcha_enabled": 1,
"invite_required": 0,
"ip_limit_enabled": 1,
"max_accounts_per_ip": 2
}
}
| 返回字段 | 说明 |
|---|---|
captcha_enabled | 是否开启图片验证码,1 开启,0 关闭。 |
invite_required | 注册是否必须填写邀请码。 |
ip_limit_enabled | 是否限制同 IP 注册账号数量。 |
max_accounts_per_ip | 同 IP 最多可注册账号数。 |
/api/frontend/auth/captcha公开接口名:获取图片验证码
作用:生成一次性图片验证码。仅当登录配置 captcha_enabled=1 时需要调用。
请求示例
https://admin.bin9k.top/api/frontend/auth/captcha
返回示例
{
"code": 0,
"msg": "成功",
"data": {
"captcha_id": "cap_xxxxx",
"image": "data:image/svg+xml;base64,xxxxx",
"expires_in": 300
}
}
| 返回字段 | 说明 |
|---|---|
captcha_id | 验证码 ID,登录或注册时原样传回。 |
image | base64 SVG 图片,可直接赋值给 img.src。 |
expires_in | 验证码有效秒数。 |
/api/frontend/auth/register公开接口名:会员注册
作用:注册平台会员账号,注册成功后直接返回登录 token。邀请码填写后会绑定直接上级,并写入上三级快照和无限层级关系。
| 参数 | 必填 | 说明 |
|---|---|---|
account | 是 | 会员账号,对应会员表用户名。 |
password | 是 | 密码。 |
password_confirm | 否 | 确认密码,传入时必须与 password 一致。 |
invite_code | 配置决定 | 邀请码;后台配置为必填时必须传,填写后会校验有效性。 |
agent_code | 否 | 邀请码别名;同时传时优先使用 invite_code。 |
phone | 否 | 手机号。 |
captcha_id / captcha_code | 配置决定 | 后台开启图片验证码时必填。 |
device_name | 否 | 设备名称,例如 h5。 |
请求示例
{
"account": "member001",
"password": "123456",
"password_confirm": "123456",
"invite_code": "M000001",
"captcha_id": "cap_xxxxx",
"captcha_code": "ABCD",
"device_name": "h5"
}
返回示例
{
"code": 0,
"msg": "成功",
"data": {
"access_token": "access_token_xxxxx",
"token_type": "Bearer",
"expires_in": 7200,
"refresh_token": "refresh_token_xxxxx",
"refresh_expires_in": 2592000,
"user": {
"id": 1,
"source_type": "member",
"source_text": "会员账号",
"username": "member001",
"account": "member001",
"agent_code": "M000002",
"parent_id": 1,
"ancestor_1_id": 1,
"ancestor_2_id": 0,
"ancestor_3_id": 0,
"level_depth": 1,
"language": "zh-CN",
"balance": "0.00",
"status": 1,
"created_at": 1774411200,
"created_time": "2026-03-25 12:00:00"
}
}
}
| 返回字段 | 说明 |
|---|---|
access_token | 后续接口鉴权 token,请放到 Authorization: Bearer <access_token>。 |
refresh_token | 刷新 token,用于换取新的访问 token。 |
user.agent_code | 当前会员自己的邀请码,可用于邀请下级注册。 |
user.parent_id | 直接上级会员 ID,没有上级时为 0。 |
user.ancestor_1_id / ancestor_2_id / ancestor_3_id | 上三级快照,方便快速查找。 |
user.level_depth | 当前会员所在层级深度。 |
/api/frontend/auth/login公开接口名:会员账号密码登录
图片验证码是否必填同样由 /api/frontend/auth/config 的 captcha_enabled 控制。
| 参数 | 必填 | 说明 |
|---|---|---|
account | 是 | 会员账号。 |
password | 是 | 密码。 |
captcha_id / captcha_code | 配置决定 | 后台开启图片验证码时必填。 |
device_name | 否 | 设备名称。 |
请求示例
{
"account": "member001",
"password": "123456",
"captcha_id": "cap_xxxxx",
"captcha_code": "ABCD",
"device_name": "h5"
}
返回说明
返回字段与注册成功一致。登录成功会更新 last_login_at、last_login_time。
/api/frontend/auth/refresh公开接口名:刷新 Token
作用:使用 refresh_token 换取新的 token。刷新成功后会轮换刷新令牌,旧的 refresh_token 不应继续使用。
| 参数 | 必填 | 说明 |
|---|---|---|
refresh_token | 是 | 登录、注册或上次刷新返回的刷新令牌。 |
device_name | 否 | 设备名称。 |
请求示例
{
"refresh_token": "refresh_token_xxxxx",
"device_name": "h5"
}
返回说明
返回新的 access_token、refresh_token 和当前用户信息。
/api/frontend/auth/me需登录接口名:获取当前登录用户
请求示例
https://admin.bin9k.top/api/frontend/auth/me Authorization: Bearer <access_token>
返回字段
| 字段 | 说明 |
|---|---|
id | 会员用户 ID。 |
account / username | 会员账号。 |
avatar | 用户头像完整访问地址,没有头像时为空字符串。 |
balance | 用户余额,字符串金额。 |
agent_code | 当前会员邀请码。 |
registered_time / last_login_time | 注册和最后登录时间。 |
/api/frontend/auth/language需登录接口名:更新当前用户语言
| 参数 | 必填 | 说明 |
|---|---|---|
language | 是 | 语言码,例如 zh-CN、en,必须是后台启用语言。 |
/api/frontend/auth/logout需登录接口名:退出登录
作用:吊销当前登录会话。退出后当前 access_token 和对应刷新令牌都会失效。
请求示例
https://admin.bin9k.top/api/frontend/auth/logout Authorization: Bearer <access_token>
返回示例
{
"code": 0,
"msg": "成功"
}
常见错误
| 场景 | HTTP 状态 | 提示示例 |
|---|---|---|
| 账号或密码错误 | 400 | 账号或密码错误 |
| 验证码错误或过期 | 400 | 验证码错误 / 验证码已过期 |
| 邀请码必填但未传 | 400 | 请填写邀请码 |
| 邀请码无效 | 400 | 邀请码无效 |
| 同 IP 注册达到上限 | 400 | 当前 IP 注册数量已达上限 |
| token 无效或过期 | 401 | 访问令牌无效 / 登录会话已过期 |
个人中心
个人中心接口都需要登录,前端请求头携带 Authorization: Bearer <access_token>。银行卡资料用于提款资料维护,添加和修改时必须校验支付密码,持卡人姓名必须与真实姓名一致。
/frontend/profile-demo 可直接测试基本资料、登录密码、支付密码、银行卡和资金明细接口。
首次设置支付密码可不传旧密码;已设置后修改和银行卡维护都需要校验支付密码。
/api/frontend/user/info需登录接口名:获取个人中心资料
| 参数 | 必填 | 说明 |
|---|---|---|
| 无请求参数。 | ||
{
"code": 0,
"msg": "成功",
"data": {
"id": 1,
"account": "member001",
"real_name": "张三",
"gender": "male",
"gender_text": "男",
"balance": "1000.00",
"has_payment_password": 1,
"status": 1
}
}
| 返回字段 | 类型 | 说明 |
|---|---|---|
id | int | 当前会员 ID。 |
account | string | 会员账号。 |
real_name | string | 真实姓名。 |
gender | string | 性别枚举:male、female、unknown。 |
gender_text | string | 性别展示文案。 |
balance | string | 当前余额。 |
has_payment_password | int | 是否已设置支付密码。 |
status | int | 账号状态。 |
/api/frontend/user/real-name需登录接口名:设置真实姓名
| 参数 | 必填 | 说明 |
|---|---|---|
real_name | 是 | 真实姓名,兼容 name。 |
{
"real_name": "张三"
}
{
"code": 0,
"msg": "成功",
"data": {
"real_name": "张三",
"user": {
"id": 1,
"account": "member001",
"real_name": "张三"
}
}
}
| 返回字段 | 类型 | 说明 |
|---|---|---|
real_name | string | 保存后的真实姓名。 |
user | object | 保存后的当前用户信息。 |
user.real_name | string | 当前用户真实姓名。 |
/api/frontend/user/gender需登录接口名:设置性别
| 参数 | 必填 | 说明 |
|---|---|---|
gender | 是 | male、female、unknown,兼容 sex。 |
{
"gender": "male"
}
{
"code": 0,
"msg": "成功",
"data": {
"gender": "male",
"gender_text": "男",
"user": {
"id": 1,
"gender": "male",
"gender_text": "男"
}
}
}
| 返回字段 | 类型 | 说明 |
|---|---|---|
gender | string | 保存后的性别枚举。 |
gender_text | string | 保存后的性别文案。 |
user.gender | string | 当前用户性别枚举。 |
/api/frontend/user/login-password需登录接口名:修改登录密码
| 参数 | 必填 | 说明 |
|---|---|---|
old_password | 是 | 旧登录密码。 |
new_password | 是 | 新登录密码,6 到 64 位。 |
new_password_confirm | 是 | 确认新登录密码。 |
{
"old_password": "123456",
"new_password": "654321",
"new_password_confirm": "654321"
}
{
"code": 0,
"msg": "成功",
"data": {
"changed": 1,
"user": {
"id": 1,
"account": "member001",
"updated_at": 1774415000
}
}
}
| 返回字段 | 类型 | 说明 |
|---|---|---|
changed | int | 是否修改成功。 |
user | object | 修改后的当前用户信息。 |
/api/frontend/user/payment-password需登录接口名:设置或修改支付密码
| 参数 | 必填 | 说明 |
|---|---|---|
old_payment_password | 条件必填 | 已设置过支付密码时必填。 |
new_payment_password | 是 | 新支付密码,6 到 64 位。 |
new_payment_password_confirm | 是 | 确认新支付密码。 |
{
"old_payment_password": "123456",
"new_payment_password": "654321",
"new_payment_password_confirm": "654321"
}
{
"code": 0,
"msg": "成功",
"data": {
"changed": 1,
"has_payment_password": 1,
"user": {
"id": 1,
"has_payment_password": 1
}
}
}
| 返回字段 | 类型 | 说明 |
|---|---|---|
changed | int | 是否设置或修改成功。 |
has_payment_password | int | 设置后固定为 1。 |
user.has_payment_password | int | 当前用户是否已设置支付密码。 |
/api/frontend/user/bank-cards需登录接口名:获取银行卡列表
| 参数 | 必填 | 说明 |
|---|---|---|
| 无请求参数。 | ||
{
"code": 0,
"msg": "成功",
"data": {
"list": [
{
"id": 1,
"account_name": "张三",
"bank_name": "中国银行",
"branch_name": "深圳南山支行",
"branch_no": "104584000001",
"card_no": "6222020202020202020",
"card_no_masked": "6222 **** **** 2020",
"status": 1
}
]
}
}
| 返回字段 | 类型 | 说明 |
|---|---|---|
can_update_bank_card | int | 是否允许用户修改已绑定银行卡,由后台提现配置控制。 |
can_add_bank_card | int | 是否还能继续添加银行卡,1 可以,0 已达到绑定数量上限。 |
bank_card_count | int | 当前用户已绑定银行卡数量。 |
bank_card_max_count | int | 每用户可绑定银行卡数量,0 表示不限制。 |
bank_card_duplicate_bind_enabled | int | 是否允许同一张卡号重复绑定。 |
list | array | 当前会员银行卡列表。 |
list[].id | int | 银行卡 ID。 |
list[].account_name | string | 持卡人姓名。 |
list[].bank_name | string | 银行名称。 |
list[].branch_name | string | 分行名称。 |
list[].branch_no | string | 分行编号。 |
list[].card_no | string | 完整银行卡号。 |
list[].card_no_masked | string | 脱敏银行卡号。 |
/api/frontend/user/bank-cards/create需登录接口名:添加银行卡
达到后台配置的每用户绑卡数量时会返回错误;后台关闭“允许重复绑定卡号”时,同一张卡号不能被任何用户重复绑定。
| 参数 | 必填 | 说明 |
|---|---|---|
account_name | 是 | 持卡人姓名,必须与真实姓名一致。 |
bank_name | 是 | 银行名称。 |
branch_name | 是 | 分行名称。 |
branch_no | 是 | 分行编号。 |
card_no | 是 | 银行卡号。 |
payment_password | 是 | 支付密码。 |
{
"account_name": "张三",
"bank_name": "中国银行",
"branch_name": "深圳南山支行",
"branch_no": "104584000001",
"card_no": "6222020202020202020",
"payment_password": "654321"
}
{
"code": 0,
"msg": "成功",
"data": {
"item": {
"id": 1,
"account_name": "张三",
"bank_name": "中国银行",
"card_no_masked": "6222 **** **** 2020",
"status": 1
},
"can_update_bank_card": 1,
"can_add_bank_card": 1,
"bank_card_count": 1,
"bank_card_max_count": 3,
"bank_card_duplicate_bind_enabled": 0,
"list": []
}
}
| 返回字段 | 类型 | 说明 |
|---|---|---|
item | object | 本次新增的银行卡。 |
item.id | int | 银行卡 ID。 |
item.account_name | string | 持卡人姓名。 |
item.bank_name | string | 银行名称。 |
item.branch_name | string | 分行名称。 |
item.branch_no | string | 分行编号。 |
item.card_no | string | 完整银行卡号。 |
item.card_no_masked | string | 脱敏银行卡号。 |
item.status | int | 状态,1 启用。 |
item.created_at / updated_at | int | 创建和更新时间戳。 |
can_update_bank_card | int | 是否允许用户修改已绑定银行卡。 |
can_add_bank_card | int | 是否还能继续添加银行卡。 |
bank_card_count | int | 添加后当前用户已绑定银行卡数量。 |
bank_card_max_count | int | 每用户可绑定银行卡数量,0 表示不限制。 |
bank_card_duplicate_bind_enabled | int | 是否允许同一张卡号重复绑定。 |
list | array | 添加后的银行卡列表。 |
/api/frontend/user/bank-cards/update需登录接口名:修改银行卡
后台“提现配置 - 银行卡 - 允许用户修改银行卡”关闭时,本接口会返回错误,不允许修改;后台关闭“允许重复绑定卡号”时,同一张卡号不能被任何用户重复绑定。
| 参数 | 必填 | 说明 |
|---|---|---|
id | 是 | 银行卡 ID,只能修改当前会员自己的银行卡。 |
account_name | 是 | 持卡人姓名,必须与真实姓名一致。 |
bank_name | 是 | 银行名称。 |
branch_name | 是 | 分行名称。 |
branch_no | 是 | 分行编号。 |
card_no | 是 | 银行卡号。 |
payment_password | 是 | 支付密码。 |
{
"id": 1,
"account_name": "张三",
"bank_name": "中国银行",
"branch_name": "深圳科技园支行",
"branch_no": "104584000002",
"card_no": "6222020202020202020",
"payment_password": "654321"
}
{
"code": 0,
"msg": "成功",
"data": {
"item": {
"id": 1,
"account_name": "张三",
"bank_name": "中国银行",
"branch_name": "深圳科技园支行",
"updated_at": 1774415000
},
"can_update_bank_card": 1,
"can_add_bank_card": 1,
"bank_card_count": 1,
"bank_card_max_count": 3,
"bank_card_duplicate_bind_enabled": 0,
"list": []
}
}
| 返回字段 | 类型 | 说明 |
|---|---|---|
item | object | 修改后的银行卡。 |
item.id | int | 银行卡 ID。 |
item.account_name | string | 持卡人姓名。 |
item.bank_name | string | 银行名称。 |
item.branch_name | string | 分行名称。 |
item.branch_no | string | 分行编号。 |
item.card_no | string | 完整银行卡号。 |
item.card_no_masked | string | 脱敏银行卡号。 |
item.status | int | 状态,1 启用。 |
item.updated_at | int | 更新时间戳。 |
can_update_bank_card | int | 是否允许用户继续修改已绑定银行卡。 |
can_add_bank_card | int | 是否还能继续添加银行卡。 |
bank_card_count | int | 修改后当前用户已绑定银行卡数量。 |
bank_card_max_count | int | 每用户可绑定银行卡数量,0 表示不限制。 |
bank_card_duplicate_bind_enabled | int | 是否允许同一张卡号重复绑定。 |
list | array | 修改后的银行卡列表。 |
/api/frontend/user/balance-logs需登录接口名:用户资金变动明细
返回当前登录会员自己的资金明细,H5 可根据 direction 区分入账和出账颜色。
| 参数 | 必填 | 说明 |
|---|---|---|
page | 否 | 页码,默认 1。 |
page_size | 否 | 每页数量,默认 20,最大 50。 |
type | 否 | 按账变类型筛选,例如 奖金、任务。 |
direction | 否 | income 入账,expense 出账。 |
GET https://admin.bin9k.top/api/frontend/user/balance-logs?page=1&page_size=20 Authorization: Bearer <access_token>
{
"code": 0,
"msg": "成功",
"data": {
"list": [
{
"type_text": "奖金",
"direction": "income",
"amount_text": "+19.80",
"remark": "活动二202605131579鸡",
"created_time": "2026-05-13 14:55:01"
}
],
"total": 152,
"page": 1,
"page_size": 20
}
}
| 返回字段 | 类型 | 说明 |
|---|---|---|
list | array | 资金变动记录列表。 |
list[].type_text | string | 账变类型展示文案,会根据请求头 lang 返回对应语言。 |
list[].direction | string | income 入账、expense 出账,用于控制金额颜色。 |
list[].direction_text | string | 收支方向文案,会根据请求头 lang 返回对应语言。 |
list[].amount_text | string | 带正负号的展示金额。 |
list[].remark | string | 备注文案,会根据请求头 lang 返回对应语言。 |
list[].created_time | string | 格式化创建时间。 |
total / page / page_size | int | 分页信息。 |
公开资源
/api/materials/preview公开预览后台素材库中的图片等可公开预览资源。该接口直接返回文件流,不返回通用 JSON。
| 参数 | 必填 | 说明 |
|---|---|---|
id | 是 | 素材 ID。 |
https://admin.bin9k.top/api/materials/preview?id=1
/api/frontend/articles/app-origin-story公开接口名:APP起源故事文章详情
作用:查询后台文章管理中分类为“APP起源故事”、状态为已发布且排序第一的文章详情;没有配置时 data 返回空对象。
请求示例
https://admin.bin9k.top/api/frontend/articles/app-origin-story
返回示例
{
"code": 0,
"msg": "成功",
"data": {
"id": 1,
"title": "APP起源故事",
"category": "origin_story",
"category_text": "APP起源故事",
"summary": "文章摘要",
"content": "<p>文章正文</p>",
"cover_preview_url": "/api/materials/preview?id=1",
"cover_full_url": "https://admin.bin9k.top/api/materials/preview?id=1",
"sort": 1,
"created_at": 1774411200,
"updated_at": 1774411300
}
}
| 返回字段 | 说明 |
|---|---|
id | 文章 ID;没有配置时 data 为空对象。 |
title | 文章标题,支持后台多语言配置。 |
summary | 文章摘要,支持后台多语言配置。 |
content | 文章正文 HTML,支持后台多语言配置。 |
cover_preview_url | 站内封面预览地址。 |
cover_full_url | 可直接访问的完整封面地址。 |
created_at / updated_at | 创建和更新时间戳。 |
协议
前端可通过公开接口获取后台配置的用户协议和隐私协议 PDF 链接。后台支持上传 PDF 或填写远程 PDF 地址。
/api/frontend/agreements公开接口名:获取协议链接
作用:返回启用的协议列表;可传 type 只获取某一种协议。
| 参数 | 必填 | 说明 |
|---|---|---|
type | 否 | 协议类型:user_agreement 用户协议,privacy_policy 隐私协议。不传返回全部。 |
请求示例
https://admin.bin9k.top/api/frontend/agreements?type=user_agreement
返回示例
{
"code": 0,
"msg": "成功",
"data": {
"list": [
{
"key": "user_agreement",
"title": "用户协议",
"source_type": "upload",
"url": "/api/materials/preview?id=12",
"full_url": "https://admin.bin9k.top/api/materials/preview?id=12",
"updated_at": 1774411200
}
],
"agreements": {
"user_agreement": {
"key": "user_agreement",
"title": "用户协议",
"source_type": "upload",
"url": "/api/materials/preview?id=12",
"full_url": "https://admin.bin9k.top/api/materials/preview?id=12",
"updated_at": 1774411200
}
},
"item": null
}
}
| 返回字段 | 说明 |
|---|---|
list | 协议列表,按后台排序返回。 |
agreements | 以协议 key 为键的协议对象,方便前端按类型读取。 |
item | 传入 type 时返回对应协议;未找到时为 null。 |
list[].source_type | upload 后台上传 PDF,remote 远程 PDF 链接。 |
list[].full_url | 可直接访问的完整 PDF 地址,前端推荐优先使用。 |
语言
/api/frontend/languages公开获取后台启用的语言列表。列表排序第一项就是接口提示的默认语言。
返回示例
{
"code": 0,
"data": {
"list": [
{"code": "zh-CN", "name": "简体中文", "native_name": "简体中文", "sort": 1}
]
}
}
| 返回字段 | 说明 |
|---|---|
list[] | 启用语言列表,按后台拖拽排序返回。 |
list[].code | Google 翻译语言码,例如 zh-CN、en、ja。 |
list[].name | 后台配置的语言名称。 |
list[].native_name | 语言本地名称。 |
list[].sort | 排序值;第一项是默认语言。 |
Web Push
Web Push 用于前端浏览器订阅推送、取消订阅和读取后台推送配置。浏览器端需要先注册 service worker,再调用 Push API 生成 subscription,并把 subscription 提交给后台保存。
浏览器 Push API 只允许在 HTTPS 或 localhost/127.0.0.1 下使用,线上域名必须配置 HTTPS。
订阅记录按当前登录用户保存,所有接口都需要
Authorization: Bearer <access_token>。/frontend/webpush-demo 已提供配置读取、订阅、解除订阅和本地通知测试。
/api/frontend/push/config需登录接口名:获取 Web Push 配置
作用:获取当前站点 Web Push 开关、VAPID 公钥、默认图标、默认点击跳转地址,并判断当前用户是否已有有效订阅。
| 请求参数 | 必填 | 说明 |
|---|---|---|
无。请求头必须携带 Authorization,可选携带 lang。 | ||
请求示例
GET https://admin.bin9k.top/api/frontend/push/config Authorization: Bearer <access_token> lang: zh-CN
返回示例
{
"code": 0,
"msg": "成功",
"data": {
"status": 1,
"public_key": "BKn1...example",
"default_icon": "https://admin.bin9k.top/storage/push/default.png",
"default_icon_raw": "/storage/push/default.png",
"default_url": "/",
"subscribed": 1
}
}
| 返回字段 | 说明 |
|---|---|
status | Web Push 入口状态:1 启用,0 禁用。禁用时前端不应发起订阅。 |
public_key | VAPID 公钥,前端传给 pushManager.subscribe() 的 applicationServerKey。 |
default_icon | 默认通知图标的完整访问地址,前端展示或 service worker 兜底时使用。 |
default_icon_raw | 后台保存的原始图标路径。 |
default_url | 默认通知点击跳转地址,推送模板没有配置跳转地址时使用。 |
subscribed | 当前登录用户是否存在启用中的订阅:1 是,0 否。 |
/api/frontend/push/subscribe需登录接口名:保存浏览器推送订阅
作用:前端通过浏览器 Push API 获取 subscription 后提交到后台。后台会优先按 user_id + device_id 判断同一用户的同一设备,已存在则更新订阅;没有传 device_id 时按 endpoint_hash 兼容旧逻辑。
| 参数 | 必填 | 说明 |
|---|---|---|
device_id | 建议必填 | 前端为当前浏览器设备生成并长期保存的稳定 ID。用于同一用户同一设备更新订阅,避免重复创建订阅记录。也可以放在 subscription.device_id。 |
subscription.endpoint | 是 | 浏览器 Push 服务生成的 endpoint。 |
subscription.keys.p256dh | 是 | 浏览器订阅公钥。 |
subscription.keys.auth | 是 | 浏览器订阅 auth token。 |
subscription.expirationTime | 否 | 浏览器返回的过期时间,当前后台只保存原始数据。 |
请求示例
POST https://admin.bin9k.top/api/frontend/push/subscribe
Authorization: Bearer <access_token>
Content-Type: application/json
{
"device_id": "web-7e9f0a8c-4b3c-4d6a-9a8b-1234567890ab",
"subscription": {
"endpoint": "https://fcm.googleapis.com/fcm/send/example-token",
"expirationTime": null,
"keys": {
"p256dh": "BMM...browser-public-key",
"auth": "x7g...auth-token"
}
}
}
返回示例
{
"code": 0,
"msg": "订阅成功",
"data": {
"subscribed": 1,
"subscription": {
"id": 1,
"endpoint": "https://fcm.googleapis.com/fcm/send/example-token",
"endpoint_hash": "9c1d1b0e...",
"device_id": "web-7e9f0a8c-4b3c-4d6a-9a8b-1234567890ab",
"device_hash": "0b8f0a7c...",
"status": 1,
"created_at": 1777276800,
"updated_at": 1777276800
}
}
}
| 返回字段 | 说明 |
|---|---|
subscribed | 订阅状态,成功保存后固定为 1。 |
subscription.id | 后台订阅记录 ID。 |
subscription.endpoint | 浏览器 Push endpoint。 |
subscription.endpoint_hash | endpoint 的 MD5,后台用于去重和展示。 |
subscription.device_id | 前端传入的设备 ID。同一用户再次使用相同 device_id 订阅时会更新这条记录。 |
subscription.device_hash | 设备 ID 的服务端哈希,用于唯一约束。 |
subscription.status | 订阅记录状态:1 启用,0 停用。 |
/api/frontend/push/unsubscribe需登录接口名:取消浏览器推送订阅
作用:把当前用户指定 endpoint 的订阅记录置为停用。前端也应该同步调用浏览器原生的 subscription.unsubscribe()。
| 参数 | 必填 | 说明 |
|---|---|---|
endpoint | 是 | 要取消的浏览器 Push endpoint。也可以传 subscription.endpoint。 |
请求示例
POST https://admin.bin9k.top/api/frontend/push/unsubscribe
Authorization: Bearer <access_token>
Content-Type: application/json
{
"endpoint": "https://fcm.googleapis.com/fcm/send/example-token"
}
返回示例
{
"code": 0,
"msg": "取消订阅成功",
"data": {
"subscribed": 0
}
}
| 返回字段 | 说明 |
|---|---|
subscribed | 取消后的订阅状态,成功后为 0。 |
前端接入流程示例
const config = await fetch('/api/frontend/push/config', {
headers: { Authorization: 'Bearer ' + token, lang: 'zh-CN' }
}).then(res => res.json());
const registration = await navigator.serviceWorker.register('/frontend-webpush-sw.js');
await Notification.requestPermission();
const subscription = await registration.pushManager.subscribe({
userVisibleOnly: true,
applicationServerKey: urlBase64ToUint8Array(config.data.public_key)
});
const deviceId = localStorage.getItem('alpha_push_device_id') || crypto.randomUUID();
localStorage.setItem('alpha_push_device_id', deviceId);
await fetch('/api/frontend/push/subscribe', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Authorization: 'Bearer ' + token,
lang: 'zh-CN'
},
body: JSON.stringify({ device_id: deviceId, subscription: subscription.toJSON() })
});
充值
充值方式接口返回后台开启展示的充值入口,当前支持银行卡、加密货币和线下充值。每种充值方式都可返回多语言富文本充值规则;线下充值会把后台配置的充值客服、平台客服、代理客服按运营拖拽顺序合并返回。
/frontend/recharge-demo 可直接测试充值方式、线下客服、银行卡和加密货币流程。
后台“充值配置 - 线下充值”中排在前面的客服来源,会在
customer_services 中优先返回。/api/frontend/recharge/methods公开接口名:获取充值方式
| 参数 | 必填 | 说明 |
|---|---|---|
无。可选携带 Authorization,用于后续支持按登录用户返回代理客服。 | ||
GET https://admin.bin9k.top/api/frontend/recharge/methods
{
"code": 0,
"msg": "成功",
"data": {
"list": [
{
"method": "offline",
"name": "线下充值",
"display_status": 1,
"enable_status": 1,
"enabled": 1,
"available_count": 2,
"status_text": "联系客服充值",
"rule_html": "<p>选择客服后请按客服指引完成线下充值。</p>",
"rule_content": "<p>选择客服后请按客服指引完成线下充值。</p>",
"description": "选择客服后跳转,由客服协助完成线下充值",
"customer_service_types": [
{
"type": "recharge",
"label": "充值客服",
"available_count": 1
},
{
"type": "platform",
"label": "平台客服",
"available_count": 1
}
],
"customer_services": [
{
"id": 1,
"source_type": "recharge",
"source_text": "充值客服",
"name": "充值客服A",
"url": "https://service.example.com/recharge-a",
"status": 1,
"sort": 10
}
]
}
],
"proof_upload": {
"upload_url": "https://v1.imgstoragebobo.com/api/uploads",
"field": "cert",
"public_base_url": "https://v1.imgstoragebobo.com",
"path_replace_from": "public/",
"path_replace_to": "storage/"
}
}
}
| 返回字段 | 类型 | 说明 |
|---|---|---|
list[].method | string | bank 银行卡,crypto 加密货币,offline 线下充值。 |
list[].name | string | 充值方式展示名称。 |
list[].display_status | int | 展示状态,1 表示该方式会返回给前端。 |
list[].enable_status | int | 启用状态,1 可用,0 不可用。 |
list[].enabled | int | 是否可进入该充值方式。 |
list[].available_count | int | 当前方式下可用收款账户、渠道或客服数量。 |
list[].status_text | string | 后台配置的状态文案,支持多语言。 |
list[].rule_html | string | 后台配置的充值规则富文本 HTML,支持多语言,未配置时为空。 |
list[].rule_content | string | 充值规则富文本内容,和 rule_html 一致,方便前端按原字段名读取。 |
list[].description | string | 充值方式说明文案。 |
list[].customer_service_types | array | 仅线下充值返回,客服来源类型和顺序。 |
customer_service_types[].type | string | recharge 充值客服,platform 平台客服,agent 代理客服。 |
customer_service_types[].label | string | 客服来源展示文案。 |
customer_service_types[].available_count | int | 当前来源下可返回的客服数量。 |
list[].customer_services | array | 仅线下充值返回,按后台配置顺序合并后的客服列表。 |
customer_services[].id | int | 客服 ID,平台客服为 0。 |
customer_services[].source_type | string | recharge 充值客服,platform 平台客服,agent 代理客服。 |
customer_services[].source_text | string | 客服来源展示文案。 |
customer_services[].name | string | 客服名称。 |
customer_services[].url | string | 客服跳转地址。 |
customer_services[].status | int | 状态,1 可用。 |
customer_services[].sort | int | 来源内部排序值。 |
proof_upload | object | 转账凭证上传配置,银行卡和手动加密货币充值提交凭证时使用。 |
proof_upload.upload_url | string | 凭证上传地址。 |
proof_upload.field | string | 上传文件字段名。 |
proof_upload.public_base_url | string | 上传后文件访问域名。 |
proof_upload.path_replace_from | string | 上传服务返回路径需要替换的前缀。 |
proof_upload.path_replace_to | string | 上传服务返回路径替换后的前缀。 |
/api/frontend/recharge/offline/customer-services公开接口名:获取线下充值客服列表
作用:用户选择线下充值后,单独拉取可展示的客服列表,方便充值页按运营配置顺序展示客服入口。
| 参数 | 必填 | 说明 |
|---|---|---|
无请求参数。可选携带 Authorization,用于返回登录用户相关的代理客服。 | ||
请求示例
GET https://admin.bin9k.top/api/frontend/recharge/offline/customer-services Authorization: Bearer <access_token> lang: zh-CN
返回示例
{
"code": 0,
"msg": "成功",
"data": {
"enabled": 1,
"customer_service_types": [
{
"type": "recharge",
"label": "充值客服",
"available_count": 1
},
{
"type": "platform",
"label": "平台客服",
"available_count": 1
}
],
"list": [
{
"id": 1,
"source_type": "recharge",
"source_text": "充值客服",
"name": "充值客服A",
"url": "https://service.example.com/recharge-a",
"status": 1,
"sort": 10
}
],
"count": 1
}
}
| 返回字段 | 类型 | 说明 |
|---|---|---|
enabled | int | 线下充值入口是否启用。 |
customer_service_types | array | 后台配置的客服来源顺序。 |
customer_service_types[].type | string | recharge 充值客服,platform 平台客服,agent 代理客服。 |
customer_service_types[].label | string | 客服来源展示文案。 |
customer_service_types[].available_count | int | 当前来源下可返回的客服数量。 |
list | array | 充值页展示的客服列表。 |
list[].id | int | 客服 ID,平台客服为 0。 |
list[].source_type | string | recharge 充值客服,platform 平台客服,agent 代理客服。 |
list[].source_text | string | 客服来源展示文案。 |
list[].name | string | 客服名称。 |
list[].url | string | 客服跳转地址。 |
list[].status | int | 状态,1 可用。 |
list[].sort | int | 来源内部排序值。 |
count | int | 本次返回的客服数量。 |
/api/frontend/recharge/crypto/channels公开接口名:获取加密货币充值渠道
作用:返回已启用的加密货币充值渠道,平铺列表和按币种聚合列表都会带上当前平台币换算汇率。
| 参数 | 必填 | 说明 |
|---|---|---|
| 无请求参数。 | ||
请求示例
GET https://admin.bin9k.top/api/frontend/recharge/crypto/channels
返回示例
{
"code": 0,
"msg": "成功",
"data": {
"list": [
{
"id": 1,
"channel_key": "TRC20-USDT",
"chain": "TRC20",
"coin": "USDT",
"module": 1,
"min_amount": "10",
"max_amount": "0",
"exchange_rate": "1",
"platform_currency": "JPY",
"platform_usd_rate": "0.00670000",
"crypto_platform_rate": "149.25373134",
"crypto_platform_rate_text": "1 USDT = 149.25373134 JPY",
"buttons": ["10", "20", "50"]
}
],
"coins": [
{
"coin": "USDT",
"name": "USDT",
"networks": []
}
]
}
}
| 返回字段 | 类型 | 说明 |
|---|---|---|
list[] | array | 平铺渠道列表。 |
coins[] | array | 按币种聚合后的列表。 |
coins[].networks | array | 该币种可选择的网络,字段结构同 list[]。 |
channel_key | string | 渠道唯一 key,可用于创建订单和查询当前订单。 |
exchange_rate | string | 当前有效的加密货币兑 USD 汇率。 |
platform_currency | string | 平台货币符号。 |
platform_usd_rate | string | 平台货币兑 USD 汇率。 |
crypto_platform_rate | string | 1 个加密货币可折算的平台币数量。 |
crypto_platform_rate_text | string | 1加密货币 = 多少平台币 的展示文案。 |
/api/frontend/recharge/crypto/orders/current需登录接口名:查询当前加密货币待充值订单
作用:用户选中币种网络后查询是否已有待充值订单;无论是否存在订单,channel 都会返回当前平台币换算汇率。
| 参数 | 必填 | 说明 |
|---|---|---|
channel_key | 推荐 | 渠道唯一 key,例如 TRC20-USDT。 |
id | 二选一 | 渠道 ID,没有传 channel_key 时可用。 |
chain / coin | 二选一 | 网络和币种一起传入时可生成渠道 key。 |
请求示例
GET https://admin.bin9k.top/api/frontend/recharge/crypto/orders/current?channel_key=TRC20-USDT Authorization: Bearer <access_token> lang: zh-CN
返回示例
{
"code": 0,
"msg": "成功",
"data": {
"has_order": 1,
"channel": {
"channel_key": "TRC20-USDT",
"chain": "TRC20",
"coin": "USDT",
"module": 1,
"exchange_rate": "1",
"platform_currency": "JPY",
"platform_usd_rate": "0.00670000",
"crypto_platform_rate": "149.25373134",
"crypto_platform_rate_text": "1 USDT = 149.25373134 JPY"
},
"order": {
"order_no": "RC202604231200001234",
"method": "crypto",
"channel_name": "TRC20 / USDT",
"amount": "100",
"crypto_platform_rate": "149.25373134",
"crypto_platform_rate_text": "1 USDT = 149.25373134 JPY",
"status": 0,
"status_text": "待充值",
"can_cancel": 1
},
"wallet": {
"address": "Txxxxxxxxxxxxxxxx"
}
}
}
| 返回字段 | 类型 | 说明 |
|---|---|---|
has_order | int | 1 存在待充值订单,0 没有。 |
channel | object | 当前选择的加密货币渠道信息。 |
channel.crypto_platform_rate | string | 1 个加密货币可折算的平台币数量。 |
channel.crypto_platform_rate_text | string | 1加密货币 = 多少平台币 的展示文案。 |
order | object | 存在待充值订单时返回,字段结构和订单详情一致。 |
order.crypto_platform_rate | string | 订单锁定汇率下 1 个加密货币可折算的平台币数量。 |
wallet.address | string | 前端需要展示的收款钱包地址。 |
/api/frontend/recharge/orders需登录接口名:获取用户充值记录
作用:分页返回当前用户的银行卡和加密货币充值记录,只返回 H5 记录页展示和操作需要的字段。
| 参数 | 必填 | 说明 |
|---|---|---|
method | 否 | bank 银行卡,crypto 加密货币;不传返回全部。 |
status | 否 | 0 待充值,1 已到账,2 充值失败,3 已取消,4 自动取消。 |
page | 否 | 页码,默认 1。 |
page_size | 否 | 每页数量,默认 10,最大 50。 |
请求示例
GET https://admin.bin9k.top/api/frontend/recharge/orders?page=1&page_size=10&method=crypto Authorization: Bearer <access_token> lang: zh-CN
返回示例
{
"code": 0,
"msg": "成功",
"data": {
"list": [
{
"id": 21,
"order_no": "RC202604231200001234",
"method": "crypto",
"method_name": "加密货币",
"channel_name": "TRC20 / USDT",
"account_summary": "Txxxxxxxxxxxxxxxx",
"amount": "100",
"amount_unit": "USDT",
"paid_amount": "0",
"paid_amount_unit": "USDT",
"arrive_amount": "0",
"arrive_unit": "JPY",
"platform_currency": "JPY",
"platform_currency_symbol": "JPY",
"platform_usd_rate": "0.00670000",
"status": 0,
"status_text": "待充值",
"status_type": "warning",
"proof_required": 0,
"cert_url": "",
"cert_is_image": 0,
"can_cancel": 1,
"created_at": 1710000000,
"created_time": "2024-03-10 12:00:00",
"paid_at": 0,
"paid_time": "",
"chain": "TRC20",
"coin": "USDT",
"module": 1,
"module_text": "代收",
"rate_display": "1",
"crypto_usd_rate": "1",
"crypto_usd_amount": "100",
"rate_text": "1 USDT = 1 USD",
"platform_rate_text": "1 JPY = 0.0067 USD",
"expected_arrival_amount": "14925.37313433",
"expected_arrival_currency": "JPY",
"expire_time": 1710001800,
"countdown_seconds": 1800
}
],
"total": 1,
"page": 1,
"page_size": 10,
"method": "crypto",
"status": ""
}
}
| 返回字段 | 类型 | 说明 |
|---|---|---|
list | array | 当前页充值记录列表,按创建时间倒序。 |
total | int | 符合筛选条件的总数量。 |
list[].order_no | string | 充值订单号。 |
list[].method | string | bank 或 crypto。 |
list[].channel_name | string | 银行卡为银行名称,加密货币为网络/币种。 |
list[].account_summary | string | 收款账户摘要。 |
list[].amount | string | 用户提交的充值数量或金额。 |
list[].amount_unit | string | 充值数量或金额单位。 |
list[].arrive_amount | string | 折算后入账到用户余额的金额。 |
list[].platform_currency | string | 平台货币符号。 |
list[].platform_usd_rate | string | 平台货币兑 USD 汇率。 |
list[].status_text | string | 状态文案。 |
list[].proof_required | int | 是否需要补传转账凭证。 |
list[].can_cancel | int | 是否允许取消。 |
list[].created_time | string | 创建时间文案。 |
list[].module_text | string | 仅加密货币返回,代收或手动。 |
list[].crypto_usd_rate | string | 仅加密货币返回,加密货币兑 USD 汇率。 |
list[].crypto_usd_amount | string | 仅加密货币返回,币种数量折算后的 USD 金额。 |
list[].rate_text | string | 仅加密货币返回,加密货币兑 USD 汇率文案。 |
list[].platform_rate_text | string | 仅加密货币返回,平台货币兑 USD 汇率文案。 |
list[].countdown_seconds | int | 仅加密货币待充值订单返回剩余倒计时秒数。 |
提现
提现接口用于 H5 用户读取提现入口配置、维护收款资料、提交提现申请、查询提现记录和详情。收款资料包含银行卡绑定和加密货币提现钱包绑定,提交成功后会立即扣减用户余额,后台拒绝时自动退回余额并写入账变记录。
/frontend/withdrawal-demo 可直接测试银行卡绑定、钱包绑定、提交提现、记录和详情接口。
银行卡接口复用
/api/frontend/user/bank-cards,加密钱包接口使用 /api/frontend/withdrawal/crypto/wallets/bind,文档统一放在提现章节。/api/frontend/user/bank-cards需登录接口名:获取提现银行卡列表
| 参数 | 必填 | 说明 |
|---|---|---|
无请求参数。银行卡提现时使用返回的 list[].id 作为 bank_card_id。 | ||
返回示例
{
"code": 0,
"msg": "成功",
"data": {
"can_update_bank_card": 1,
"can_add_bank_card": 1,
"bank_card_count": 1,
"bank_card_max_count": 3,
"bank_card_duplicate_bind_enabled": 0,
"list": [
{
"id": 12,
"account_name": "张三",
"bank_name": "中国银行",
"branch_name": "东京支行",
"branch_no": "001",
"card_no_masked": "6222 **** **** 4218",
"status": 1
}
]
}
}
| 返回字段 | 类型 | 说明 |
|---|---|---|
can_update_bank_card | int | 后台是否允许用户修改已绑定银行卡。 |
can_add_bank_card | int | 当前用户是否还能新增银行卡。 |
bank_card_max_count | int | 每个用户可绑定银行卡数量,0 表示不限制。 |
list[].id | int | 银行卡 ID,提交银行卡提现时传入。 |
list[].card_no_masked | string | 脱敏银行卡号,前端列表展示优先使用。 |
/api/frontend/user/bank-cards/create / update需登录接口名:新增或修改提现银行卡
| 参数 | 必填 | 说明 |
|---|---|---|
id | 修改必填 | 银行卡 ID;新增不传。 |
account_name | 是 | 持卡人姓名,必须与当前用户真实姓名一致。 |
bank_name | 是 | 银行名称。 |
branch_name | 是 | 分行名称。 |
branch_no | 是 | 分行编号。 |
card_no | 是 | 银行卡号。 |
payment_password | 是 | 支付密码。 |
请求示例
{
"account_name": "张三",
"bank_name": "中国银行",
"branch_name": "东京支行",
"branch_no": "001",
"card_no": "6222026006705354218",
"payment_password": "123456"
}
返回示例
{
"code": 0,
"msg": "成功",
"data": {
"item": {
"id": 12,
"account_name": "张三",
"bank_name": "中国银行",
"branch_name": "东京支行",
"branch_no": "001",
"card_no_masked": "6222 **** **** 4218",
"status": 1
},
"can_update_bank_card": 1,
"can_add_bank_card": 1,
"bank_card_count": 1,
"bank_card_max_count": 3,
"list": []
}
}
| 返回字段 | 类型 | 说明 |
|---|---|---|
item | object | 新增或修改后的银行卡。 |
item.id | int | 银行卡 ID。 |
can_add_bank_card | int | 保存后是否还能继续添加银行卡。 |
list | array | 保存后的当前用户银行卡列表。 |
/api/frontend/withdrawal/methods公开接口名:获取提现方式
| 参数 | 必填 | 说明 |
|---|---|---|
无。可选携带 Authorization,已登录时返回当前用户提现限额。 | ||
返回示例
{
"code": 0,
"msg": "成功",
"data": {
"list": [
{
"id": 1,
"method": "bank",
"name": "银行卡",
"display_status": 1,
"enable_status": 1,
"enabled": 1,
"available_count": 1,
"status_text": "可用",
"rule_content": "<p>银行卡提现规则</p>",
"rule_html": "<p>银行卡提现规则</p>",
"description": "使用已绑定银行卡提交提现申请"
}
],
"limits": {
"min_amount": "10.00",
"max_amount": "5000.00",
"daily_limit": 3,
"balance": "1000.00"
}
}
}
| 返回字段 | 类型 | 说明 |
|---|---|---|
list[].method | string | bank 银行卡,crypto 加密货币,offline 线下提现。 |
list[].enable_status | int | 当前方式是否可提交。 |
list[].rule_content | string | 后台配置的提现规则富文本,支持多语言。 |
limits | object | 已登录用户提现金额范围、每日次数和余额。 |
/api/frontend/withdrawal/offline/customer-services公开接口名:获取线下提现客服列表
| 参数 | 必填 | 说明 |
|---|---|---|
| 无。客服排序由后台线下提现客服类型拖拽顺序决定。 | ||
{
"code": 0,
"msg": "成功",
"data": {
"enabled": 1,
"customer_service_types": [
{"type": "withdrawal", "label": "提现客服", "available_count": 1}
],
"list": [
{"id": 1, "source_type": "withdrawal", "source_text": "提现客服", "name": "提现客服A", "url": "https://example.com/kefu", "status": 1, "sort": 10}
],
"count": 1
}
}
| 返回字段 | 类型 | 说明 |
|---|---|---|
enabled | int | 线下提现入口是否开启。 |
list[].source_type | string | withdrawal 提现客服,platform 平台客服,agent 代理客服。 |
list[].url | string | 点击跳转客服地址。 |
/api/frontend/withdrawal/crypto/channels公开接口名:获取提现加密货币通道
| 参数 | 必填 | 说明 |
|---|---|---|
无。可选携带 Authorization,已登录时会返回当前用户在对应币种网络下绑定的钱包。 | ||
{
"code": 0,
"msg": "成功",
"data": {
"list": [
{"id": 1, "channel_key": "TRC20-USDT", "chain": "TRC20", "coin": "USDT", "icon": "https://admin.bin9k.top/common/crypto/TRC20-USDT.png", "min_amount": "10", "max_amount": "5000", "exchange_rate": "1", "platform_currency": "JPY", "platform_usd_rate": "0.0067", "crypto_platform_rate": "149.25373134", "crypto_platform_rate_text": "1 USDT = 149.25373134 JPY", "wallet_bound": 1, "wallet": {"id": 8, "address": "Txxxxxxxxxxxxxxxx"}, "buttons": [100, 500]}
],
"coins": [{"coin": "USDT", "name": "USDT", "networks": []}],
"wallet_config": {"update_enabled": 1, "duplicate_bind_enabled": 0}
}
}
| 返回字段 | 类型 | 说明 |
|---|---|---|
list[].channel_key | string | 提交提现时传入的通道标识。 |
list[].min_amount / max_amount | string | 当前通道金额范围,0 表示不限制。 |
list[].crypto_platform_rate | string | 1 个加密货币可折算的平台币数量。 |
list[].crypto_platform_rate_text | string | 1加密货币 = 多少平台币 的展示文案。 |
list[].wallet | object/null | 已登录用户在该网络币种下绑定的钱包,没有绑定时为 null。 |
wallet_config | object | 后台钱包修改和重复绑定策略。 |
coins | array | 按币种聚合的网络列表。 |
/api/frontend/withdrawal/crypto/wallets/bind需登录接口名:绑定或更新提现钱包
| 参数 | 必填 | 说明 |
|---|---|---|
channel_key | 推荐 | 提现币种网络标识,例如 TRC20-USDT。 |
chain / coin | 二选一 | 未传 channel_key 时可用网络和币种组合。 |
address | 是 | 用户收款钱包地址。 |
{
"code": 0,
"msg": "成功",
"data": {
"wallet": {"id": 8, "channel_key": "TRC20-USDT", "chain": "TRC20", "coin": "USDT", "address": "Txxxxxxxxxxxxxxxx", "status": 1},
"channel": {"channel_key": "TRC20-USDT", "chain": "TRC20", "coin": "USDT"},
"wallet_config": {"update_enabled": 1, "duplicate_bind_enabled": 0}
}
}
| 返回字段 | 类型 | 说明 |
|---|---|---|
wallet.address | string | 当前绑定的钱包地址,用于前端回填。 |
wallet_config.update_enabled | int | 0 表示已绑定后不能修改,只允许首次绑定。 |
wallet_config.duplicate_bind_enabled | int | 0 表示同一币种网络下同一钱包不能被其他用户重复绑定。 |
/api/frontend/withdrawal/orders/create需登录接口名:提交提现申请
| 参数 | 必填 | 说明 |
|---|---|---|
method | 是 | bank、crypto、offline。 |
amount | 是 | 提现金额。 |
payment_password | 是 | 支付密码。 |
bank_card_id | 银行卡必填 | 用户已绑定的银行卡 ID。 |
channel_key | 加密货币必填 | 提现币种网络标识。 |
address | 否 | 加密货币钱包地址;不传时使用该用户已绑定的钱包。 |
remark | 否 | 用户备注。 |
请求示例
{
"method": "bank",
"amount": "100.00",
"bank_card_id": 1,
"payment_password": "123456",
"remark": "提现到银行卡"
}
返回示例
{
"code": 0,
"msg": "成功",
"data": {
"order": {
"id": 10,
"order_no": "TX202605141650001234",
"method": "bank",
"method_text": "银行卡",
"amount": "10000.00",
"amount_unit": "JPY",
"amount_text": "10000.00 JPY",
"account_text": "中国银行 / 6222 **** **** 4218 / 张三",
"account": {
"type": "bank",
"type_text": "银行卡",
"summary": "中国银行 / 6222 **** **** 4218 / 张三"
},
"status": 0,
"status_text": "待审核",
"created_time": "2026-05-14 16:50:00",
"bank": {"account_name": "张三", "bank_name": "中国银行", "card_no_masked": "6222 **** **** 0000"},
"crypto": null
},
"balance": {"before_balance": "1000.00", "after_balance": "900.00"}
}
}
| 返回字段 | 类型 | 说明 |
|---|---|---|
order.order_no | string | 提现订单号,账变备注会记录。 |
order.amount_unit | string | 提现金额单位,例如 $。 |
order.amount_text | string | 带单位的提现金额展示文案。 |
order.account | object | 本次提现收款账户快照,银行卡、加密货币和线下提现结构会按类型返回。 |
order.account_text | string | 收款账户摘要,列表可直接展示。 |
order.status | int | 0 待审核,1 已通过,2 已拒绝。 |
balance.after_balance | string | 提交后余额;拒绝提现时会自动退回。 |
/api/frontend/withdrawal/orders需登录接口名:获取提现记录
| 参数 | 必填 | 说明 |
|---|---|---|
page / page_size | 否 | 分页参数,默认 1 / 20。 |
method | 否 | bank、crypto、offline,不传返回全部。 |
status | 否 | 0 待审核,1 已出款,2 已拒绝,3 待出款。 |
请求示例
GET https://admin.bin9k.top/api/frontend/withdrawal/orders?page=1&page_size=20&method=crypto Authorization: Bearer <access_token> lang: zh-CN
返回示例
{
"code": 0,
"msg": "成功",
"data": {
"list": [
{
"id": 10,
"order_no": "TX202605141650001234",
"method": "crypto",
"method_text": "加密货币",
"amount": "10000.00",
"amount_unit": "JPY",
"amount_text": "10000.00 JPY",
"platform_currency": "JPY",
"platform_currency_symbol": "JPY",
"account_text": "TRC20 / USDT / Txxxxx...xxxxxx",
"exchange_rate": "1",
"crypto_usd_rate": "1",
"platform_usd_rate": "0.0067",
"crypto_usd_amount": "67",
"rate_text": "1 USDT = 1 USD",
"crypto_platform_rate": "149.25373134",
"crypto_platform_rate_text": "1 USDT = 149.25373134 JPY",
"platform_rate_text": "1 JPY = 0.0067 USD",
"expected_arrival_amount": "67",
"expected_arrival_currency": "USDT",
"expected_arrival_text": "67 USDT",
"status": 0,
"status_text": "待审核",
"status_type": "warning",
"created_time": "2026-05-14 16:50:00"
}
],
"total": 1,
"page": 1,
"page_size": 20,
"method": "crypto",
"status": ""
}
}
| 返回字段 | 类型 | 说明 |
|---|---|---|
list | array | 当前用户自己的提现记录。 |
list[].method_text | string | 提现方式文案,会根据请求头 lang 返回对应语言。 |
list[].amount_text | string | 带货币单位的提现金额。 |
list[].account_text | string | 收款账户摘要,银行卡展示银行/卡号/姓名,加密货币展示网络/币种/钱包。 |
list[].exchange_rate | string | 加密货币兑 USD 汇率,非加密货币为空。 |
list[].platform_usd_rate | string | 平台货币兑 USD 汇率。 |
list[].crypto_usd_amount | string | 提现金额折算的 USD 金额。 |
list[].crypto_platform_rate | string | 1 个加密货币可折算的平台币数量。 |
list[].crypto_platform_rate_text | string | 1加密货币 = 多少平台币 的展示文案。 |
list[].expected_arrival_text | string | 加密货币预计到账数量和币种,非加密货币为空。 |
list[].status_text | string | 提现状态文案。 |
list[].status_type | string | 状态标签类型,前端可映射颜色。 |
list[].created_time | string | 创建时间文案。 |
total | int | 总条数。 |
method | string | 实际使用的提现方式筛选值。 |
status | string | 实际使用的状态筛选值。 |
/api/frontend/withdrawal/orders/detail需登录接口名:获取提现详情
| 参数 | 必填 | 说明 |
|---|---|---|
id | 二选一 | 提现订单 ID。 |
order_no | 二选一 | 提现订单号。 |
{
"code": 0,
"msg": "成功",
"data": {
"order": {
"id": 10,
"order_no": "TX202605141650001234",
"method_text": "加密货币",
"amount": "100.00",
"amount_unit": "$",
"amount_text": "100.00 $",
"account_text": "TRC20 / USDT / Txxxxx...xxxxxx",
"account": {
"type": "crypto",
"type_text": "加密货币",
"summary": "TRC20 / USDT / Txxxxx...xxxxxx"
},
"status_text": "已拒绝",
"remark": "资料不完整",
"audit_username": "admin",
"bank": null,
"crypto": {
"channel_key": "TRC20-USDT",
"chain": "TRC20",
"coin": "USDT",
"address": "Txxxxxxxxxxxxxxxx",
"address_masked": "Txxxxx...xxxxxx",
"exchange_rate": "1",
"crypto_usd_rate": "1",
"platform_usd_rate": "0.0067",
"crypto_usd_amount": "67",
"rate_text": "1 USDT = 1 USD",
"crypto_platform_rate": "149.25373134",
"crypto_platform_rate_text": "1 USDT = 149.25373134 JPY",
"platform_rate_text": "1 JPY = 0.0067 USD",
"expected_arrival_amount": "67",
"expected_arrival_currency": "USDT",
"expected_arrival_text": "67 USDT"
}
}
}
}
| 返回字段 | 类型 | 说明 |
|---|---|---|
order.account | object | 通用收款账户快照。 |
order.bank | object/null | 银行卡提现资料。 |
order.crypto | object/null | 加密货币提现资料,包含钱包地址、汇率和预计到账。 |
order.crypto.rate_text | string | 加密货币兑 USD 汇率展示文案。 |
order.crypto.crypto_platform_rate | string | 1 个加密货币可折算的平台币数量。 |
order.crypto.crypto_platform_rate_text | string | 1加密货币 = 多少平台币 的展示文案。 |
order.crypto.platform_rate_text | string | 平台货币兑 USD 汇率展示文案。 |
order.crypto.crypto_usd_amount | string | 提现金额折算的 USD 金额。 |
order.crypto.expected_arrival_text | string | 预计到账展示文案。 |
影院
影院接口按重构后的前端标准返回 {code,msg,data},包含影院分类、影院列表、影院详情和热门推荐。热门推荐只返回后台标记为热门的视频,并随机排序。
/frontend/cinema-demo 可直接测试影院分类、列表、详情和热门推荐接口。
latest 最新,hot 热门,play_count_desc 播放次数从高到低,play_count_asc 播放次数从低到高。/api/frontend/cinema/categories公开接口名:获取影院分类
作用:返回启用状态的影院分类。
| 参数 | 必填 | 说明 |
|---|---|---|
| 无请求参数。 | ||
{
"code": 0,
"msg": "成功",
"data": {
"list": [
{
"id": 1,
"name": "默认分类",
"sort": 10,
"video_count": 0,
"status": 1,
"created_at": 1710000000,
"updated_at": 1710000000
}
]
}
}
| 返回字段 | 类型 | 说明 |
|---|---|---|
list | array | 影院分类列表。 |
list[].id | int | 分类 ID。 |
list[].name | string | 分类名称。 |
list[].sort | int | 排序值。 |
list[].video_count | int | 分类下视频数量。 |
list[].status | int | 状态,1 启用。 |
list[].created_at | int/string | 创建时间。 |
list[].updated_at | int/string | 更新时间。 |
/api/frontend/cinema/list公开接口名:获取影院列表
作用:分页返回启用状态的影院视频,可按分类和排序筛选。
| 参数 | 必填 | 说明 |
|---|---|---|
category_id | 否 | 分类 ID,不传返回全部分类。 |
page | 否 | 页码,从 1 开始。 |
page_size | 否 | 每页数量,默认 8,最大 50。 |
sort | 否 | latest、hot、play_count_desc、play_count_asc。 |
{
"code": 0,
"msg": "成功",
"data": {
"list": [
{
"id": 1,
"title": "示例视频",
"cover_url": "/storage/video/demo.png",
"cover_full_url": "http://127.0.0.1:8841/storage/video/demo.png",
"play_url": "https://example.com/demo.m3u8",
"duration": "",
"play_count": 100,
"category_id": 1,
"category_name": "默认分类",
"is_hot": 0,
"status": 1,
"created_at": 1710000000,
"updated_at": 1710000000
}
],
"total": 1,
"page": 1,
"page_size": 8,
"sort": "latest"
}
}
| 返回字段 | 类型 | 说明 |
|---|---|---|
list | array | 影院视频列表。 |
total | int | 符合条件的总数量。 |
page | int | 当前页码。 |
page_size | int | 每页数量。 |
sort | string | 实际使用的排序值。 |
list[].id | int | 视频 ID。 |
list[].title | string | 视频标题。 |
list[].cover_url | string | 后台保存的封面地址。 |
list[].cover_full_url | string | 可直接访问的完整封面地址。 |
list[].play_url | string | 视频播放地址。 |
list[].duration | string | 视频时长。 |
list[].play_count | int | 播放次数。 |
list[].category_id | int | 分类 ID。 |
list[].category_name | string | 分类名称。 |
list[].is_hot | int | 是否热门,1 是,0 否。 |
list[].status | int | 状态,1 启用。 |
list[].created_at | int/string | 创建时间。 |
list[].updated_at | int/string | 更新时间。 |
/api/frontend/cinema/detail公开接口名:获取影院详情
作用:按视频 ID 返回影院视频详情。
| 参数 | 必填 | 说明 |
|---|---|---|
id | 是 | 视频 ID。 |
{
"code": 0,
"msg": "成功",
"data": {
"item": {
"id": 1,
"title": "示例视频",
"cover_url": "/storage/video/demo.png",
"cover_full_url": "http://127.0.0.1:8841/storage/video/demo.png",
"play_url": "https://example.com/demo.m3u8",
"duration": "",
"play_count": 100,
"category_id": 1,
"category_name": "默认分类",
"is_hot": 1,
"status": 1,
"created_at": 1710000000,
"updated_at": 1710000000
}
}
}
| 返回字段 | 类型 | 说明 |
|---|---|---|
item | object | 视频详情,字段与影院列表项一致。 |
item.id | int | 视频 ID。 |
item.title | string | 视频标题。 |
item.cover_url | string | 后台保存的封面地址。 |
item.cover_full_url | string | 可直接访问的完整封面地址。 |
item.play_url | string | 视频播放地址。 |
item.duration | string | 视频时长。 |
item.play_count | int | 播放次数。 |
item.category_id | int | 分类 ID。 |
item.category_name | string | 分类名称。 |
item.is_hot | int | 是否热门,1 是,0 否。 |
item.status | int | 状态,1 启用。 |
item.created_at | int/string | 创建时间。 |
item.updated_at | int/string | 更新时间。 |
/api/frontend/cinema/hot公开接口名:获取热门推荐影院
作用:从热门视频中随机返回推荐列表,可按分类过滤。
| 参数 | 必填 | 说明 |
|---|---|---|
category_id | 否 | 分类 ID,不传则从全部热门视频中随机返回。 |
limit | 否 | 返回数量,默认 8,最大 20。 |
{
"code": 0,
"msg": "成功",
"data": {
"list": [
{
"id": 1,
"title": "示例视频",
"cover_url": "/storage/video/demo.png",
"cover_full_url": "http://127.0.0.1:8841/storage/video/demo.png",
"play_url": "https://example.com/demo.m3u8",
"duration": "",
"play_count": 100,
"category_id": 1,
"category_name": "默认分类",
"is_hot": 1,
"status": 1,
"created_at": 1710000000,
"updated_at": 1710000000
}
],
"limit": 8,
"category_id": 1,
"is_random": 1
}
}
| 返回字段 | 类型 | 说明 |
|---|---|---|
list | array | 热门推荐视频列表,只返回 is_hot=1 的视频。 |
limit | int | 本次请求使用的返回数量。 |
category_id | int | 本次请求使用的分类 ID,未传时为 0。 |
is_random | int | 是否随机排序,1 表示每次请求随机返回。 |
list[] | object | 视频项,字段与影院列表项一致。 |
list[].id | int | 视频 ID。 |
list[].title | string | 视频标题。 |
list[].cover_url | string | 后台保存的封面地址。 |
list[].cover_full_url | string | 可直接访问的完整封面地址。 |
list[].play_url | string | 视频播放地址。 |
list[].duration | string | 视频时长。 |
list[].play_count | int | 播放次数。 |
list[].category_id | int | 分类 ID。 |
list[].category_name | string | 分类名称。 |
list[].is_hot | int | 热门推荐接口固定返回 1。 |
list[].status | int | 状态,1 启用。 |
list[].created_at | int/string | 创建时间。 |
list[].updated_at | int/string | 更新时间。 |
资源
资源接口按地区组织资源列表,传 recommend=1 时返回首页推荐资源;详情接口额外返回图集字段 gallery_urls 和 gallery_full_urls。
/frontend/resources-demo 可直接测试资源地区、列表和详情接口。
列表返回
cover_full_url,详情返回完整图集地址,前端可直接展示。/api/frontend/resources/regions公开接口名:获取资源地区
{
"code": 0,
"msg": "成功",
"data": {
"list": [
{"id": 1, "name": "默认地区", "sort": 10, "item_count": 0, "status": 1}
]
}
}
/api/frontend/resources/items公开接口名:获取资源列表 / 首页推荐资源
作用:分页获取选妃资源列表。普通资源列表和首页推荐资源共用该接口,传 recommend=1 时只返回后台标记为“首页推荐”的资源。
| 参数 | 必填 | 说明 |
|---|---|---|
region_id | 否 | 地区 ID,不传返回全部地区。 |
recommend | 否 | 传 1 时只返回后台标记为首页推荐的资源。 |
page | 否 | 页码,从 1 开始。 |
page_size | 否 | 每页数量,默认 8,最大 50。 |
请求示例
https://admin.bin9k.top/api/frontend/resources/items?recommend=1&page=1&page_size=8
返回示例
{
"code": 0,
"msg": "成功",
"data": {
"list": [
{
"id": 1,
"title": "23",
"age": "23",
"cover_url": "/api/materials/preview?id=6",
"cover_full_url": "https://admin.bin9k.top/api/materials/preview?id=6",
"region_id": 1,
"region_name": "默认地区",
"height_cm": "168",
"bust": "C",
"tags_text": "温柔,认证",
"tags": ["温柔", "认证"],
"rating": 5,
"address": "台北",
"like_count": 100,
"description": "简介",
"weight_kg": "48",
"video_url": "",
"status": 1,
"is_home_recommend": 1,
"created_at": 1710000000
}
],
"total": 1,
"page": 1,
"page_size": 8,
"recommend": 1
}
}
| 返回字段 | 说明 |
|---|---|
list | 资源列表,按添加时间倒序返回。 |
total | 符合当前筛选条件的总数量。 |
page | 当前页码。 |
page_size | 当前每页数量。 |
recommend | 本次是否启用首页推荐过滤,1 是,0 否。 |
list[].id | 资源 ID,详情接口使用。 |
list[].title / age | 资源主标题和年龄展示值,当前都来自后台“年龄/名称”字段。 |
list[].cover_url | 站内封面地址,后台素材地址会转为前端公开预览地址。 |
list[].cover_full_url | 带当前域名的完整封面地址,H5 可直接用于图片展示。 |
list[].region_id / region_name | 所属地区 ID 和地区名称。 |
list[].height_cm / bust / weight_kg | 身高、胸围、体重展示值。 |
list[].tags_text / tags | 标签原始文本和拆分后的标签数组。 |
list[].rating | 评分展示值。 |
list[].address | 资源地址文案。 |
list[].like_count | 点赞数。 |
list[].description | 资源简介。 |
list[].video_url | 视频地址,没有配置时为空字符串。 |
list[].status | 资源状态,前端接口只返回启用状态资源。 |
list[].is_home_recommend | 是否首页推荐,1 是,0 否。 |
list[].created_at | 创建或添加时间戳。 |
/api/frontend/resources/items/detail公开接口名:获取资源详情
作用:按资源 ID 获取单条资源详情。详情包含列表中的全部基础字段,并额外返回图集地址数组。
| 参数 | 必填 | 说明 |
|---|---|---|
id | 是 | 资源 ID。 |
请求示例
https://admin.bin9k.top/api/frontend/resources/items/detail?id=1
返回示例
{
"code": 0,
"msg": "成功",
"data": {
"item": {
"id": 1,
"title": "23",
"age": "23",
"cover_url": "/api/materials/preview?id=6",
"cover_full_url": "https://admin.bin9k.top/api/materials/preview?id=6",
"region_id": 1,
"region_name": "默认地区",
"height_cm": "168",
"bust": "C",
"tags_text": "温柔,认证",
"tags": ["温柔", "认证"],
"rating": 5,
"address": "台北",
"like_count": 100,
"description": "简介",
"weight_kg": "48",
"video_url": "",
"status": 1,
"is_home_recommend": 1,
"created_at": 1710000000,
"gallery_urls": ["/api/materials/preview?id=6"],
"gallery_full_urls": ["https://admin.bin9k.top/api/materials/preview?id=6"]
}
}
}
| 返回字段 | 说明 |
|---|---|
item | 资源详情对象。 |
item.id | 资源 ID。 |
item.title / age | 资源主标题和年龄展示值。 |
item.cover_url / cover_full_url | 封面站内地址和完整访问地址。 |
item.region_id / region_name | 所属地区 ID 和地区名称。 |
item.height_cm / bust / weight_kg | 身高、胸围、体重展示值。 |
item.tags_text / tags | 标签原始文本和拆分后的标签数组。 |
item.rating | 评分展示值。 |
item.address | 资源地址文案。 |
item.like_count | 点赞数。 |
item.description | 详情简介文案。 |
item.video_url | 视频地址,没有配置时为空字符串。 |
item.status | 资源状态,前端接口只返回启用状态资源。 |
item.is_home_recommend | 是否首页推荐。 |
item.created_at | 创建或添加时间戳。 |
item.gallery_urls | 图集站内地址数组。 |
item.gallery_full_urls | 图集完整访问地址数组,H5 可直接用于大图预览。 |
彩票
彩票接口按当前项目统一结构返回,公开接口用于展示分类、彩票、当前期号、开奖历史和赔率;下注与投注记录需要登录 token。
/frontend/lottery-demo 可直接测试彩票全套前端接口。
big 大、small 小、odd 单、even 双,和值玩法为 sum_3 到 sum_18。/api/frontend/lottery/categories公开接口名:获取彩票分类
作用:返回启用状态的彩票分类。
| 参数 | 必填 | 说明 |
|---|---|---|
| 无 | - | 本接口无请求参数。 |
{
"code": 0,
"msg": "ok",
"data": {
"list": [
{
"id": 1,
"name": "默认分类",
"sort": 10,
"lottery_count": 3,
"status": 1
}
]
}
}
| 返回字段 | 说明 |
|---|---|
list | 分类列表。 |
list[].id / name | 分类 ID 和分类名称。 |
list[].sort | 排序值,值越小越靠前。 |
list[].lottery_count | 分类下彩票数量。 |
list[].status | 状态,1 启用。 |
/api/frontend/lottery/items公开接口名:获取彩票列表
| 参数 | 必填 | 说明 |
|---|---|---|
category_id / class_id | 否 | 分类 ID,不传返回全部。 |
keyword / q | 否 | 按彩票名称、标识或分类名称搜索。 |
hot | 否 | 1 只返回热门。 |
page | 否 | 页码,默认 1。 |
page_size | 否 | 每页数量,默认 20,最大 50。 |
{
"code": 0,
"msg": "ok",
"data": {
"list": [
{
"id": 1,
"name": "五分快三",
"lottery_key": "jsk3",
"category_id": 1,
"icon_full_url": "https://admin.bin9k.top/storage/lottery/demo.png",
"interval_seconds": 300,
"is_hot": 1
}
],
"total": 1,
"page": 1,
"page_size": 20
}
}
| 返回字段 | 说明 |
|---|---|
list | 彩票列表。 |
list[].id / name / lottery_key | 彩票 ID、名称和标识。 |
list[].category_id / category_name | 所属分类。 |
list[].icon_url / icon_full_url | 图标站内地址和完整地址。 |
list[].condition_amount | 做单要求金额。 |
list[].interval_seconds | 开奖间隔秒数。 |
total / page / page_size | 分页总数、当前页和每页数量。 |
/api/frontend/lottery/hot公开接口名:获取热门彩票
作用:返回后台标记为热门的彩票。
| 参数 | 必填 | 说明 |
|---|---|---|
limit | 否 | 返回数量,默认 8,最大 30。 |
{
"code": 0,
"msg": "ok",
"data": {
"list": [
{
"id": 1,
"name": "五分快三",
"lottery_key": "jsk3",
"is_hot": 1
}
],
"limit": 8
}
}
| 返回字段 | 说明 |
|---|---|
list | 热门彩票列表,字段同彩票列表。 |
limit | 本次请求限制返回数量。 |
/api/frontend/lottery/detail公开接口名:获取彩票详情
| 参数 | 必填 | 说明 |
|---|---|---|
lottery_id / lottery_key | 二选一 | 彩票 ID 或彩票标识。 |
{
"code": 0,
"msg": "ok",
"data": {
"item": {
"id": 1,
"name": "五分快三",
"lottery_key": "jsk3",
"play_count": 4
},
"current_issue": {
"expect": "202605120001",
"status": 0,
"remaining_seconds": 180
},
"last_issue": {
"expect": "202605120000",
"opencode": "1,2,3",
"sum": 6
},
"play_options": [
{
"play_key": "big",
"name": "大",
"odds": "1.98"
}
]
}
}
| 返回字段 | 说明 |
|---|---|
item | 彩票基础信息。 |
current_issue | 当前最近一条待开奖期号。 |
last_issue | 最近一条已开奖期号。 |
play_options | 启用玩法列表。 |
/api/frontend/lottery/play-page公开接口名:获取认证页彩票聚合
作用:认证页首屏一次返回彩票基础信息、页面配置、当前期、上期开奖结果、买入选项和往期结果。
| 参数 | 必填 | 说明 |
|---|---|---|
lottery_id / lottery_key | 否 | 彩票 ID 或彩票标识;不传时使用默认启用彩票。 |
page | 否 | 往期结果页码,默认 1。 |
page_size / history_limit | 否 | 往期结果每页数量,默认 20,最大 50。 |
{
"code": 0,
"msg": "ok",
"data": {
"item": {
"id": 1,
"name": "赞助轮调",
"lottery_key": "sponsor",
"play_count": 4
},
"config": {
"default_amount": "1.00",
"allow_multi_select": 1,
"result_refresh_seconds": 5
},
"current_issue": {
"expect": "202605133363",
"remaining_seconds": 82
},
"last_issue": {
"expect": "202605133362",
"numbers": [
6,
1,
2
],
"sum": 9
},
"buy_options": [
{
"play_key": "plane",
"name": "飞机",
"odds": "1.98"
}
],
"history": {
"list": [],
"total": 0,
"page": 1,
"page_size": 20
},
"server_time": 1778666918
}
}
| 返回字段 | 说明 |
|---|---|
item | 彩票基础信息。 |
config | 认证页配置,包含金额、刷新、倒计时和展示文案。 |
current_issue | 当前可买入期号。 |
last_issue | 最近已开奖期号。 |
buy_options | 买入选项数组。 |
history | 往期结果分页数据。 |
server_time | 服务端时间戳,用于校准倒计时。 |
/api/frontend/lottery/config公开接口名:获取认证页彩票配置
| 参数 | 必填 | 说明 |
|---|---|---|
lottery_id / lottery_key | 否 | 彩票 ID 或彩票标识;不传时使用默认启用彩票。 |
page_size / history_limit | 否 | 往期结果默认分页数量。 |
{
"code": 0,
"msg": "ok",
"data": {
"item": {
"id": 1,
"name": "赞助轮调",
"lottery_key": "sponsor"
},
"config": {
"default_amount": "1.00",
"min_amount": "1.00",
"allow_multi_select": 1,
"history_page_size": 20
},
"server_time": 1778666918
}
}
| 返回字段 | 说明 |
|---|---|
item | 彩票基础信息。 |
config.default_amount / min_amount / amount_step | 每单积分默认值、最小值和步进值。 |
config.allow_multi_select / max_selected_options | 是否允许多选以及最大可选数量。 |
server_time | 服务端当前时间戳。 |
/api/frontend/lottery/buy-options公开接口名:获取买入选项
| 参数 | 必填 | 说明 |
|---|---|---|
lottery_id / lottery_key | 否 | 彩票 ID 或彩票标识;不传时使用默认启用彩票。 |
{
"code": 0,
"msg": "ok",
"data": {
"item": {
"id": 1,
"name": "赞助轮调",
"lottery_key": "sponsor"
},
"list": [
{
"id": 1,
"play_key": "rocket",
"type": "rocket",
"name": "火箭",
"odds": "1.98",
"status": 1,
"icon_key": "rocket",
"style_key": "purple",
"sort": 1
}
]
}
}
| 返回字段 | 说明 |
|---|---|
item | 彩票基础信息。 |
list[].play_key | 前端下单使用的玩法标识。 |
list[].name / odds | 展示名称和当前赔率。 |
list[].icon_key / style_key | 图标和卡片样式建议值。 |
list[].sort | 排序值。 |
/api/frontend/lottery/current公开接口名:获取当前期号
| 参数 | 必填 | 说明 |
|---|---|---|
lottery_id / lottery_key | 否 | 彩票 ID 或彩票标识;不传时使用默认启用彩票。 |
{
"code": 0,
"msg": "ok",
"data": {
"item": {
"id": 1,
"name": "赞助轮调"
},
"current_issue": {
"expect": "202605133363",
"open_time": "2026-05-13 13:30:00",
"remaining_seconds": 82
},
"last_issue": {
"expect": "202605133362",
"opencode": "6,1,2",
"numbers": [
6,
1,
2
],
"sum": 9,
"actual_open_time": "2026-05-13 13:28:03"
}
}
}
| 返回字段 | 说明 |
|---|---|
current_issue.expect | 当前期号。 |
current_issue.open_time | 预计开奖时间。 |
current_issue.remaining_seconds | 距离开奖剩余秒数。 |
last_issue.numbers / sum | 上期开奖数字和和值。 |
last_issue.result_badges | 和值、大小、单双标签。 |
/api/frontend/lottery/results公开接口名:获取往期结果
| 参数 | 必填 | 说明 |
|---|---|---|
lottery_id / lottery_key | 否 | 彩票 ID 或彩票标识;不传时使用默认启用彩票。 |
page | 否 | 页码,默认 1。 |
page_size | 否 | 每页数量,默认 20,最大 50。 |
{
"code": 0,
"msg": "ok",
"data": {
"item": {
"id": 1,
"name": "赞助轮调"
},
"list": [
{
"expect": "202605133363",
"opencode": "6,1,2",
"numbers": [
6,
1,
2
],
"sum": 9,
"actual_open_time": "2026-05-13 13:30:03"
}
],
"total": 1,
"page": 1,
"page_size": 20
}
}
| 返回字段 | 说明 |
|---|---|
list | 往期已开奖列表。 |
list[].expect | 期号。 |
list[].opencode / numbers | 开奖号码文本和数组。 |
list[].sum | 开奖数字和值。 |
list[].actual_open_time | 实际开奖时间。 |
total / page / page_size | 分页信息。 |
/api/frontend/lottery/issues公开接口名:获取开奖历史
| 参数 | 必填 | 说明 |
|---|---|---|
lottery_id / lottery_key | 二选一 | 彩票 ID 或彩票标识。 |
status | 否 | drawn 已开奖,pending 待开奖,all 全部。 |
page / page_size | 否 | 页码和每页数量。 |
{
"code": 0,
"msg": "ok",
"data": {
"list": [
{
"expect": "202605133363",
"status": 1,
"opencode": "6,1,2",
"sum": 9
}
],
"total": 1,
"page": 1,
"page_size": 10,
"status": "drawn"
}
}
| 返回字段 | 说明 |
|---|---|
list | 开奖期号列表,字段同往期结果。 |
status | 本次查询使用的状态参数。 |
total / page / page_size | 分页信息。 |
/api/frontend/lottery/odds公开接口名:获取玩法赔率
| 参数 | 必填 | 说明 |
|---|---|---|
lottery_id / lottery_key | 二选一 | 彩票 ID 或彩票标识。 |
{
"code": 0,
"msg": "ok",
"data": {
"lottery_id": 1,
"lottery_key": "jsk3",
"list": [
{
"play_key": "big",
"type": "big",
"name": "大",
"odds": "1.98",
"status": 1
}
]
}
}
| 返回字段 | 说明 |
|---|---|
lottery_id / lottery_key | 彩票 ID 和标识。 |
list | 玩法赔率列表,字段同买入选项。 |
/api/frontend/lottery/orders需登录接口名:提交彩票投注
| 参数 | 必填 | 说明 |
|---|---|---|
lottery_id / lottery_key | 二选一 | 彩票 ID 或彩票标识。 |
plays | 是 | 玩法数组,例如 [{"type":"big","amount":"10"}]。 |
amount | 否 | 统一每注金额;当 plays[].amount 为空时使用。 |
expect | 是 | 当前期号;必须传 current_issue.expect,期号过期、已开奖或不是当前最近一期时会拒绝下注。 |
{
"code": 0,
"msg": "ok",
"data": {
"order_ids": [
101
],
"orders": [
{
"id": 101,
"lottery_id": 1,
"expect": "202605120001",
"play_key": "big",
"amount": "10.00",
"status_text": "待开奖"
}
],
"count": 1,
"total_amount": "10.00",
"balance_before": "100.00",
"balance_after": "90.00"
}
}
| 返回字段 | 说明 |
|---|---|
order_ids | 本次创建的投注订单 ID。 |
orders | 本次创建的订单列表。 |
orders[].expect | 本次投注期号。 |
orders[].play_key / play_name | 玩法标识和名称。 |
total_amount | 本次投注总金额。 |
balance_before / balance_after | 扣款前后余额。 |
/api/frontend/lottery/orders需登录接口名:我的投注记录
| 参数 | 必填 | 说明 |
|---|---|---|
lottery_id | 否 | 按彩票筛选。 |
status | 否 | pending 待开奖,won 已中奖,lost 未中奖,all 全部。 |
page / page_size | 否 | 页码和每页数量。 |
{
"code": 0,
"msg": "ok",
"data": {
"list": [
{
"id": 101,
"lottery_id": 1,
"expect": "202605120001",
"play_key": "big",
"amount": "10.00",
"profit": "9.80",
"status_text": "已中奖",
"issue": {
"expect": "202605120001",
"sum": 18
}
}
],
"total": 1,
"page": 1,
"page_size": 20
}
}
| 返回字段 | 说明 |
|---|---|
list | 投注记录列表。 |
list[].amount / odds / profit | 投注金额、赔率和结算盈亏。 |
list[].status / status_text | 状态和状态文案。 |
list[].issue | 对应期号和开奖结果。 |
total / page / page_size | 分页信息。 |
/api/frontend/lottery/orders/detail需登录接口名:彩票投注记录详情
返回当前登录用户某一条投注记录的详情,并把同彩票、同期号、同下单时间的多玩法订单聚合成一组,适合 H5 任务结果页。
| 参数 | 必填 | 说明 |
|---|---|---|
id / order_id | 二选一 | 投注订单 ID。 |
{
"code": 0,
"msg": "ok",
"data": {
"item": {
"order_id": 101,
"title": "活动三",
"expect": "202605135179",
"expect_text": "202605135179期",
"total_amount": "40.00",
"total_amount_text": "40积分",
"amount_label": "任务积分",
"settlement_status": 1,
"settlement_status_text": "礼品已完成",
"status": 1,
"status_text": "已中奖",
"order_content": "单,小,大,双",
"order_time": "2026-05-13 14:50:58"
},
"details": [
{
"content": "单",
"amount": "10.00",
"result_status": 2,
"result_text": "任务失败",
"time": "2026-05-13 14:55:01"
}
]
}
}
| 返回字段 | 说明 |
|---|---|
item | 详情页顶部和订单信息卡片。 |
item.total_amount_text | 积分展示文案,会根据请求头 lang 返回对应语言。 |
item.settlement_status_text | 结算状态文案,会根据请求头 lang 返回对应语言。 |
item.order_content | 本组投注内容,多个玩法用逗号分隔,会根据请求头 lang 返回对应语言。 |
details | 投注明细列表。 |
details[].content / amount | 玩法内容和投注金额,玩法内容会根据请求头 lang 返回对应语言。 |
details[].result_status / result_text | 结果状态和展示文案,展示文案会根据请求头 lang 返回对应语言。 |
details[].time | 结果时间;待开奖时返回下单时间。 |