Files
yunzerwebsiteallinone/platform/src/api/payment.js
T
2026-09-15 12:46:29 +08:00

332 lines
8.3 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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,
});
}