增加支付功能
This commit is contained in:
@@ -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,
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user