🏬 接入商城
{{ dash.merchants.total }}家
正常 {{ dash.merchants.active }} 家
🏬
🎯 总划拨额度
{{ fmt(dash.quota.total) }}算力
全网累计授予
🎯
📦 剩余额度
{{ fmt(dash.quota.remaining) }}
已消耗 {{ fmt(dash.quota.used) }}
📦
💰 累计手续费
{{ fmt(dash.feeTotal) }}算力
💳 在线支付 {{ fmt(dash.onlinePay && dash.onlinePay.totalFee) }} · {{ (dash.onlinePay && dash.onlinePay.totalCnt) || 0 }} 笔
💰
📈 今日划拨
{{ fmt(dash.today.amount) }}
{{ dash.today.count }} 笔 · 手续费 {{ fmt(dash.today.fee) }}
📈
👥 会员规模
{{ dash.users }}人
已获算力会员
👥
近 7 日划拨与手续费趋势
单位:算力
商城划拨排行 TOP5
最近划拨记录
| 时间 | 商城 | 会员 | 划拨算力 | 手续费 | 合计扣减 | 类型 | 状态 |
|---|---|---|---|---|---|---|---|
| {{ r.created_at }} | {{ r.merchant_name }} | {{ r.external_uid }} | {{ fmt(Math.abs(r.amount)) }} | {{ fmt(Math.abs(r.fee)) }} | {{ fmt(Math.abs(r.total_deduct)) }} | {{ r.type==='refund'?'退款':'划拨' }} | {{ r.status==='success'?'成功':'失败' }} |
| 暂无数据 | |||||||
商城列表(一对多密钥鉴权)
| ID | 商城名称 | AppID | API Key | 总划拨额度 | 剩余额度 | 已消耗 | 手续费比例 | 手续费收入 | 支付方式 | 状态 | 操作 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| {{ m.id }} | {{ m.name }} {{ m.contact || '—' }} |
{{ m.app_id }} | {{ m.api_key }} | {{ fmt(m.total_quota) }} | {{ fmt(m.remaining_quota) }} | {{ fmt(m.used_quota) }} | {{ (m.fee_rate*100).toFixed(1) }}% | {{ fmt(m.fee_income) }} | {{ m.fee_pay_mode==='online'?'💳 在线支付':'📦 额度内扣' }} | {{ m.status==='active'?'正常':'停用' }} | |
| 暂无商城,点击右上角接入新商城 | |||||||||||
共 {{ merchants.total }} 条
{{ merchants.page }} / {{ Math.max(1,Math.ceil(merchants.total/merchants.size)) }}
划拨流水(全平台)
手续费 = 划拨算力 × 商城费率,与划拨量一并从商城额度扣减
| 时间 | 平台流水号 | 商城单号 | 商城 | 会员 | 划拨算力 | 手续费 | 合计扣减 | 费率 | 用户余额 | 状态 |
|---|---|---|---|---|---|---|---|---|---|---|
| {{ r.created_at }} | {{ r.trade_no }} | {{ r.out_trade_no }} | {{ r.merchant_name }} | {{ r.external_uid }} | {{ fmt(r.amount) }} | {{ fmt(r.fee) }} | {{ fmt(r.total_deduct) }} | {{ (r.fee_rate*100).toFixed(1) }}% | {{ r.balance_after===null?'—':fmt(r.balance_after) }} |
{{ r.status==='failed'?'失败':(r.type==='refund'?'已退款':'成功') }}
{{ r.fail_reason }}
|
| 暂无数据 | ||||||||||
共 {{ allocations.total }} 条
{{ allocations.page }} / {{ Math.max(1,Math.ceil(allocations.total/allocations.size)) }}
💰 平台累计手续费收入
{{ fmt(fee.sum_fee) }}算力
来自 {{ fee.total }} 笔划拨
💰
🏬 贡献商城
{{ fee.by_merchant.length }}家
按收入排序
🏬
📊 平均单笔手续费
{{ fee.total? fmt(fee.sum_fee/fee.total):'0.00' }}
全平台均值
📊
各商城手续费贡献
| 商城 | 手续费收入 | 划拨笔数 | 占比 |
|---|---|---|---|
| {{ b.name }} | {{ fmt(b.fee) }} | {{ b.cnt }} | |
| 暂无数据 | |||
手续费来源构成
| 来源 | 手续费收入 | 笔数 | 占比 |
|---|---|---|---|
| {{ s.src==='online'?'💳 在线支付通道':'📦 额度内扣费' }} | {{ fmt(s.fee) }} | {{ s.cnt }} | |
| 暂无数据 | |||
手续费明细
| 时间 | 商城 | 平台流水号 | 商城单号 | 划拨算力 | 费率 | 来源 | 手续费收入 |
|---|---|---|---|---|---|---|---|
| {{ r.created_at }} | {{ r.merchant_name }} | {{ r.trade_no }} | {{ r.out_trade_no }} | {{ fmt(r.amount) }} | {{ (r.fee_rate*100).toFixed(1) }}% | {{ r.fee_source==='online'?'在线支付':'额度扣费' }} | {{ fmt(r.fee) }} |
| 暂无数据 | |||||||
共 {{ fee.total }} 条
{{ fee.page }} / {{ Math.max(1,Math.ceil(fee.total/fee.size)) }}
支付通道说明:商城的「手续费支付方式」设为
内置
在线支付 后,商城发起划拨将生成手续费支付单并返回收银台链接,
支付成功后划拨自动生效(额度只扣划拨量,手续费经通道实收)。内置
mock 模拟通道(收银台直接确认支付);微信支付 APIv3 与 支付宝
真实通道已全部接通,填写商户参数后即可启用——启用前会自动校验配置完整性,建议再点「连通检测」验证与网关的签名交互。
支付通道({{ payConfigs.length }} 个)
| 通道名称 | 类型 | 网关 | 商户号 / AppID | 密钥配置 | 通道费率 | 已收手续费 | 成交笔数 | 状态 | 操作 |
|---|---|---|---|---|---|---|---|---|---|
| {{ c.name }}
{{ c.remark }} |
{{ channelName(c.channel) }} | {{ c.gateway || '—' }} |
{{ c.merchant_no || '—' }} {{ c.app_id || '—' }} |
无需密钥
密钥:{{ c.api_key_masked || '未配置' }}
私钥:{{ c.has_private_key ? '已配置' : '未配置' }}
· 证书/公钥:{{ c.has_peer_cert ? '已配置' : '未配置' }}
AppSecret:{{ c.has_app_secret ? '已配置' : '未配置' }}
(JSAPI 需)
支付方式:{{ payModeLabel(c) }}
|
{{ (c.fee_rate*100).toFixed(2) }}% | {{ fmt(c.paid_sum) }} | {{ c.usage_count }} |
{{ c.status==='active'?'启用':'停用' }}
{{ c.config_ok ? '配置完整' : '配置待完善' }}
|
|
| 暂无支付通道 | |||||||||
🧾 支付单总数
{{ payOrders.total }}笔
🧾
✅ 已支付
{{ payOrders.paid_cnt }}笔
✅
💰 在线通道实收手续费
{{ fmt(payOrders.paid_fee) }}算力
💰
手续费支付订单
商城发起划拨 → 生成待支付手续费单 → 收银台/通道支付成功 → 划拨自动生效
| 时间 | 支付单号 | 商城 | 商城单号 | 会员 | 划拨算力 | 手续费 | 支付通道 | 状态 | 支付时间 | 通道流水号 | 划拨流水号 | 操作 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| {{ o.created_at }} | {{ o.fee_order_no }} | {{ o.merchant_name }} | {{ o.out_trade_no }} | {{ o.external_uid }} | {{ fmt(o.amount) }} | {{ fmt(o.fee) }} | {{ channelName(o.channel) }}
{{ o.pay_mode }} |
{{ o.status==='paid'?'已支付':(o.status==='pending'?'待支付':'已关闭') }}
{{ o.remark }} |
{{ o.pay_time || '—' }} | {{ o.channel_trade_no || '—' }} | {{ o.allocation_trade_no || '—' }} | 收银台 |
| 暂无支付订单 | ||||||||||||
共 {{ payOrders.total }} 条
{{ payOrders.page }} / {{ Math.max(1,Math.ceil(payOrders.total/payOrders.size)) }}
商城会员算力余额
| 会员ID | 所属商城 | 当前算力余额 | 累计获得 | 更新时间 |
|---|---|---|---|---|
| {{ u.external_uid }} | {{ u.merchant_name }} | {{ fmt(u.balance) }} | {{ fmt(u.total_received) }} | {{ u.updated_at }} |
| 暂无数据 | ||||
共 {{ users.total }} 条
{{ users.page }} / {{ Math.max(1,Math.ceil(users.total/users.size)) }}
开放 API 调用日志
用于对账追溯与故障排查
| 时间 | 商城 | 方法 | 接口 | 耗时 | 结果码 | IP |
|---|---|---|---|---|---|---|
| {{ l.created_at }} | {{ l.merchant_name || '未鉴权' }} | {{ l.method }} | {{ l.path }} | {{ l.duration_ms }}ms | {{ l.code===null?'—':l.code }} | {{ l.ip }} |
| 暂无日志 | ||||||
共 {{ logs.total }} 条
{{ logs.page }} / {{ Math.max(1,Math.ceil(logs.total/logs.size)) }}
商城接入流程
1. 平台在「商城管理」中接入商城,系统自动生成
2. 平台为商城设置 算力划拨额度 与 手续费比例;
3. 商城服务端使用密钥对请求签名,调用开放 API:
①
②
③
④
⑤
⑥
api_key 与 api_secret(一对多:每个商城独立密钥);2. 平台为商城设置 算力划拨额度 与 手续费比例;
3. 商城服务端使用密钥对请求签名,调用开放 API:
①
POST /openapi/v1/allocation/create 为用户划拨算力 —— 先支付手续费,支付成功划拨才生效;②
GET /openapi/v1/account/summary 查询总额度 / 剩余额度 / 手续费比例 / 累计手续费;③
GET /openapi/v1/account/fee-details 手续费明细;④
GET /openapi/v1/reconcile/daily 日对账;⑤
GET /openapi/v1/allocation/list / query 流水与补单查询;⑥
POST /openapi/v1/allocation/refund 退款冲正。
① 鉴权规则(HMAC-SHA256 签名)
| Header | 说明 | 示例 |
|---|---|---|
| X-Api-Key | 商城 API Key | ak_star9f2e8d41c7 |
| X-Timestamp | 毫秒时间戳,±5 分钟有效 | 1791248218212 |
| X-Nonce | 随机串,5 分钟内不可重复(防重放) | a3f9c2e8b1d4 |
| X-Sign | HMAC-SHA256 签名(hex) | 见下方算法 |
签名算法:待签名串 =
METHOD + "\n" + timestamp + "\n" + nonce + "\n" + md5(body),
X-Sign = HMAC-SHA256(api_secret, 待签名串).hex;GET 请求 body 视为空串。// Node.js 签名示例
const crypto = require('node:crypto');
const bodyHash = crypto.createHash('md5').update(bodyStr || '').digest('hex');
const signStr = [method.toUpperCase(), timestamp, nonce, bodyHash].join('\n');
const sign = crypto.createHmac('sha256', apiSecret).update(signStr).digest('hex');
② 划拨算力POST /openapi/v1/allocation/create
请求体:
{
"out_trade_no": "ORDER20261006001", // 商城侧单号,全局唯一,幂等键
"user_id": "u_10001", // 商城侧会员ID
"amount": 100, // 划拨算力(≤2位小数)
"remark": "赠送算力"
}
成功返回:手续费
fee = amount × fee_rate,与划拨量一并从商城剩余额度扣减;
余额或额度不足时返回业务码 2004 且不划拨。{
"code": 0, "message": "success",
"data": {
"trade_no": "TF17912482182123180BB", // 平台流水号
"out_trade_no": "ORDER20261006001",
"amount": 100, "fee": 5, "fee_rate": 0.05,
"total_deduct": 105, // 商城额度合计扣减
"user_balance": 100, // 会员划拨后余额
"remaining_quota": 87883.48 // 商城剩余额度
}
}
③ 其他接口一览
| 接口 | 方法 | 说明 |
|---|---|---|
| /openapi/v1/account/summary | GET | 总额度、已用额度、剩余额度、手续费比例、累计手续费 |
| /openapi/v1/account/fee-details | GET | 手续费明细(分页) |
| /openapi/v1/allocation/list | GET | 划拨流水(可按类型 / 日期筛选) |
| /openapi/v1/allocation/query | GET | 单笔查询(对账补单) |
| /openapi/v1/user/balance | GET | 会员算力余额 |
| /openapi/v1/reconcile/daily | GET | 日对账(成功 / 退款 / 失败汇总) |
| /openapi/v1/allocation/refund | POST | 退款冲正(回补额度与手续费) |
④ 在线支付手续费(收银台)
商城将
fee_pay_mode 设为 online 后,allocation/create 不再直接划拨,
而是返回 need_pay: true 与收银台链接;用户在平台收银台完成支付后,划拨自动生效。
// 划拨返回(在线支付模式)
{
"code": 0,
"data": {
"need_pay": true, // 需先支付手续费
"fee_order_no": "FP1791248218212A1B2C3", // 平台手续费支付单号
"amount": 200, "fee": 6, "fee_rate": 0.03,
"pay_channel": "wechat", "pay_mode": "native", "pay_status": "pending",
"prepay": { "type": "qrcode", "url": "weixin://wxpay/bizpayurl?pr=xxx" },
"pay_url": "/checkout.html?fee_order_no=FP1791..." // 收银台地址
}
}
收银台接口(平台内实现,无需商城签名):
可选参数:
异步通知:真实通道支付结果由通道服务器回调
GET /pay/api/order?fee_order_no=... —— 查询支付单状态与支付参数(二维码 / 跳转链接 / JSAPI 参数)GET /pay/api/sync?fee_order_no=... —— 主动查单同步(真实通道会向支付网关查询)POST /pay/api/confirm —— {"fee_order_no": "..."},
仅模拟通道(mock)可直接确认支付,成功后划拨立即生效(幂等)可选参数:
pay_channel 指定支付通道(wechat / alipay / mock),
不传则真实通道优先、模拟通道兜底异步通知:真实通道支付结果由通道服务器回调
/pay/notify/wechat、
/pay/notify/alipay(平台自动验签解密并入账),商城无需处理
⑤ 错误码
| code | 说明 |
|---|---|
| 1001-1007 | 鉴权类:缺头 / 时间戳错误 / 时间戳过期 / nonce 重放 / api_key 无效 / 商城停用 / 签名错误 |
| 2001 | 单号曾划拨失败,请更换单号 |
| 2002 | 划拨算力必须大于 0 |
| 2003 | 划拨算力最多 2 位小数 |
| 2004 | 剩余划拨额度不足(需支付划拨量 + 手续费) |
| 2009 / 2010 | 流水不存在 / user_id 必填 |
| 2101-2103 | 退款:原单不存在 / 重复退款 / 用户余额不足 |
| 2210-2215 | 支付单:缺少参数 / 不存在 / 状态不可支付 / 额度不足已关闭 / 通道不支持直接确认 / 已支付不可关闭 |