增加支付功能

This commit is contained in:
2026-09-15 12:46:29 +08:00
parent 943c3708b0
commit a82b300b1a
46 changed files with 11675 additions and 21 deletions
+331
View File
@@ -0,0 +1,331 @@
import request from "@/utils/request";
/*************************************************
*************** 平台端支付模块接口 ***************
* 业务:平台向租户收取平台使用费,资金直接进平台对公账户;
* 不涉及退款流程(仅保留后台手动原路退回兜底);
* 推广佣金为平台自有资金支出,与收款解耦;不跨境。
*************************************************/
/**
* 支付模块接口前缀。
* 需求约定里接口写作 /api/payment/*、/api/commission/*,
* 但本项目平台端接口统一走 /platform 前缀(vite.config.js 的 dev 代理也只转发 /platform、/backend)。
* 若后端最终把支付路由挂在 /api 下,只需要改下面这两个常量。
*/
const PAY = "/platform/payment";
const COMMISSION = "/platform/commission";
/* ================= 支付单 ================= */
/**
* 创建支付单
* TODO: 后端实现 POST /api/payment/create
* 约定入参:{ out_trade_no, tenant_id, order_type, amount(分), channel, subject, return_url, client_ip }
* 约定返回:{ pay_no, channel, pay_params } pay_params 交给前端拉起渠道支付
* @param {Object} data 下单参数
* @returns {Promise}
*/
export function createPayment(data) {
return request({
url: `${PAY}/create`,
method: "post",
data,
});
}
/**
* 查询支付单(本地库)
* TODO: 后端实现 GET /api/payment/query/:payNo
* @param {string} payNo 支付单号
* @param {Object} [params] { sync: true } 时同步渠道最新状态后再返回
* @returns {Promise}
*/
export function queryPayment(payNo, params = {}) {
return request({
url: `${PAY}/query/${payNo}`,
method: "get",
params,
});
}
/**
* 手动原路退回(兜底,不做业务层退款流程)
* TODO: 后端实现 POST /api/payment/refund
* @param {Object} data { pay_no, amount(分), reason }
* @returns {Promise}
*/
export function refundPayment(data) {
return request({
url: `${PAY}/refund`,
method: "post",
data,
});
}
/**
* 支付单列表
* TODO: 后端实现 GET /api/payment/orders
* @param {Object} params { page, pageSize, tenant_id, channel, status, start_time, end_time }
* @returns {Promise}
*/
export function getOrders(params) {
return request({
url: `${PAY}/orders`,
method: "get",
params,
});
}
/**
* 支付单详情(含状态流转记录)
* TODO: 后端实现 GET /api/payment/orders/:payNo
* @param {string} payNo 支付单号
* @returns {Promise}
*/
export function getOrderDetail(payNo) {
return request({
url: `${PAY}/orders/${payNo}`,
method: "get",
});
}
/* ================= 渠道配置 ================= */
/**
* 渠道配置列表(首页概览用)
* TODO: 后端实现 GET /api/payment/channels
* @returns {Promise}
*/
export function getChannelList() {
return request({
url: `${PAY}/channels`,
method: "get",
});
}
/**
* 获取单个渠道配置
* TODO: 后端实现 GET /api/payment/channels/:channel
* 注意:敏感字段(密钥/私钥/Secret)后端只返回掩码,前端提交时掩码值应原样回传表示“不修改”
* @param {string} channel 渠道标识 wechat / alipay / unionpay / cloudpay / paypal
* @returns {Promise}
*/
export function getChannelConfig(channel) {
return request({
url: `${PAY}/channels/${channel}`,
method: "get",
});
}
/**
* 保存渠道配置
* TODO: 后端实现 POST /api/payment/channels/:channel
* @param {string} channel 渠道标识
* @param {Object} data 渠道参数
* @returns {Promise}
*/
export function saveChannelConfig(channel, data) {
return request({
url: `${PAY}/channels/${channel}`,
method: "post",
data,
});
}
/**
* 测试渠道连通性(校验参数 + 渠道鉴权)
* TODO: 后端实现 POST /api/payment/channels/:channel/test
* @param {string} channel 渠道标识
* @param {Object} [data] 未保存的参数可一并提交
* @returns {Promise}
*/
export function testChannelConnection(channel, data) {
return request({
url: `${PAY}/channels/${channel}/test`,
method: "post",
data,
});
}
/**
* 启用 / 停用渠道
* TODO: 后端实现 POST /api/payment/channels/:channel/status
* @param {string} channel 渠道标识
* @param {boolean} enabled 是否启用
* @returns {Promise}
*/
export function toggleChannel(channel, enabled) {
return request({
url: `${PAY}/channels/${channel}/status`,
method: "post",
data: { enabled },
});
}
/**
* 上传渠道证书(微信 apiclient_cert.pem / apiclient_key.pem、银联证书等)
* TODO: 后端实现 POST /api/payment/channels/:channel/certificate
* @param {string} channel 渠道标识
* @param {File} file 证书文件
* @param {string} [certType] 证书类型 cert / key
* @returns {Promise}
*/
export function uploadChannelCert(channel, file, certType = "cert") {
const formData = new FormData();
formData.append("file", file);
formData.append("cert_type", certType);
return request({
url: `${PAY}/channels/${channel}/certificate`,
method: "post",
data: formData,
timeout: 0,
});
}
/* ================= 推广佣金 ================= */
/**
* 佣金台账列表
* TODO: 后端实现 GET /api/commission/list
* @param {Object} params { page, pageSize, promoter, status, start_time, end_time }
* @returns {Promise}
*/
export function getCommissionList(params) {
return request({
url: `${COMMISSION}/list`,
method: "get",
params,
});
}
/**
* 佣金统计(应付总额 / 已付总额 / 待处理笔数)
* TODO: 后端实现 GET /api/commission/stats
* @param {Object} [params] 统计维度(时间范围等)
* @returns {Promise}
*/
export function getCommissionStats(params) {
return request({
url: `${COMMISSION}/stats`,
method: "get",
params,
});
}
/**
* 标记佣金已发放
* TODO: 后端实现 POST /api/commission/:id/pay
* @param {number|string} id 佣金单 id
* @param {Object} [data] { pay_method, remark }
* @returns {Promise}
*/
export function markCommissionPaid(id, data = {}) {
return request({
url: `${COMMISSION}/markPaid/${id}`,
method: "post",
data,
});
}
/**
* 佣金规则列表
* TODO: 后端实现 GET /api/commission/rules
* @param {Object} [params] { page, pageSize, keyword }
* @returns {Promise}
*/
export function getCommissionRules(params) {
return request({
url: `${COMMISSION}/rules`,
method: "get",
params,
});
}
/**
* 新增佣金规则
* TODO: 后端实现 POST /api/commission/rules
* @param {Object} data 规则数据
* @returns {Promise}
*/
export function saveCommissionRule(data) {
return request({
url: `${COMMISSION}/rules`,
method: "post",
data,
});
}
/**
* 更新佣金规则
* TODO: 后端实现 POST /api/commission/rules/:id
* @param {number|string} id 规则 id
* @param {Object} data 规则数据
* @returns {Promise}
*/
export function updateCommissionRule(id, data) {
return request({
url: `${COMMISSION}/rules/${id}`,
method: "post",
data,
});
}
/**
* 删除佣金规则
* TODO: 后端实现 DELETE /api/commission/rules/:id
* @param {number|string} id 规则 id
* @returns {Promise}
*/
export function deleteCommissionRule(id) {
return request({
url: `${COMMISSION}/rules/${id}`,
method: "delete",
});
}
/**
* 启用 / 停用佣金规则
* TODO: 后端实现 POST /api/commission/rules/:id/status
* @param {number|string} id 规则 id
* @param {number} status 1 启用 / 0 停用
* @returns {Promise}
*/
export function toggleCommissionRule(id, status) {
return request({
url: `${COMMISSION}/rules/${id}/status`,
method: "post",
data: { status },
});
}
/* ================= 对账 ================= */
/**
* 对账差异列表
* TODO: 后端实现 GET /api/payment/reconcile
* @param {Object} params { page, pageSize, channel, reconcile_date, diff_type, handle_status }
* @returns {Promise}
*/
export function getReconcileList(params) {
return request({
url: `${PAY}/reconcile`,
method: "get",
params,
});
}
/**
* 标记对账差异已处理
* TODO: 后端实现 POST /api/payment/reconcile/:id/handle
* @param {number|string} id 差异记录 id
* @param {Object} [data] { handle_type, remark }
* @returns {Promise}
*/
export function markReconcileHandled(id, data = {}) {
return request({
url: `${PAY}/reconcile/handle/${id}`,
method: "post",
data,
});
}